:- dynamic(greater/2). make_rules([]). make_rules([X]). make_rules([X,Y|XS]) :- \+ is_greater(X, Y), assertz(greater(Y, X)), append([Y], XS, XS2), make_rules(XS2). all_rules([]). all_rules(Partial_order) :- select(X, Partial_order, Partial_order2), make_rules(X), all_rules(Partial_order2). is_greater(Y, X) :- greater(Y, X); greater(Z, X), is_greater(Y, Z). remove_duplicates([], Unsorted_flat_concise, Unsorted_flat_concise). remove_duplicates(Unsorted_flat, Unsorted_flat2, Unsorted_flat_concise) :- select(X, Unsorted_flat, Unsorted_flat_rest), (member(X, Unsorted_flat2), remove_duplicates(Unsorted_flat_rest, Unsorted_flat2, Unsorted_flat_concise); append([X], Unsorted_flat2, Unsorted_flat3), remove_duplicates(Unsorted_flat_rest, Unsorted_flat3, Unsorted_flat_concise)). my_topo_sort([], Sorted2, Sorted2). my_topo_sort(Unsorted, Sorted, Sorted2) :- get_max(Unsorted, Max, LessList), append(Sorted, [Max], NewSorted), my_topo_sort(LessList, NewSorted, Sorted2). my_topo_sort(Unsorted, Sorted) :- all_rules(Unsorted), flatten(Unsorted, Unsorted_flat), remove_duplicates(Unsorted_flat, [], Unsorted_flat_concise), my_topo_sort(Unsorted_flat_concise, [], ReverseSorted), reverse(ReverseSorted, Sorted), write(Sorted). get_max([], Max, LessList, Max, LessList). get_max(Unsorted, X, Unsorted2, Max, LessList) :- select(Y, Unsorted, Rest), (is_greater(X, Y), append(Unsorted2, [Y], NewList), get_max(Rest, X, NewList, Max, LessList); append(Unsorted2, [X], NewList), get_max(Rest, Y, NewList, Max, LessList)). get_max(Unsorted, Max, LessList) :- select(X, Unsorted, Unsorted2), get_max(Unsorted2, X, [], Max, LessList).