2014-09-04 45 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.