【发布时间】:2014-02-20 16:21:22
【问题描述】:
我写了以下谓词 append/3 来实现两个列表的组合:
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 中),我没有得到相同的结果;它使用了私有
append版本。您使用的是哪个 prolog 解释器? -
我也在用 SWI Prolog(版本是 6.2.6)
-
我使用的是 6.0.2 版本。不确定这是否是结果不同的原因。您是否有更大的上下文,或者您是否看到这些结果只是输入
swipl并将您的代码输入为[user]? -
对不起,我不能完全理解你的最后一句话,因为我对 Prolog 还是很陌生...... :( 但我写的只是一个简单的快速排序程序,我通常只是双击我的文件 quicksort.pl,在弹出的窗口中输入
make.,然后输入[quicksort].。 -
我的建议是,像我一样重现问题,(1) 输入
swipl命令,获得prolog 提示,(2) 输入[user].,然后按 Enter,(3)只需输入您的append代码。然后在 prolog 提示符处,开始跟踪(输入trace.)和您的示例查询,看看是否得到相同的结果。
标签: prolog swi-prolog