【发布时间】:2020-02-09 06:33:35
【问题描述】:
我已经多年没有在 Prolog 中编程了,并且正在为一个简单的测试代码块而苦苦挣扎(我正在尝试解决一个有趣的逻辑难题......):
aboard(jack, blackbird).
aboard(jim, blackbird).
aboard(donna, blackbird).
aboard(david, north_star).
aboard(sandy, north_star).
shipmates(A, B) :- A \= B, aboard(A, X), aboard(B, X).
shipmates1(A, A) :- !, fail.
shipmates1(A, B) :- aboard(A, X), aboard(B, X).
shipmates 和 shipmates1 规则是完成以下任务的两种不同尝试:我想将同一船上但彼此不等价的所有乘客配对。
例如,我希望 shipmates(jack, jack). 成为 false。
当我使用完全限定的参数进行查询时,我得到了预期的答案:
3 ?- shipmates(jack, david).
false.
4 ?- shipmates(jack, jack).
false.
5 ?- shipmates(jack, jim).
true.
但是,当我想要 Donna 的所有船友时,它似乎不起作用:
6 ?- shipmates(donna, X).
false.
我期待:
X = jack ;
X = jim ;
注意:我得到与shipmates1 相同的错误结果。
所以请同情一个非常业余的 Prolog 程序员(他没有在课堂上做作业!)我做错了什么非常明显的事情?
版本: SWI-Prolog(线程化,64 位,版本 8.0.2)
【问题讨论】:
-
用
dif(A,B)替换A \= B -
为什么在这种情况下使用
dif(A,B)更好? -
使用
dif/2,目标的顺序无关紧要。此外,没有违反单调性,而A \= B确实违反了您所看到的单调性。使用A \= B,您有责任保证足够的实例化。使用dif(A, B),它始终有效。
标签: prolog