basic prolog程序不返回FALSE

basic prolog程序不返回FALSE,prolog,Prolog,我创建了知识库a.pl,如下所示: 阳光明媚。 多雨。 上帝啊,是的。 现在在Prolog中,在我运行consult('a.pl')之后,它将被编译,并为存储的事实提供true。那就是 ?- sunny. true. 但对于其他一些事实,它不会返回false。例如 ?-不是晴天。 返回 错误:顶层:未定义的过程:非/0(DWIM无法更正目标) Prolog事实数据库需要关于要查询的谓词的真/假断言。事实数据库,如: sunny. rainy. 实际上被解释为以下谓词: sunny :-

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

阳光明媚。 多雨。 上帝啊,是的。

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

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

?-不是晴天。

返回

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


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

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

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

类似以下的查询:

?- not_sunny. 
仅当数据库中已存在谓词
not_sunny/0
时,此操作才有效。否则,这样的查询将生成您显示的错误,因为
not\u/0
是一个“未定义的过程”。相反,你可以问:

?- \+ sunny.
这在已知谓词
sunny/0
前面使用否定运算符()。对于上面的数据库,如果
?-sunny.
true
,此查询将计算为
false
,否则您可能会期望
?-not_sunny

有关Prolog基础知识的更多信息,我强烈推荐该网站。

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

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

但是如果您真的愿意,您实际上可以使用
set\u prolog\u 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.