1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
id = 178
number = 85
visible = False
facts = None
solution = '''\
algol_for(fun(S0,S,apply178([printout=[]|S0],S,Minstructs))) -->
[begin], instructs178(Minstructs), [end].
instructs178(Minstr) --> instr178(Minstr).
instructs178(fun(S0,S,
(apply178(S0,S1,Minstr),
apply178(S1,S,Minstructs))))
-->
instr178(Minstr), instructs178(Minstructs).
instr178(Massign) --> assign178(Massign).
instr178(fun(S0,[printout = L1|S1],
(memb(X = V,S0),
del(printout = L0,S0,S1),
conc(L0,[V],L1))))
-->
[print(X)].
instr178(fun(S0,S,
loop178(S0,Mcond,Minstructs,S)))
-->
[while], cond178(Mcond), [do,begin], instructs178(Minstructs), [end].
instr178(fun(S0, S,
(apply178(S0, S1, Minit),
for178(S1, Mcond, Mstep, Mbody, S))))
-->
[for], assign178(Minit), [&], cond178(Mcond), [&], assign178(Mstep), [do, begin], instructs178(Mbody), [end].
assign178(fun(S0,[X = Value|S1],
(apply178(S0,Value,Mexpr),
del(X = _,S0,S1))))
-->
var178(X), [:=], expr178(Mexpr).
cond178( fun( S, TruthVal,
(apply178(S,Val1,ME1),
apply178(S,Val2,ME2),
(Val1 < Val2,!,TruthVal = true ; TruthVal = false))))
-->
expr178(ME1), [<], expr178(ME2).
var178(X) --> [X], {atom(X)}.
expr178(fun(S,Value,eval(Expr,S,Value))) -->
[Expr].
apply178(In, Out, fun(In, Out, Goals)) :-
call(Goals).
loop178( State0, Mcond, _, State0) :-
apply178( State0, false, Mcond), !.
loop178( S0, Mcond, MBody, S) :-
copy_term( MBody, MBodyCopy),
apply178( S0, S1, MBody),
loop178( S1, Mcond, MBodyCopy, S).
for178(S0, Mcond, _, _, S0) :-
apply178(S0, false, Mcond), !.
for178(S0, Mcond, Mstep, Mbody, S) :-
copy_term(Mbody, Mbody2),
copy_term(Mstep, Mstep2),
apply178(S0, S1, Mbody),
apply178(S1, S2, Mstep),
for178(S2, Mcond, Mstep2, Mbody2, S).
eval178( N, _, N) :-
number178( N), !.
eval178( X, State, Val) :- % A program variable
atom( X), !,
memb( X = Val, State).
eval178( E1 + E2, State, Val) :- !,
eval178( E1, State, V1),
eval178( E2, State, V2),
Val is V1 + V2.
eval178( E1 - E2, State, Val) :- !,
eval178( E1, State, V1),
eval178( E2, State, V2),
Val is V1 - V2.
eval178( E1 * E2, State, Val) :- !,
eval178( E1, State, V1),
eval178( E2, State, V2),
Val is V1 * V2.
eval178( E1 / E2, State, Val) :- !,
eval178( E1, State, V1),
eval178( E2, State, V2),
Val is V1 / V2.
'''
|