簡體   English   中英

Prolog中的“false”和“no”有什么區別

[英]What's the difference between "false" and "no" in Prolog

在 Prolog 中的編程:使用 ISO 標准一書之后開始學習 Prolog。 在語言介紹的第 7 頁,他們斷言:“在 Prolog 中,答案no用於表示沒有與問題一致的意思。重要的是要記住, nofalse 不同”。 那么為什么SWI-Prolog使用falsetrue語句而不是yesno呢?

首先,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 , notrue , false之間的區別。 根據我對文本的閱讀,這是我的理解:

  1. 在 Edinburgh Prolog 使用其事實和規則的“數據庫”評估查詢后,將返回yesno yes表示結果可以從數據庫中的事實和規則中證明; no意味着不能從這些規則和事實中證明。
  2. truefalse指的是現實世界。 Prolog 有可能對查詢isAmerican(obama)返回no ,因為這個事實不在數據庫中; 而事實上(在現實世界中)奧巴馬是美國人,所以這個事實在現實中是true的。

Edinburgh Prolog 對查詢返回yesno ,但是后來的實現,如 SWI Prolog,返回truefalse 很明顯,后來的實現者並不認為這種區別很重要,但實際上這是一個至關重要的區別。 當 Edinburgh Prolog 返回no ,表示“無法從數據庫中證明”; 當 SWI Prolog 返回false它也意味着“無法從數據庫中證明”。 它們的意思相同(語義上)但它們看起來不同(語法上),因為 SWI Prolog 並不完全符合愛丁堡 Prolog 約定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM