Sorting 根据偏好事实对键值对列表进行排序?

Sorting 根据偏好事实对键值对列表进行排序?,sorting,prolog,predicate,swi-prolog,Sorting,Prolog,Predicate,Swi Prolog,我有以下列表(从文件中读取): [a-3,a-2,a-1,b-3,b-2,b-1,c-3,c-2,c-1,文件结尾] 我还有以下谓词: % ipo(A,B) -> A is preferred over B ipo(end_of_file, _). ipo(c-3,a-3). ipo(c-3,b-3). ipo(c-3,b-2). ipo(a-2,c-3). ipo(a-2,b-2). % gr(A,B) -> A is better than B | for example a-

我有以下列表(从文件中读取): [a-3,a-2,a-1,b-3,b-2,b-1,c-3,c-2,c-1,文件结尾]

我还有以下谓词:

% ipo(A,B) -> A is preferred over B
ipo(end_of_file, _).
ipo(c-3,a-3).
ipo(c-3,b-3).
ipo(c-3,b-2).
ipo(a-2,c-3).
ipo(a-2,b-2).

% gr(A,B) -> A is better than B | for example a-2 is better than a-3
% for same key, the lower value is better
% also A is better than B if A is preferred over B

gr(X-I, X-J):- I<J.
gr(A, B):- ipo(A,B).

psort(>, E1, E2):- gr(E1, E2).
psort(<, E1, E2):- \+ gr(E1, E2).

rank(In, Out):-
    predsort(psort, In, Out).

关于效率:我已将您的代码更改为

gr(X-I, X-J):- !, I<J.
gr(A, B):- ipo(A,B).

psort(>, E1, E2):- gr(E1, E2).
psort(<, _E1, _E2).
当然,它是按偏好从低到高排序的。完成后只需将其反转,或交换psort/3中的运算符:

psort(<, E1, E2):- gr(E1, E2).
psort(>, _E1, _E2).

?- rank([c-3,a-2,a-3,a-1], Sorted).
Sorted = [a-1, a-2, c-3, a-3].
最后,ipo/2似乎不完整(c-3不是比a-1更受欢迎吗?我想是的…)。一个可能的简单解决方案是不定义数字字段:

ipo(c-_, a-_).
...

(1) 是的,(2)不清楚-您显示了两个实际输出,但您的代码只生成一个(显然是正确的)。(2)您是正确的-我输入错误。第二个输出,正确的输出,实际上是我所期望的。我将第二个“实际”改为“预期”。是的,ipo不一定完成。所收集的数据是没有矛盾的事实。传递闭包应该由我的谓词逻辑来解释。不完全性使得多个有效的解决方案可能同时存在。
?- rank([c-3,a-2,a-3,a-1], Sorted).
Sorted = [a-3, c-3, a-2, a-1].
psort(<, E1, E2):- gr(E1, E2).
psort(>, _E1, _E2).

?- rank([c-3,a-2,a-3,a-1], Sorted).
Sorted = [a-1, a-2, c-3, a-3].
?- append(L, [_], [c-3,a-2,a-3,a-1,end_of_file]).
L = [c-3, a-2, a-3, a-1]
ipo(c-_, a-_).
...