基本的prolog程序没有返回FALSE

时间:2014-09-04 01:51:33

标签: prolog

我创建了知识库a.pl,如下所示:

sunny. rainy. god_YES.

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

?- sunny.
true.

但是对于其他一些事实,它不会返回false。例如..

?- not_sunny.

返回..

  

错误:toplevel:未定义的过程:not_sunny / 0(DWIM无法纠正目标)

2 个答案:

答案 0 :(得分: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/)

答案 1 :(得分:0)

sharky already answered Prolog期望查询中存在已知谓词以及如何以更好的方式对查询进行编码。 但是主要的是,期望像not_sunny这样的查询会因为Prolog"封闭的世界假设而失败并且#34;如果没有指定,那么这不是不合理的。 / p>

如果谓词不存在,那么不仅仅是失败还有一个很好的理由:在你的程序中输入一个拼写错误就更常见了,如果查询失败,调试它会非常痛苦。 / p>

但如果你真的想要,你可以用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.