使用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
我无法弄清楚如何阻止第二行。
答案 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了解相关信息。