簡體   English   中英

Prolog 查詢順序和效率(跟蹤是否誤導?)

[英]Prolog query order and efficiency (is trace misleading?)

考慮以下簡單的 prolog 程序。

hairy(dog).
hairy(cat).

colour(dog, brown).
colour(dog, black).
colour(cat, grey).
colour(cat, white).

以下查詢在邏輯上是等效的。

?- colour(X, white), hairy(X).
?- hairy(X), colour(X, white).

雖然這兩個查詢在邏輯上是等價的,但程序執行是不同的。

Prolog 的跟蹤似乎證實了一個比另一個更有效。

trace, colour(X, white), hairy(X).
 Call:colour(_3844,white)
 Exit:colour(cat,white)
 Call:hairy(cat)
 Exit:hairy(cat)

trace, hairy(X), colour(X, white).
 Call:hairy(_4052)
 Exit:hairy(dog)
 Call:colour(dog,white)
 Fail:colour(dog,white)
 Redo:hairy(_476)
 Exit:hairy(cat)
 Call:colour(cat,white)
 Exit:colour(cat,white)

問題:第一個查詢實際上比第二個更有效嗎?

也就是說,第二個查詢的較長跟蹤步驟集是否具有誤導性?

例如,在較短的跟蹤中,第一個任務是找到哪個X滿足colour(X, white)並且跟蹤立即以X=cat退出,但實際上它必須搜索前三個colour/2對我們隱藏的事實?

動機

我想得出的結論是,對查詢謂詞進行排序以最快地正確實例化變量是優化或高效查詢的好策略。 我歡迎對此發表評論,這是提出這個問題的更廣泛的動機。

跟蹤是否具有誤導性?

是的,非常如此。 一方面,跡線不區分確定的Exit和非確定的出口。 您只能通過查看完整的跟蹤來弄清楚這一點。 此外,這個例子是人為的小,它只產生一個答案。 這倒是個特例。 大多數時候,你有更多的事實,情況可能會逆轉。

但無論如何,如果你想了解背后的確切機制,還是依賴

您的第一個查詢是?- colour(X, white), hairy(X). 相反,只看第一個目標。

?- colour(X, white).
X = cat.

因此,這告訴您數據庫中只有一個白色實體(或動物)。 SWI 對此非常肯定,因此它會立即以. 在其答案的最后。 這在一般情況下是否合理? 當然還有更多的白色動物,因此使用更真實的數據庫版本必須枚舉所有這些動物。

現在開始第二個問題:

?- hairy(X).
X = dog ;
X = cat.

這是兩個這樣的解決方案,這意味着必須探索這兩種情況,這就是第二個查詢的跟蹤更長的原因。

與白色動物相比,有多少多毛動物? 我們不能那么肯定,但無論哪個小得多,都會是一個更好的第一個目標。 無論如何,這樣的考慮往往會導致很多不值得花時間去考慮的微優化。 此外,背后的精確機制(第一個或第二個參數的索引)可能會完全模糊這一點。

Prolog 中更重要的是掌握終止,包括理解非終止。

暫無
暫無

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

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