id = 178 group = 'denotational_semantics' number = 85 visible = True 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. '''