我覺得示蹤劑向你展示了追蹤器跟隨的所有不同分支。爲此,它似乎否定了它嘗試過的最後一個分支的成功聲明之一,所以這次它將採用不同的解決方案。
看看整個執行過程中,你肯定會看到失敗的謂詞是真的,如第二次評估中的Fail: (7) lists:member(0, [0, 1, 2])
。
[trace] ?- group([0, 1, 2], 3).
Call: (6) group([0, 1, 2], 3) ? creep
Call: (7) lists:member(_G718, [0, 1, 2]) ? creep
Exit: (7) lists:member(0, [0, 1, 2]) ? creep
Call: (7) lists:member(_G718, [0, 1, 2]) ? creep
Exit: (7) lists:member(0, [0, 1, 2]) ? creep
^ Call: (7) _G721 is 0+0 ? creep
^ Exit: (7) 0 is 0+0 ? creep
^ Call: (7) _G724 is 0 mod 3 ? creep
^ Exit: (7) 0 is 0 mod 3 ? creep
Call: (7) lists:member(0, [0, 1, 2]) ? creep
Exit: (7) lists:member(0, [0, 1, 2]) ? creep
Exit: (6) group([0, 1, 2], 3) ? creep
true ;
Redo: (7) lists:member(0, [0, 1, 2]) ? creep
Fail: (7) lists:member(0, [0, 1, 2]) ? creep
Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
Exit: (7) lists:member(1, [0, 1, 2]) ? creep
^ Call: (7) _G721 is 0+1 ? creep
^ Exit: (7) 1 is 0+1 ? creep
^ Call: (7) _G724 is 1 mod 3 ? creep
^ Exit: (7) 1 is 1 mod 3 ? creep
Call: (7) lists:member(1, [0, 1, 2]) ? creep
Exit: (7) lists:member(1, [0, 1, 2]) ? creep
Exit: (6) group([0, 1, 2], 3) ? creep
true ;
Redo: (7) lists:member(1, [0, 1, 2]) ? creep
Fail: (7) lists:member(1, [0, 1, 2]) ? creep
Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
Exit: (7) lists:member(2, [0, 1, 2]) ? creep
^ Call: (7) _G721 is 0+2 ? creep
^ Exit: (7) 2 is 0+2 ? creep
^ Call: (7) _G724 is 2 mod 3 ? creep
^ Exit: (7) 2 is 2 mod 3 ? creep
Call: (7) lists:member(2, [0, 1, 2]) ? creep
Exit: (7) lists:member(2, [0, 1, 2]) ? creep
Exit: (6) group([0, 1, 2], 3) ? creep
true ;
Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
Exit: (7) lists:member(1, [0, 1, 2]) ? creep
Call: (7) lists:member(_G718, [0, 1, 2]) ? creep
Exit: (7) lists:member(0, [0, 1, 2]) ? creep
^ Call: (7) _G721 is 1+0 ? creep
^ Exit: (7) 1 is 1+0 ? creep
^ Call: (7) _G724 is 1 mod 3 ? creep
^ Exit: (7) 1 is 1 mod 3 ? creep
Call: (7) lists:member(1, [0, 1, 2]) ? creep
Exit: (7) lists:member(1, [0, 1, 2]) ? creep
Exit: (6) group([0, 1, 2], 3) ? creep
true ;
Redo: (7) lists:member(1, [0, 1, 2]) ? creep
Fail: (7) lists:member(1, [0, 1, 2]) ? creep
Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
Exit: (7) lists:member(1, [0, 1, 2]) ? creep
^ Call: (7) _G721 is 1+1 ? creep
^ Exit: (7) 2 is 1+1 ? creep
^ Call: (7) _G724 is 2 mod 3 ? creep
^ Exit: (7) 2 is 2 mod 3 ? creep
Call: (7) lists:member(2, [0, 1, 2]) ? creep
Exit: (7) lists:member(2, [0, 1, 2]) ? creep
Exit: (6) group([0, 1, 2], 3) ? creep
true ;
Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
Exit: (7) lists:member(2, [0, 1, 2]) ? creep
^ Call: (7) _G721 is 1+2 ? creep
^ Exit: (7) 3 is 1+2 ? creep
^ Call: (7) _G724 is 3 mod 3 ? creep
^ Exit: (7) 0 is 3 mod 3 ? creep
Call: (7) lists:member(0, [0, 1, 2]) ? creep
Exit: (7) lists:member(0, [0, 1, 2]) ? creep
Exit: (6) group([0, 1, 2], 3) ? creep
true ;
Redo: (7) lists:member(0, [0, 1, 2]) ? creep
Fail: (7) lists:member(0, [0, 1, 2]) ? creep
Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
Exit: (7) lists:member(2, [0, 1, 2]) ? creep
Call: (7) lists:member(_G718, [0, 1, 2]) ? creep
Exit: (7) lists:member(0, [0, 1, 2]) ? creep
^ Call: (7) _G721 is 2+0 ? creep
^ Exit: (7) 2 is 2+0 ? creep
^ Call: (7) _G724 is 2 mod 3 ? creep
^ Exit: (7) 2 is 2 mod 3 ? creep
Call: (7) lists:member(2, [0, 1, 2]) ? creep
Exit: (7) lists:member(2, [0, 1, 2]) ? creep
Exit: (6) group([0, 1, 2], 3) ? creep
true ;
Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
Exit: (7) lists:member(1, [0, 1, 2]) ? creep
^ Call: (7) _G721 is 2+1 ? creep
^ Exit: (7) 3 is 2+1 ? creep
^ Call: (7) _G724 is 3 mod 3 ? creep
^ Exit: (7) 0 is 3 mod 3 ? creep
Call: (7) lists:member(0, [0, 1, 2]) ? creep
Exit: (7) lists:member(0, [0, 1, 2]) ? creep
Exit: (6) group([0, 1, 2], 3) ? creep
true ;
Redo: (7) lists:member(0, [0, 1, 2]) ? creep
Fail: (7) lists:member(0, [0, 1, 2]) ? creep
Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
Exit: (7) lists:member(2, [0, 1, 2]) ? creep
^ Call: (7) _G721 is 2+2 ? creep
^ Exit: (7) 4 is 2+2 ? creep
^ Call: (7) _G724 is 4 mod 3 ? creep
^ Exit: (7) 1 is 4 mod 3 ? creep
Call: (7) lists:member(1, [0, 1, 2]) ? creep
Exit: (7) lists:member(1, [0, 1, 2]) ? creep
Exit: (6) group([0, 1, 2], 3) ? creep
true ;
Redo: (7) lists:member(1, [0, 1, 2]) ? creep
Fail: (7) lists:member(1, [0, 1, 2]) ? creep
Fail: (6) group([0, 1, 2], 3) ? creep
false.
我正在使用示蹤劑,因爲我剛剛發現它,並認爲它可能能夠揭示爲什麼最終答案是否定的,即使正確的答案應該是。另外,我確定是否存在一個集合中的兩個元素,它們的和模K在同一個集合中,並且就我所知,對於所有情況,它都進行了這個測試,但是它進行了最後一次檢查對我來說似乎很神祕。@false – Valtteri
@Valtteri:唯一令人感到神祕的是跟蹤器產生的純粹細節。這不值得一看。什麼是相關的是你的程序意味着什麼! – false
是的,你在解決方案中使用否定。這是合乎邏輯的。謝謝。而沙漠69的答案解釋了爲什麼最後沒有。至少我希望我明白了...... – Valtteri