我寫了下面的謂詞append/3可以實現兩個列表組合:覆蓋預定義的謂詞的Prolog
append([L|Ls],R,[L|Result]):-append(Ls,R,Result).
append([],X,X).
它給出了一個正確的輸出,但是當我跟蹤代碼的執行流程,在這裏是我所得到的:
1 ?- edit.
true.
2 ?- make.
% //dougal/cs0u$/cyw03u/desktop/lab3 compiled 0.00 sec, 3 clauses
true.
3 ?- trace.
true.
[trace] 3 ?- append([a,b,c],[d,e],X).
Call: (6) append([a, b, c], [d, e], _G554) ? creep
Call: (7) lists:append([b, c], [d, e], _G636) ? creep
Exit: (7) lists:append([b, c], [d, e], [b, c, d, e]) ? creep
Exit: (6) append([a, b, c], [d, e], [a, b, c, d, e]) ? creep
X = [a, b, c, d, e].
看來,Prolog的是用我自己的附加謂詞在第一圈,但因爲它進入遞歸的第二個層次,Prolog有利用自身的謂詞在庫中定義。
我怎樣才能覆蓋Prolog的預定義謂詞(除了給我自己的謂詞另一個名字)?
當我嘗試你的例子(在SWI Prolog中)時,我沒有得到相同的結果;它使用私有的「附加」版本。您使用的是哪個prolog解釋器? – lurker
我也在使用SWI Prolog(版本是6.2.6) – Pingu
我在版本6.0.2上。不知道這是結果不同的原因。你有更大的上下文,還是你看到這些結果只是輸入'swipl'並把你的代碼放在'[user]'中? – lurker