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