61 lines
1.7 KiB
Prolog
61 lines
1.7 KiB
Prolog
:- 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).
|