2010-05-23 69 views
4

在SWI-Prolog中是否有任何內置謂詞會始終失敗並阻止機器回溯 - 它會停止程序立即執行(這不是fail/0的作用)? 我可以使用切割,但我不喜歡它們。序言,失敗,不要回溯

做一些像!, fail對我來說不是問題,但爲了完成我想要的,我將不得不在更多的位置使用切割,這是我不喜歡的。

回答

7

你可以使用異常。根據你的問題 - 它應該有所幫助。 參考link

+2

我沒有看到任何東西,當我點擊你的鏈接 – Nacht 2012-04-25 15:52:07

2

太糟糕了,這是削減的目的。

4

你可以使用明確設計的機制來幫助你完成某件事,但你不喜歡它?

您可以隨時使用不,這是切語法糖失敗

3

兩個備選方案浮現在腦海中:

  1. 通過周圍要控制,並在你寫的快速失敗的謂詞的定義,解釋它的代碼backtrack(true)backtrack(false)長期通行證如果它設置爲backtrack(false),或者如果backtrack(true)繼續。請注意,這實際上不會阻止回溯;它應該只啓用快速故障。即使你的證明樹很深,這應該提供一種快速的方法來防止在回溯時執行某些代碼。
  2. 按照@Xonix(+1)的建議使用異常。拋出異常會立即終止證明樹的構造,並且可以通過異常直至處理程序傳遞任何期限數據,繞過任何更多的執行 - 它可能會比第一個選項更快,但可能不如便攜式。

就我個人而言,我已經使用過兩種方法 - 第一種是我在編寫代碼之前已經預料到需要,後者是我沒有使用的。