2014-09-04 43 views
1

我创建的知识库a.pl如下:基本Prolog程序没有返回FALSE

sunny. rainy. god_YES.

现在Prolog的,我跑consult('a.pl').后它被编译并给出true存储的事实。那是..

?- sunny. 
true. 

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

?- not_sunny.

它返回..

ERROR: toplevel: Undefined procedure: not_sunny/0 (DWIM could not correct goal)

回答

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/)

0

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.