我在Prolog中做了一個非常簡單的練習,有一些我在跟蹤中不理解。該計劃是一個「大於」(>
)上表示爲接班人的整數:回溯太多:爲什麼這裏有「重做」?
greater_than(succ(_), 0).
greater_than(succ(A), succ(B)) :-
greater_than(A, B).
我的問題:我不明白爲什麼請求greater_than(succ(succ(succ(0))),succ(0))
在下面的跟蹤生成redo
:
[trace] ?- greater_than(succ(succ(succ(0))),succ(0)).
Call: (6) greater_than(succ(succ(succ(0))), succ(0)) ? creep
Call: (7) greater_than(succ(succ(0)), 0) ? creep
Exit: (7) greater_than(succ(succ(0)), 0) ? creep
Exit: (6) greater_than(succ(succ(succ(0))), succ(0)) ? creep
true ;
Redo: (7) greater_than(succ(succ(0)), 0) ? creep
Fail: (7) greater_than(succ(succ(0)), 0) ? creep
Fail: (6) greater_than(succ(succ(succ(0))), succ(0)) ? creep
false.
這裏爲什麼會有redo
?我怎樣才能避免它(當然,沒有削減)?
順便說一句,我可以告訴大家:不,它不是某種功課......
這只是你問的一個優化,給定的編譯器可能有或沒有。 –
那麼,一般來說,我認爲優化一個人的代碼是一個合法的編程問題,即使只編寫一種編譯器(這裏是SWI)。然而,我剛剛更新了SWI,我甚至不再看到這種行爲,所以它對SWI來說真的是內部的,我想這個問題確實沒有興趣。對於噪音抱歉。 – Eusebius
我在SWI安裝上試過了你的代碼,它沒有*嘗試任何重做。它不僅是編譯器,也是它的版本。我看到你更新了它;也許這是一個非常舊的版本。 –