在比较prolog中的事实时获得重复的答案

时间:2011-01-13 20:26:57

标签: recursion prolog logic

使用SWI-Prolog。我有一个排名列表:

rank(London, 3.5).
rank(New York, 3.5).
rank(Seattle, 2.3).

而我正在试图制定一条规则来打印/返回具有相同等级的任何事实。所以在这种情况下,它会回到伦敦和伦敦。纽约。

这是我到目前为止所提出的问题,唯一的问题是我得到的重复(尽管它们与当前规则完全一致)。使用递归会以某种方式帮助这个吗?

equal_rank(_):-
    rank(U1, R1),
    rank(U2, R2),
    U1 \== U2,
    R1 == R2,
    print(R1), print(': '), print(U1), print(', '), print(U2), nl,
    fail.

输出结果为:

3.5: London, New York
3.5: New York, London

我无法弄清楚如何阻止第二行。

2 个答案:

答案 0 :(得分:1)

一种简单的方法是用小于测试替换U1和U2之间的不等测试:

U1 @< U2. 

这样一对给定的只出现一次。

答案 1 :(得分:1)

我可能会选择使用bagof/3的东西,但我不知道这是否是您手头问题的首选或更合适的方法。根据您定义的事实,以下目标似乎会发出您想要的结果:

| ?- bagof(C, rank(C, X), Cs), length(Cs, L), L > 1.

Cs = [london,'new york']
L = 2
X = 3.5

yes

当然,它需要一些格式化工作;在列表中收集结果的想法可能对您有用,也可能没有用。哦,顺便说一句,我不确定需要变量的城市名称,所以你可以看到我使用普通原子断言了rank/2个事实。

有关bagof/3的一些其他信息,您可以参考online SWI-Prolog manual page了解相关信息。