【问题标题】:What's the difference between "false" and "no" in PrologProlog中的“false”和“no”有什么区别
【发布时间】:2015-09-18 18:33:26
【问题描述】:

我是按照Programming in Prolog: Using the ISO Standard这本书开始学习Prolog的。在语言介绍的第 7 页,他们做出了断言:“在 Prolog 中,答案 no 用于表示 没有与问题一致。重要的是要记住nofalse 不同。那么为什么SWI-Prolog 使用falsetruestatement 而不是yesno

【问题讨论】:

    标签: prolog prolog-toplevel


    【解决方案1】:

    首先,ISO 标准 (ISO/IEC 13211-1:1995) 没有定义 一个顶层循环。在 1 Scope 中显示:

    注意 — ISO/IEC 13211 的这一部分未指定:

    ...

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

    传统上,问题的答案是用是或否来回答。如果是,则显示答案替换(如果存在)。

    如今,随着答案中存在越来越多的约束,传统的顶层循环使用起来有点麻烦。什么是正确答案 ?- dif(X,a).?不可能是yes,可能是ma​​ybe,这是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.
    

    如需更多答案,请see this

    【讨论】:

    • 这个答案很好,直到我查看了你的用户名,然后它变得很棒。
    • @false,感谢您的回复,但我仍然无法理解。对于像human(socrates).human(aristotle).athenian(socrates).这样的简单断言,我希望yesno回答问题true-flase而不是true-flase?- athenian(socrates).?-athenian(aristotle).
    • @EnricoPirani:为什么不回答true?或false?许多人也这样回答:苏格拉底是人吗?真的! Prolog是人吗?错误! 还是 3 > 2true!
    • 但 Clocksin & Mellish 写道:nofalse 不同(我想 yestrue)。
    • 这是个误会。 true/0false/0 是内置谓词。通过向您展示true/0 Prolog 说:您查询的答案与true/false 的答案完全相同。 C&M 想要强调的是,节目中的事实是对现实的不完整描述。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      • 2011-11-26
      • 2011-08-26
      相关资源
      最近更新 更多