[英]What's the difference between "false" and "no" in Prolog
我在 Prolog 中的編程:使用 ISO 標准一書之后開始學習 Prolog。 在語言介紹的第 7 頁,他們斷言:“在 Prolog 中,答案no用於表示沒有與問題一致的意思。重要的是要記住, no與false 不同”。 那么為什么SWI-Prolog
使用false
和true
語句而不是yes
或no
呢?
首先,ISO 標准 (ISO/IEC 13211-1:1995) 沒有定義頂級循環。 在 1 Scope 中,它寫道:
注——ISO/IEC 13211 的這一部分沒有規定:
...
f) 用戶環境(頂級循環、調試器、庫
Prolog 處理器的系統、編輯器、編譯器等)。
傳統上,查詢的答案是用是或否來回答的。 如果是,則顯示答案替換(如果存在)。
今天,隨着答案中出現越來越多的約束,傳統的頂級循環變得有點難以使用。 什么是正確答案?- dif(X,a).
? 它不能是肯定的,它可能是可能的,它首先由Jaffar 等人的 CLP(R) 使用。 但很多時候人們想要重復使用答案。
?- dif(X,a).
dif(X,a).
?- dif(b,a).
true.
?- true.
true.
遵循 Prolog IV 的開創性頂層,SWI 中的想法是生成文本作為答案,以便您可以將其粘貼回以獲得完全相同的結果。 以這種方式,答案的語法在某種程度上被指定 - 它必須是有效的 Prolog 文本。
因此,如果不再有是,為什么不應該有? 出於這個原因,SWI 給出false.
作為答案。 在 SWI 之前, Prolog IV確實響應false
。 例如,請注意 SWI 中的以下固定點:
?- true; false.
true ;
false.
因此,即使是這個微小的細節也會保留在答案中。 而在 Prolog IV 中,這被折疊成true
因為 Prolog IV 一舉顯示了所有答案。
?- true ; false.
true.
有關答案的更多信息,請參閱此。
我最近遇到了這個問題,並查看了 Clocksin 和 Mellish 的舊版(第三版),其中討論了yes
, no
和true
, false
之間的區別。 根據我對文本的閱讀,這是我的理解:
yes
和no
。 yes
表示結果可以從數據庫中的事實和規則中證明; no
意味着不能從這些規則和事實中證明。true
和false
指的是現實世界。 Prolog 有可能對查詢isAmerican(obama)
返回no
,因為這個事實不在數據庫中; 而事實上(在現實世界中)奧巴馬是美國人,所以這個事實在現實中是true
的。 Edinburgh Prolog 對查詢返回yes
和no
,但是后來的實現,如 SWI Prolog,返回true
和false
。 很明顯,后來的實現者並不認為這種區別很重要,但實際上這是一個至關重要的區別。 當 Edinburgh Prolog 返回no
,表示“無法從數據庫中證明”; 當 SWI Prolog 返回false
它也意味着“無法從數據庫中證明”。 它們的意思相同(語義上)但它們看起來不同(語法上),因為 SWI Prolog 並不完全符合愛丁堡 Prolog 約定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.