:- dynamic(greater/2). make_rules([]). make_rules([X]). make_rules([X,Y|XS]) :- assertz(greater(Y, X)), append([Y], XS, XS2), make_rules(XS2). my_topo_sort([], Total_order). my_topo_sort(Partial_order, Total_order) :- select(X, Partial_order, Partial_order2), make_rules(X), my_topo_sort(Partial_order2, Total_order). is_greater(Y, X) :- greater(Y, X); greater(Z, X), is_greater(Y, Z).