我创建了知识库a.pl,如下所示:
sunny.
rainy.
god_YES.
现在在Prolog中,在我运行consult('a.pl').
后,它会被编译并且还会为存储的事实提供true
。那是......
?- sunny.
true.
但是对于其他一些事实,它不会返回false
。例如..
?- not_sunny.
返回..
错误:toplevel:未定义的过程:not_sunny / 0(DWIM无法纠正目标)
答案 0 :(得分:1)
您的Prolog事实数据库需要关于您要查询的谓词的真/假断言。事实数据库如:
sunny.
rainy.
实际上被解释为以下谓词:
sunny :- true.
rainy :- true.
这些谓词(sunny/0
和rainy/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.