summaryrefslogtreecommitdiff
path: root/prolog/problems/algol/algol_3
diff options
context:
space:
mode:
Diffstat (limited to 'prolog/problems/algol/algol_3')
-rw-r--r--prolog/problems/algol/algol_3/common.py78
-rw-r--r--prolog/problems/algol/algol_3/en.py32
2 files changed, 110 insertions, 0 deletions
diff --git a/prolog/problems/algol/algol_3/common.py b/prolog/problems/algol/algol_3/common.py
new file mode 100644
index 0000000..415e1e5
--- /dev/null
+++ b/prolog/problems/algol/algol_3/common.py
@@ -0,0 +1,78 @@
+id = 176
+number = 10
+visible = False
+facts = None
+
+solution = '''\
+algol(fun(S0,S,apply176([printout=[]|S0],S,Minstructs))) -->
+ [begin], instructs176(Minstructs), [end].
+
+instructs176(Minstr) --> instr176(Minstr).
+instructs176(fun(S0,S,
+ (apply176(S0,S1,Minstr),
+ apply176(S1,S,Minstructs))))
+ -->
+ instr176(Minstr), instructs176(Minstructs).
+
+instr176(Massign) --> assign176(Massign).
+instr176(fun(S0,[printout = L1|S1],
+ (memb(X = V,S0),
+ del(printout = L0,S0,S1),
+ conc(L0,[V],L1))))
+ -->
+ [print(X)].
+instr176(fun(S0,S,
+ loop176(S0,Mcond,Minstructs,S)))
+ -->
+ [while], cond176(Mcond), [do,begin], instructs176(Minstructs), [end].
+
+assign176(fun(S0,[X = Value|S1],
+ (apply176(S0,Value,Mexpr),
+ del(X = _,S0,S1))))
+ -->
+ var176(X), [:=], expr176(Mexpr).
+
+cond176( fun( S, TruthVal,
+ (apply176(S,Val1,ME1),
+ apply176(S,Val2,ME2),
+ (Val1 < Val2,!,TruthVal = true ; TruthVal = false))))
+ -->
+ expr176(ME1), [<], expr176(ME2).
+
+var176(X) --> [X], {atom(X)}.
+
+expr176(fun(S,Value,eval(Expr,S,Value))) -->
+ [Expr].
+
+apply176(In, Out, fun(In, Out, Goals)) :-
+ call(Goals).
+
+loop176(State0, Mcond, _, State0) :-
+ apply176( State0, false, Mcond), !.
+loop176(S0, Mcond, MBody, S) :-
+ copy_term( MBody, MBodyCopy),
+ apply176( S0, S1, MBody),
+ loop176( S1, Mcond, MBodyCopy, S).
+
+eval176(N, _, N) :-
+ number176( N), !.
+eval176(X, State, Val) :- % A program variable
+ atom(X), !,
+ memb(X = Val, State).
+eval176(E1 + E2, State, Val) :- !,
+ eval176(E1, State, V1),
+ eval176(E2, State, V2),
+ Val is V1 + V2.
+eval176(E1 - E2, State, Val) :- !,
+ eval176(E1, State, V1),
+ eval176(E2, State, V2),
+ Val is V1 - V2.
+eval176(E1 * E2, State, Val) :- !,
+ eval176(E1, State, V1),
+ eval176(E2, State, V2),
+ Val is V1 * V2.
+eval176(E1 / E2, State, Val) :- !,
+ eval176(E1, State, V1),
+ eval176(E2, State, V2),
+ Val is V1 / V2.
+'''
diff --git a/prolog/problems/algol/algol_3/en.py b/prolog/problems/algol/algol_3/en.py
new file mode 100644
index 0000000..3b91a47
--- /dev/null
+++ b/prolog/problems/algol/algol_3/en.py
@@ -0,0 +1,32 @@
+name = 'algol/3'
+slug = 'interpreter for mini-algol'
+
+description = '''\
+<p>A DCG for mini-algol.</p>
+<pre>
+% apply a function to a starting state
+?- apply([a=2], Out, fun(_In, Out, eval(a+3, _In, Out))).
+ Out = 5.
+
+% a := a+b
+% b := a-b
+% a := a-b
+?- _Program = [begin,a,:=,a+b,b,:=,a-b,a,:=,a-b,end],
+ algol(_F, _Program, []),
+ apply([a=3,b=5], Output, _F).
+ Output = [a=5,b=3,printout=[]].
+
+% a := 0
+% while a < 10 do
+% begin
+% print(a)
+% a := a+1
+% end
+?- _Program = [begin,a,:=,0,while,a,<,10,do,begin,print(a),a,:=,a+1,end,end],
+ algol(_F, _Program, []),
+ apply([a=3], Output, _F).
+ Output = [a=10,printout=[0,1,2,3,4,5,6,7,8,9]].
+</pre>
+'''
+
+hint = {}