2011-01-13 99 views
0

使用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

对很多不方便的“打印/ 1”调用的小小评论:考虑使用格式/ 2:format(“〜w:〜w,〜w \ n”,[R1,U1,U2]相同的结果,并且更容易阅读和写入。 – mat 2011-01-13 23:06:10

回答

1

一种简单的方法将是一个小于测试,以取代U1和U2之间的不等于测试:

U1 @< U2. 

这种方式一个给定的一对只出现一次。

+0

工作过,没有更多的双重结果。谢谢。 – 2011-01-14 12:36:07

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

+0

虽然我确信这会起作用,但它比我试图避免的其他答案增加了更多的复杂性。不管怎么说,还是要谢谢你。 – 2011-01-14 12:36:52

相关问题