:- dynamic answers_to_skip/1. ppp2 :- findall(pp(Head,Body),pp(Head,Body),Program1), reverse_program(Program1,[],Program2), repeat(0,N), find_nth_answer(N,Program1,Answer1), find_nth_answer(N,Program2,Answer2), ( Answer1 == nomore, Answer2 == nomore -> ! % stop the repeat and succeed ; is_a_copy(Answer1,Answer2) -> fail % ok, try next answers ; !, fail % different answers found: fail ). ppp2. find_nth_answer(N,Program,Goal) :- Goal = run(_), set_answers_to_skip(N), exec(Goal,Program), answers_to_skip(M), ( M == 0 -> ! ; NewM is M - 1, set_answers_to_skip(NewM), fail ). find_nth_answer(_,_,nomore). repeat(I,I). repeat(I,J) :- I1 is I + 1, repeat(I1,J). set_answers_to_skip(N) :- retractall(answers_to_skip(_)), assert(answers_to_skip(N)).