【问题标题】:basic prolog program not returning FALSE基本序言程序不返回 FALSE
【发布时间】:2014-09-04 01:51:33
【问题描述】:

我创建的知识库 a.pl 如下:

sunny. rainy. god_YES.

现在在 Prolog 中,在我运行 consult('a.pl'). 后,它会被编译,并且还会为存储的事实提供 true。那是..

?- sunny.
true.

但对于其他一些事实,它不会返回 false。比如……

?- not_sunny.

返回..

错误:顶层:未定义过程:not_sunny/0(DWIM 无法更正目标)

【问题讨论】:

    标签: prolog


    【解决方案1】:

    您的 Prolog 事实数据库需要关于您要查询的谓词的真/假断言。事实数据库,例如:

     sunny.
     rainy.
    

    实际上被解释为以下谓词:

     sunny :- true.
     rainy :- true.
    

    这些谓词(sunny/0rainy/0)可以使用 false 而不是 true 作为子句主体。

    这样的查询:

    ?- not_sunny. 
    

    仅当数据库中已有谓词not_sunny/0 时才有效。否则,这样的查询将产生您所显示的错误,因为not_sunny/0 是一个“未定义的过程”。相反,你可以问:

    ?- \+ sunny.
    

    这在已知谓词sunny/0 前面使用否定运算符 (\+)。使用上面的数据库,假设?- sunny.true,这个查询将评估为false,否则你可能会期待?- not_sunny

    有关 Prolog 基础知识的更多信息,我强烈推荐网站Learn Prolog Now (http://www.learnprolognow.org/)

    【讨论】:

      【解决方案2】:

      sharky already answered Prolog 期望查询中有一个已知的谓词,以及如何以更好的方式对查询进行编码。 但原则上,期望像 not_sunny 这样的查询会因为 Prolog 的“封闭世界假设”而失败并不是不合理的:如果没有指定,那就不是真的。

      如果谓词不存在,不只是失败是有充分理由的:程序中出现拼写错误的情况更为常见,如果查询失败,调试它会非常痛苦。

      但如果你真的想要,你实际上可以使用 set_prolog_flag/2 谓词来改变行为:

      ?- not_sunny.
      ERROR: toplevel: Undefined procedure: not_sunny/0 (DWIM could not correct goal)
      ?- set_prolog_flag(unknown,fail).
      Warning: Using a non-error value for unknown in the global module
      Warning: causes most of the development environment to stop working.
      Warning: Please use :- dynamic or limit usage of unknown to a module.
      Warning: See http://www.swi-prolog.org/howto/database.html
      true.
      
      ?- not_sunny.
      false.
      

      【讨论】:

        猜你喜欢
        • 2015-06-25
        • 1970-01-01
        • 1970-01-01
        • 2016-08-26
        • 1970-01-01
        • 2023-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多