我写了下面的谓词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