У меня проблема с сортировкой списка задач [t7, t1, t6, t2, t4, t3, t5]
в Прологе. Чтобы отсортировать это, я хочу использовать предопределенную формулу predsort/3
, так как это кажется правильным подходом.
Мой пользовательский предикат выглядит так:
sort_dependency(<, T, T2) :-
depends_on(T,T2,_).
sort_dependency(>, T, T2) :-
depends_on(T2,T,_).
sort_dependency(>, T, T2) :-
T == T2;
not(depends_on(T,T2,_)),
not(depends_on(T2,T,_)).
При тестировании получаю следующее:
?- predsort(sort_dependency, [t7, t1, t6, t2, t4, t3, t5], Sorted).
Sorted = [t5, t4, t3, t7, t2, t6, t1] .
Это неправильно. Правильный ответ должен быть что-то вроде [t1 , t2, t3, t4, t5, t6, t]
. Для проверки здесь приведены факты depends_on
.
depends_on(t7,t2,0).
depends_on(t7,t6,0).
depends_on(t6,t4,0).
depends_on(t6,t5,0).
depends_on(t2,t1,0).
depends_on(t4,t3,0).
depends_on(t3,t1,0).
depends_on(t5,t3,0).
Я пробовал переключать разные переменные, но все равно не могу получить ожидаемый результат. keysort/2
лучше? Проблема в том, что я не вижу, как реализовать сортировку по ключам в сочетании с пользовательским предикатом.
sort_dependency/3
? Я предполагаю, что это должно быть==
. Но почему два объекта должны быть одинаковыми, если они не зависят друг от друга напрямую? - person false   schedule 09.01.2015>
используется как предикат, если обе задачи одинаковы,OR
они не зависят друг от друга. Это должно быть эквивалентно, если я просто заменю его наsort_dependency(>, T, T2).
, потому что, если оба предыдущих предложения не работают, третье всегда будет истинным. Проблема остается прежней, если я делаю это изменение. - person Timbo925   schedule 09.01.2015compare_xxx
, а первый аргумент должен быть>
,<
или==
. - person false   schedule 09.01.2015