Prolog中“false”和“no”之间的区别是什么?

时间:2015-07-01 14:23:22

标签: prolog swi-prolog prolog-toplevel

我开始在书Programming in Prolog: Using the ISO Standard之后学习Prolog。在他们提出断言的语言介绍的第7页:“在Prolog中,答案没有用于表示没有与问题统一。重要的是要记住 false 不同。那么为什么SWI-Prolog使用falsetrue语句而不是yesno

2 个答案:

答案 0 :(得分:8)

首先,ISO标准(ISO / IEC 13211-1:1995)没有定义 一个顶级循环。在1范围内,它的内容如下:

  

注 - ISO / IEC 13211的本部分未规定:

     

...

     

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

传统上,查询的答案已回答是或否。如果是,则显示答案替换(如果存在)。

今天,随着答案中出现越来越多的约束,传统的顶级循环变得有点麻烦。什么是正确的答案 ?- dif(X,a).?它不能是,它可能是可能,它首先由Jaffar et al.s CLP(R)使用。但很多时候,人们想要重复使用答案。

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

?- dif(b,a).
true.

?- true.
true.

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

所以,如果不再是,为什么不存在?出于这个原因,SWI给出false.作为答案。在SWI之前,Prolog IV确实回复了false。请注意,例如SWI中的以下修复点:

?- true; false.
true ;
false.

所以即使是这个微小的细节仍保留在答案中。在Prolog IV中,由于Prolog IV一下子显示了所有答案,因此它被折叠成true

?- true ; false.

true.

有关答案的更多信息,请see this

答案 1 :(得分:1)

我最近遇到了这个问题,并查看了Clocksin和Mellish的旧版(第三版),其中讨论了yesnotrue,{{1 }}。根据我的阅读文字,这是我的理解:

    在爱丁堡Prolog使用事实和规则的“数据库”评估查询后,返回
  1. falseyesno表示结果可以从数据库中的事实和规则得到证明; yes表示无法从这些规则和事实中证明。
  2. notrue指的是现实世界。仅因为此事实不在数据库中,Prolog就有可能将false返回到查询no。而实际上(在现实世界中)奥巴马是美国人,因此实际上,这一事实是isAmerican(obama)

Edinburgh Prolog返回trueyes进行查询,但是以后的实现(例如SWI Prolog)返回notrue。显然,后来的实现者并不认为这种区别很重要,但实际上这是至关重要的区别。当爱丁堡Prolog返回false时,则表示“无法从数据库中证明”;当SWI Prolog返回no时,也表示“无法从数据库中证明”。它们的含义(在语义上)相同,但在外观上(语法上)却有所不同,因为SWI Prolog不完全符合爱丁堡Prolog约定。

相关问题