13
Сошников Дмитрий Валерьевич к.ф.-м.н., доцент [email protected] Факультет инноваций и высоких технологий Московский физико-технический институт

Функциональное программирование

  • Upload
    louis

  • View
    59

  • Download
    1

Embed Size (px)

DESCRIPTION

Функциональное программирование. Факультет инноваций и высоких технологий Московский физико-технический институт. Лекция 20. Пример: реализация машины Тьюринга. Интересное упражнение. Реализуем Машину Тьюринга на функциональном языке MT = , где - PowerPoint PPT Presentation

Citation preview

Page 1: Функциональное программирование

Сошников Дмитрий Валерьевич

к.ф.-м.н., доцент[email protected]

Факультет инноваций и высоких технологий

Московский физико-технический институт

Page 2: Функциональное программирование

Лекция 20

Пример: реализация машины Тьюринга

Page 3: Функциональное программирование

3

©20

08 С

ошни

ков

Д.В

.

Реализуем Машину Тьюринга на функциональном языке

MT = <A,S,P,L,s0>, где A - алфавит (мы предполагаем char) S - множество состояний (int) L – полубесконечная лента с текущей ячейкой (n(int→A)) s0S – начальное состояние (0) P – программа, состоящая из <s,c,c’,s’,a>

▪ s,c – состояние + видимый символ, определяет выполняемую команду

▪ c‘ – новый символ, записываемый вместо старого▪ s‘ – новое состояние, в которое переходит машина▪ a – действие (L,R – сдвиг влево-вправо; U – на месте; H-

останов)

Page 4: Функциональное программирование

4

©20

08 С

ошни

ков

Д.В

.

Page 5: Функциональное программирование

5

©20

08 С

ошни

ков

Д.В

.

type state = int*int;;type base = char;;type ribbon = int -> base;;type op = L | R | U | H;;type instr = state * base * base * state * op;;type program = instr list;;

type MT = program * state * ribbon;;

Page 6: Функциональное программирование

6

©20

08 С

ошни

ков

Д.В

.

let step (P,(sym,st),rib) = let s = rib sym in let (_,_,nchr,nst,cmd) = List.find(fun (q,c,_,_,_) -> (q=st)&&(c=s)) P in let nsym = proc sym cmd in (P,(nsym,nst),ins nchr sym rib);;

let proc n = function R -> n+1 | L -> n-1 | U -> n | H -> -1;;

let ins c n rib = fun x -> if n=x then c else rib x;;

let empty = fun x -> ' ';;

Page 7: Функциональное программирование

7

©20

08 С

ошни

ков

Д.В

.

let terminal MT = match MT with (_,(n,_),_) when n<0 -> true | _ -> false;;

let rec run MT = if terminal MT then MT else let n = step MT in let _ = print n in run (n);;

let print (P,(sym,st),rib) = let aux n i (c:char) = if i=n then "["+c.ToString()+"]" else c.ToString() in printfn "q=%2d, p=%2d %s" st sym ([ for i in 0..10 -> aux sym i (rib i) ] |> List.fold_left(fun ac c -> ac+c) "");;

let mkrib (s:string) = let rec f n = function [] -> empty | h::t -> ins h n (f (n+1) t) in s.ToCharArray() |> List.of_array |> (f 0);;

Page 8: Функциональное программирование

8

©20

08 С

ошни

ков

Д.В

.

Проделанное упражнение доказывает, что любая вычислимая по Тьюрингу функция вычислима в λ-исчислении Поскольку мы нигде не использовали

конечность ленты

Page 9: Функциональное программирование

9

©20

08 С

ошни

ков

Д.В

.

В приведенной реализации по ходу выполнения растет сложность доступа к ленте

Возможно использование более эффективных структур: Массив с произвольным доступом (F#) Дерево Зиппер (2 списка – левая и правая

полулента)

Page 10: Функциональное программирование

10

©20

08 С

ошни

ков

Д.В

.

type 'a zipper = 'a list * 'a list;;

let left (l,r) = match l with [] -> ([],' '::r) | x::t -> (t,x::r);;

let right (l,r) = match r with [] -> (' '::l,[]) | x::t -> (x::l,t);;

let norm (l,r) = match r with [] -> (l,[' ']) | _ -> (l,r);;

A B C D E F ……

([’C’;’B’;’A’],[’D’;’E’;’F’])

Page 11: Функциональное программирование

11

©20

08 С

ошни

ков

Д.В

.

let step (P,st,rib) = let (l,x::r) = norm rib in let (_,_,nchr,nst,cmd) = List.find(fun (q,c,_,_,_) -> (q=st)&&(c=x)) P in let nrib = proc (l,nchr::r) cmd in (P,nst,nrib);;

let proc n = function R -> right n | L -> left n | U -> n | H -> ([],[]);;

Page 12: Функциональное программирование

12

©20

08 С

ошни

ков

Д.В

.

Для функционального программирования характерны специфические структуры данных Из-за отсутствия памяти с «прямым»

доступом Из-за того, что в идеале все

структуры immutableОкасаки, Purely Functional Data

Structures

Page 13: Функциональное программирование

13