aboutsummaryrefslogtreecommitdiff
path: root/samples/Prolog/turing.pl
diff options
context:
space:
mode:
Diffstat (limited to 'samples/Prolog/turing.pl')
-rw-r--r--samples/Prolog/turing.pl21
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]).