% common code between the two ppp solutions :- use_module(library(lists), [member/2]). exec((Goal1,Goal2),Program) :- !, exec(Goal1,Program), exec(Goal2,Program). exec(true,_) :- !. exec(Head,Program) :- member(Clause,Program), copy_term(Clause,pp(Head,Body)), exec(Body,Program). reverse_program([],L,L). reverse_program([pp(H,B)|R],In,Out) :- reverse_body(B,true,NewB), reverse_program(R,[pp(H,NewB)|In],Out). reverse_body((A,B),In,Out) :- !, reverse_body(B,(A,In),Out). reverse_body(A,In,(A,In)). is_a_copy(A,B) :- numbervars(A,1,N), numbervars(B,1,N), A = B.