【问题标题】:Prolog predicate where two items are associated but not equivalentProlog 谓词,其中两个项目关联但不等价
【发布时间】: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).

shipmatesshipmates1 规则是完成以下任务的两种不同尝试:我想将同一船上但彼此不等价的所有乘客配对。

例如,我希望 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


【解决方案1】:

试试:

shipmates(A, B) :-
    aboard(A, X),
    aboard(B, X),
    A \= B.

通过在A \= B 目标之前调用aboard/2 谓词,您可以确保AB 都将被实例化,从而使比较有意义。

【讨论】:

  • 成功了,谢谢。在比较中使用变量之前,我不完全理解需要限定或实例化变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
相关资源
最近更新 更多