diff options
Diffstat (limited to 'samples/Prolog/turing.pl')
| -rw-r--r-- | samples/Prolog/turing.pl | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/samples/Prolog/turing.pl b/samples/Prolog/turing.pl new file mode 100644 index 0000000..82fe104 --- /dev/null +++ b/samples/Prolog/turing.pl @@ -0,0 +1,21 @@ +turing(Tape0, Tape) :- + perform(q0, [], Ls, Tape0, Rs), + reverse(Ls, Ls1), + append(Ls1, Rs, Tape). + +perform(qf, Ls, Ls, Rs, Rs) :- !. +perform(Q0, Ls0, Ls, Rs0, Rs) :- + symbol(Rs0, Sym, RsRest), + once(rule(Q0, Sym, Q1, NewSym, Action)), + action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1), + perform(Q1, Ls1, Ls, Rs1, Rs). + +symbol([], b, []). +symbol([Sym|Rs], Sym, Rs). + +action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs). +action(stay, Ls, Ls, Rs, Rs). +action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs). + +left([], [], Rs0, [b|Rs0]). +left([L|Ls], Ls, Rs, [L|Rs]). |
