% Logik og sprog, Modul 2, datalogi RUC Henning Christiansen % % % Turing-maskiner i Prolog - udvidet med en tracerfacilitet % kapitel 10 i "Sprog og abstrakte maskiner" % % (c) 2000, Henning Christiansen % NB: Denne fil definerer en fortolker for Turing maskiner, der er % reprūsenteret ved prūdikater t/5, start/1 og slut/1. % % Se eksempler i filerne TuringCount.txt og TuringMultiply.txt % som skal consultes efter nūrvūrende fil. % En udvidelse af vor Turing-maskine-fortolker, % saa den skriver akuel tilstand og baand ud undervejs. % Ellers koerer den paa praecis samme maade. koer( StartBaand, Slutbaand):- start(Q), testudskrift(Q, StartBaand), koer( StartBaand, Q, Slutbaand, _). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % koer( baand-foer, tilstand-foer, baand-efter, tilstand-efter) % Vi er naaet til en sluttilstand: koer( Baand, Q, Baand, Q):- slut(Q),!. koer( BaandFoer, Qfoer, BaandStop, QStop):- laes(BaandFoer, AktueltTegn), t(Qfoer, AktueltTegn, Qefter, NytTegn, Retning), skriv( NytTegn, BaandFoer, BaandMellem ), ryk(Retning, BaandMellem, BaandEfter), testudskrift(Qefter, BaandEfter), koer( BaandEfter, Qefter, BaandStop, QStop). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Testudskrift % testudskrift(Tilstand, Baand):- !, write( Tilstand), write(': '), skriv_baandet_paent(Baand), nl. skriv_baandet_paent(tape(Venstre, Fokus, Hoejre)):- skriv_venstre_baand_paent(Venstre), write('('), write(Fokus), write('), '), skriv_hoejre_baand_paent(Hoejre). skriv_venstre_baand_paent('...'):- !, write('..., '). skriv_venstre_baand_paent([T|L]):- skriv_venstre_baand_paent(L), write(T), write(', '). skriv_hoejre_baand_paent('...'):- !, write('...'). % laes( , ) laes( tape(_, T, _), T). % skriv( , , ) skriv( T, tape(V_er, _, H_er), tape(V_er, T, H_er)). % liste( , , ) liste( ' ', '...', '...'):- !. liste( Ho, Ha, [Ho | Ha]). % ryk( , , ) ryk(---, B, B). ryk(-->, tape( V_er1, F1, H_er1), tape( V_er2, F2, H_er2) ):- liste(F1, V_er1, V_er2), liste(F2, H_er2, H_er1). ryk(<--, tape( V_er1, F1, H_er1), tape( V_er2, F2, H_er2) ):- liste(F2, V_er2, V_er1), liste(F1, H_er1, H_er2). skriv_hoejre_baand_paent([T|L]):- write(T), write(', '), skriv_hoejre_baand_paent(L).