我想了解爲什麼與swipl
的交互似乎不一致。爲什麼swipl的不一致響應?
這是一個典型的例子。假設我有諮詢的知識庫,包括以下定義:
acc_max([H|T], A, Max) :- H > A, acc_max(T, H, Max).
acc_max([H|T], A, Max) :- H =< A, acc_max(T, A, Max).
acc_max([], A, A).
max([H|T], Max) :- acc_max(T, H, Max).
下面我展示一下我的屏幕看起來像後,我在提示符下鍵入max([0, 1, 2], X).
,並創下輸入:
?- max([0, 1, 2], X).
X = 2 ▮
(該▮
表示光標的位置。)
特別注意,解釋器的下一個提示還沒有出現。
下面是我輸入後屏幕的樣子;:
?- max([0, 1, 2], X).
X = 2 ;
false.
?- ▮
現在我終於得到了解釋器的提示。
相比之下,下面我給我的屏幕看起來像後,我在提示符下鍵入max([2, 0, 1], X).
什麼,並創下輸入:
?- max([2, 0, 1], X).
X = 2.
?- ▮
注意,這一次我得到了解釋器的提示馬上 - 我做不需要輸入;。此外,沒有false
。我發現許多其他類似的不一致(例如,有時輸出true.
顯示在屏幕上,但在其他類似的情況下它不會)。
作爲一個初來乍到Prolog的,我覺得這種不一致令人不安的(更不用提沮喪,因爲他們不斷地提醒我真的不知道發生了什麼事情的)。
是否有一種簡單的方法來合理化這些不一致?
另外,是否有一些Prolog的實現提供比SWI-Prolog更加一致和可預測的交互?
這與Prolog中的「選擇點」有關。在第一個例子中,由於它的順序是找到與輸入相關的解決方案,Prolog在提出解決方案'X = 2'後有一個選擇,所以它搜索了更多,但沒有找到更多的解決方案。在第二種情況下,確定'X = 2'並且沒有選擇點。 – lurker