我們經常會在Prolog的遞歸頂用到截斷 。 盡管回溯是Prolog中最有效的機制之一 , 但有時我們但愿操縱截斷節制回溯的法式 。 在這篇經驗中 , 我將介紹截斷機制與謂詞fail 。
1SWI-Prolog的遞歸
1SWI-Prolog的算術運算

需要這些哦
電腦
SWI-Prolog
包管準確地選擇法則1Prolog為用戶供給了一種可存在于法式中并節制回溯程度的機制 , 即所謂的“截斷(cut)” 。 Porlog頂用嘆號“!”暗示截斷 。 當在幾個方針合取中設置了截斷時 , 其感化就恰似安上了一扇單標的目的門 。 截斷作為方針老是當作功的 , 且不克不及反復知足 。 例如 , 下面的法則:
example :- a, b, c, !, d, e, f.
Prolog可以在方針a、b、c之間肆意回溯 , 但一旦方針c一經知足 , 將經由過程截斷符號 , 然后Prolog繼續沿著方針鏈試圖知足方針d、e、f , 回溯可能在d、e、f之進步行 , 然而不克不及經由過程“!”回溯前面的 , 即使導致總體方針example掉敗也是如斯 。

2法式中一個謂詞經常以多種形式存在 , 此中一般至少有兩種分歧形式的謂詞豐碩 , 即遞歸法則和遏制前提 。 當編寫如許的謂詞時 , 必需包管Prolog老是選擇謂詞的準確形式 。 如當Prolog該當采用遏制前提時 , 就不該選擇遞歸法則 , 不然會導致無限遞歸 。 例如 , 下面這個法式是用于計較X的Y次冪 。
2Prolog的根基概念和語律例則
1SWI-Prolog的遞歸

3若是我們對Prolog提出扣問:
?- power(2,3,Result).
將會以以下體例進行操作:
23 = 22 * 2 , 22 = 21 * 2 , 21 = 2? * 2 , 且2? = 1 。

4但若是我們要求上例在給出回覆后繼續回溯 , 即鍵入分號 , 則會試圖在常識庫中尋找到另一個事實或法則 , 使其與上面的方針匹配 。 這就是說 , Prolog搜刮到的另一個Prolog謂詞即是遞歸法則 。 Prolog與之匹配 , 使X為2 , Y為0 , 然后Prolog計較Y_tmp獲得-1 , 并試圖知足方針:
power(X, Y_tmp, Pow_tmp),
這等于在計較2?1 , 依次進行下去 , 將試圖計較2?2 , 2?3 , 等等 。 這時無限遞歸呈現了 , 即遞歸方針持續發生本身 , 而永遠不克不及知足遏制前提 , 起頭報錯 。

5上面的環境顯然不是我們所期望的 , 它可以經由過程在遏制前提中設置截斷而得以避免 , 如許就獲得了下列新的、加倍健全和靠得住的power謂詞形式:
power(_, 0, 1). :- !.
power(X, Y, Pow) :- Y_tmp is Y - 1, power(X, Y_tmp, Pow_tmp),
猜你喜歡
- Excel 2007 中,怎么計算度分秒的正弦
- 電腦常用的七種快捷鍵
- 怎么樣在愛剪輯中添加視頻的字幕
- Excel如何根據多列的多個條件進行查詢
- 用PS做一個不規則的照片切割效果
- 朋友圈里的哪些人最缺愛?
- 家常小蛋糕的做法
- 自熱火鍋的操作流程
- 小蘇打蒸饅頭的做法
- 用奶粉做蛋糕的做法
