7

我是按照《Prolog编程:使用 ISO 标准》一书开始学习 Prolog 的 。在语言介绍的第 7 页,他们做出断言:“在 Prolog 中,答案no用于表示没有与问题一致。重要的是要记住nofalse不同”。那么为什么SWI-Prolog使用falseandtrue语句而不是yesorno呢?

4

2 回答 2

11

首先,ISO 标准 (ISO/IEC 13211-1:1995) 没有定义顶层循环。在 1 Scope 中,它写道:

注 — ISO/IEC 13211 的这一部分没有规定:

...

f) Prolog 处理器的用户环境(顶层循环、调试器、库
系统、编辑器、编译器等)。

传统上,查询的答案是用“是”或“不是”来回答的。如果是,则显示答案替换(如果存在)。

今天,随着答案中存在越来越多的约束,传统的顶层循环使用起来有点麻烦。什么是正确答案 ?- dif(X,a).?它不可能是yes,它可能是maybe,这是Jaffar et al.s CLP(R)首先使用的。但经常有人想重用答案。

?- dif(X,a).
dif(X,a).

?- dif(b,a).
true.

?- true.
true.

遵循 Prolog IV 开创性的顶层,SWI 中的想法是生成文本作为答案,以便您可以将其粘贴回来以获得相同的结果。以这种方式,答案的语法在某种程度上被指定——它必须是有效的 Prolog 文本。

那么,如果不再有,为什么应该没有呢?出于这个原因,SWI 给出false.了答案。在 SWI 之前,Prolog IV确实做出了回应false。例如,请注意 SWI 中的以下固定点:

?- true; false.
true ;
false.

因此,即使是这个微小的细节也会保留在答案中。而在 Prolog IV 中,这被折叠成true因为 Prolog IV 一举显示所有答案。

?- true ; false.

true.

有关答案的更多信息,请参阅此

于 2015-07-01T14:35:19.733 回答
1

我最近遇到了这个问题,并查看了旧(第三)版的 Clocksin 和 Mellish,其中讨论了yes,notrue,之间的区别false。根据我对文本的阅读,这是我的理解:

  1. yesno在 Edinburgh Prolog 使用其事实和规则的“数据库”评估查询后返回。yes表示结果可以从数据库中的事实和规则中得到证明;no意味着它无法从这些规则和事实中得到证明。
  2. truefalse参考现实世界。Prolog 有可能仅仅因为这个事实不在数据库中而返回no查询;isAmerican(obama)而事实上(在现实世界中)奥巴马是美国人,所以这个事实是true现实的。

Edinburgh Prolog 返回yesno查询,但是后来的实现,如 SWI Prolog,返回truefalse. 显然,后来的实现者并不认为这种区别很重要,但实际上这是一个至关重要的区别。当 Edinburgh Prolog 返回 ano时,表示“无法从数据库中证明”;当 SWI Prolog 返回时false,它也意味着“无法从数据库中证明”。它们的含义相同(语义上),但看起来不同(语法上),因为 SWI Prolog 并不完全符合 Edinburgh Prolog 约定。

于 2019-02-18T21:15:17.947 回答