:- op(300,xf,?). begin:- asserta(definition(X,X)), asserta(definition((P;Q),[P, or, Q])), asserta(definition((P:-Q), [P, if, Q])), asserta(definition((P,Q), [P, and, Q])), prompt(Old, 'Prolog: '), repeat,nl,nl,read(T), (T=stop; process(T), fail). process(T-D) :- !, asserta(definition(T,D)). process([T1|T2]?) :- retrovert(T,[T1|T2]), !, nl, write(T). process(T) :- translate(T,D), nl, output(D), !. process(_) :- nl, write('*** untranslatable ***'), nl. retrovert(T,D) :- definition(T1,D), !, T1 =.. [N|L], retrovert_args(Args,L), T =.. [N|Args]. retrovert_args([A|Args],[L|Ls]) :- retrovert(A,L), retrovert_args(Args, Ls). retrovert_args([], []). translate(X,X) :- var(X), !. translate(T,D) :- T =.. [N|Args], args(Args,L), T1 =.. [N|L], definition(T1,D). args([A|Args], [L|Ls]) :- translate(A,L), args(Args, Ls). args([], []). output([X|Xs]) :- var(X), write(X), write(' '), output(S). output([[X]|S]) :- output([X|S]). output([[X|L]|S]) :- write('('), output([X|L]), write(')'), output(S). output([X|S]) :- write(X), write(' '), output(S). output([]).