alan :- intape(Is), ( Is = [I|IRest] -> perform(q0, [], Ls, [I], Rs, IRest, _) ; perform(q0, [], Ls, [b], Rs, [], _) ), reverse(Ls, Ls1), append(Ls1, Rs, Band), maplist(write, Band). perform(qf, Ls, Ls, Rs, Rs, I, I) :- !. perform(Q0, Ls0, Ls, [R|Rs0], Rs, I0, I) :- rule(Q0, R, Q1, Sym, Action), !, % let's hope the TM is deterministic action(Action, Ls0, Ls1, [Sym|Rs0], Rs1, I0, I1), perform(Q1, Ls1, Ls, Rs1, Rs, I1, I). action(left, Ls0, Ls, Rs0, Rs, I, I) :- ( Ls0 = [] -> Ls = [], Rs = [b|Rs0] ; Ls0 = [L|Ls], Rs = [L|Rs0] ). action(stay, Ls, Ls, Rs, Rs, I, I). action(right, Ls0, [Sym|Ls0], [Sym|Rest], Rs, I0, I) :- ( Rest = [] -> ( I0 = [FI|I0Rest] -> Rs = [FI], I = I0Rest ; Rs = [b], I = [] ) ; Rs = Rest ).