optisort(A, Cs, D) :- between(0, inf, N), optitree(A, N, D), findall(X, (ord_list(D, X0), append(Cs, X0, X)), Css), forall(member(C, Css), (ord_transitives(C, C0), complete_ord(A, C0))), !. optitree(_, 0, D) :- D = done. optitree(Ls, N, D) :- N > 0, member(A, Ls), member(B, Ls), A \= B, N0 is N - 1, between(0, N0, N1), between(0, N0, N2), optitree(Ls, N1, T1), optitree(Ls, N2, T2), D = compare(A, B, T1, T2). ord_list(done, []). ord_list(compare(A,B,T1,_), [A