【问题标题】:PROLOG - clause returns true for constants, but won't find solution for variable?PROLOG - 子句对常量返回 true,但找不到变量的解决方案?
【发布时间】:2013-08-24 21:06:44
【问题描述】:

在对 PROLOG 编程语言禁欲多年后,我正试图再次涉足它。 很快,有些事情让我感到困惑。

(我在 windows 上使用 SWI prolog 6.4.1.)

考虑以下定义:

father(jack, clara).
father(jack, sophie).

mother(angela,clara).
mother(angela,sophie).

parent(A, B) :- father(A, B).
parent(A, B) :- mother(A, B).

sibling( A, B ) :-
    A \= B,
    parent(P, A),
    parent(P, B).

现在,如果我“询问”口译员: 兄弟姐妹(克拉拉,苏菲)。

是的就是答案。

但是,如果我尝试获取例如的兄弟姐妹克拉拉: 兄弟(克拉拉,X)。

答案只是错误。 就像 findall(X, 兄弟(clara, X), L)。

返回一个空列表。

为什么?

【问题讨论】:

  • \= 读作“不能统一”,not读作“不是”。这样就不会误读任何使用它的语句。

标签: prolog logic prolog-dif


【解决方案1】:

要证明sibling(clara, X),首先需要证明clara \= x。但这不起作用,因为它简化为\+ clara = X,而\+ 是臭名昭著的negation as failure:Prolog 试图证明clara = X,它成功了,并得出结论clara \= X 因此一定是假的。

您应该重新排序您的程序以执行\= 检查最后而不是第一个,或使用dif(clara, X)。

【讨论】:

  • 这很快,我马上试试 :-) 有趣 - 语句的顺序很重要吗?我将逗号视为 AND 运算符。
  • @dont 问,Prolog 中语句的顺序非常重要。逗号实际上是 AND 运算符(顺便说一下, ; 是 OR 运算符)。由于该顺序,某些谓词甚至可能不会结束。您可以查看统一算法以了解其重要性。另外,看看 OR 运算符。这将有助于理解。
  • 哦,我用不同的“主体”多次编写一个子句以获得 OR 效果。 10 年前,我在 PROLOG 中编写了诸如树搜索算法之类的东西,我想知道当时我知道的这么少,还是我真的忘记了这么多:-D 感谢您的指点。
  • @dontask:是的,语句的顺序很重要,因为 Prolog 使用了不完整的推理算法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多