Turingovy stroje v prikladech (Prolog)
- Definice (Turinguv stroj):
- Turinguv stroj je petice (Q,A,d,q,F), kde:
- - Q je konecna mnozina stavu (vnitrni abeceda)
- - A je (vnejsi) abeceda (konecna mnozina pismen)
- - q je pocatecni stav (prvek mnoziny Q)
- - F je mnozina koncovych stavu (podmnozina mnoziny Q)
- - d je prechodova posloupnost (Q-F) x (A+{free}) -> Q x (A+{free})
x {L,N,R}
- (free je specialni znak urcujici prazdne policko na pasce).
-
- Práce Turingova stroje
- Na pasce je v jednotlivych polickach napsane nejake slovo (ostatni
policka jsou prazdna, tj. obsahuji znak free). K jednomu policku pasky
je prilozena cteci/zapisovaci hlava.
- Podle cteneho pismene a vnitrniho stavu se ridici jednotka "rozhodne"
o tom, jake pismeno na pasku napise, do jakeho dalsiho vnitrniho stavu
prejde a zda se cteci hlava posune o jedno policko vlevo, vpravo nebo zustane
na miste (to je dano "instrukcemi" prechodove posloupnosti).
- Prace Turingova stroje konci ve chvili, kdy nelze pouzit zadnou dalsi
instrukci (tj., kdyz je ridici jednotka v koncovem stavu).
Nasledujici program v Prologu je emulatorem Turingova
stroje. Turinguv stroj se pro tento emulator zadava sadou instrukci ve tvaru
c(Stav,CtenePismeno,NovyStav,ZapisovanePismeno,Posun) a fakty urcujicimi
koncove stavy f(KoncovyStav) (viz Priklady).
Paska je reprezentovana dvojici seznamu Left-Right, pricemz
hlava cte prvni pismeno seznamu Left. Napriklad paska |a|b|c|d|,
kde hlava je na pismenu c vypada takto [c,b,a]-[d] (leva
cast pasky je tedy zadana v obracenem poradi a nikdy nesmi byt prazdna).
Program se spousti prikazem ?-turing(q0,PocatecniKonfigurace,KoncovaKonfigurace)
, kde q0 je pocatecni stav a PocatecniKonfigurace je zadani
pasky na vstupu. Vysledkem behu programu je koncovy stav pasky KoncovaKonfigurace.
Chcete-li se o programovacim jazyku Prolog dozvedet vice, podivejte se
na stranky Interactive Prolog Guide.
- turing(State,[Letter|Left]-Right,FinalTape):-
- c(State,Letter,NewState,Write,Move),
- move(Move,[Write|Left]-Right,NewTape),
- turing(NewState,NewTape,FinalTape).
- turing(State,Tape,Tape):-
- f(State).
-
- move(none,Tape,Tape).
- move(left,[X|Left]-Right,NewLeft-NewRight):-
- (Left=[] -> NewLeft=[free] ; NewLeft=Left),
- (Right=[free] -> NewRight=[X] ; NewRight=[X|Right]).
- move(right,Left-[X|Right],NewLeft-Right):-
- Left=[free] -> NewLeft=[X] ; NewLeft=[X|Left].
- move(right,Left-[],NewLeft-[]):-
- Left=[free] -> NewLeft=Left ; NewLeft=[free|Left].
Jedná se samozrejme jen o kostru emulatoru, kterou lze dale rozsirovat.
Lze napriklad vypisovat stav pasky po kazdem kroku nebo pridat ladici prostredi
umoznujici krokovat provadeni "programu" pro Turinguv stroj.
Nezapomente se podivat na stranku,
kde jsou uvedeny priklady programu pro tento emulator.
Last update 6th
October 1997
Designed and maintained by Roman Bartak
© October 1997