【问题标题】:When does Prolog prompts 'yes' and when does it says 'true'Prolog 什么时候提示“是”,什么时候提示“真”
【发布时间】:2021-02-08 16:48:36
【问题描述】:

我在Prolog中写了以下知识库:

likes(yamini,chocolate).
likes(anuj,apple).
likes(yamini,book).
likes(john,book).
likes(john,france).

现在,当我查阅上述文件并尝试以下命令时:

| ?- likes(anuj,apple).      

(1 ms) yes
| ?- likes(yamini,chocolate).

true ? ;

no

我想了解 Prolog 何时回复“是”与何时回复“真”。

【问题讨论】:

  • 这是 GNU Prolog 吗?

标签: prolog prolog-toplevel gnu-prolog


【解决方案1】:

该输出取决于您使用的顶层。看来您正在使用 GProlog。当查询成功且没有选择点(没有其他可能的解决方案)时,它将输出yes

当查询成功时它会回复true,但仍有其他可能的解决方案需要检查。

【讨论】:

  • 也许实现者认为yes ? 似乎有争议。 :)
  • 但是likes(yamini,chocolate).只有一个答案...我的意思是chocolate不是一个变量,那么为什么prolog会认为可能有其他解决方案...?
  • @yaminigoel:我相信 GProlog 正在使用第一个参数索引,因此在证明第一个子句时,它只“检查”是否存在任何剩余子句,第一个参数 yamini 存在(第三个子句) ,因此它留下了一个选择点。如果您查询likes(yamini, book),它将回答yes,因为当它证明第三个子句时,没有剩余的子句与第一个参数yamini
【解决方案2】:

这是顶层(Prolog 命令行)实现的产物。显然你的实现说true 当它可以证明一个目标并且不确定是否可能有更多的解决方案时。如果确定只有一种解决方案,则显示为yes

SWI-Prolog 的作用如下:

?- likes(anuj,apple). 
true.

Prolog 可以成功地证明目标 likes(anuj,apple) 并且肯定没有其他方法可以证明它,否则会看到这样的结果:

?- member(X,[1,2]).
X = 1 ; 
X = 2.

已找到使目标为真的X1,但可能还有其他解决方案。确实有,即2

回到我们的例子:

?- likes(yamini,chocolate).
true.

【讨论】:

  • 顺便说一句,“目标”在 70 年代应该真的被称为“猜想”,不是吗?我们想让这个猜想成为一个定理......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
相关资源
最近更新 更多