作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了以下谓词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 的预定义谓词(除了给我自己的谓词另一个名称)?
最佳答案
append/3
谓词不是 SWI-Prolog 中的内置谓词,而是一个库谓词,在模块 lists
中定义。当您执行代码时,该模块可能会自动加载。有两个标志可以在这里提供帮助。 autoload
标志控制库的自动加载。可以通过调用set_prolog_flag(autoload, false)
来关闭它。还有另一个标志,verbose_autoload
,您可以将其设置为 true
,以便自动加载变得详细。最后但并非最不重要的一点是,您可以使用 listing/1
谓词来检查代码。尝试列出(append/3)
。它应该在谓词的子句正文中显示对 list:append/3
的调用。
这就是我得到的:
?- set_prolog_flag(verbose_autoload, true).
true.
?- [user].
append([L|Ls],R,[L|Result]):-append(Ls,R,Result).
|: append([],X,X).
|: % user://1 compiled 0.00 sec, 3 clauses
true.
?- listing(append/3).
% autoloading user:listing/1 from /Users/pmoura/lib/swipl-7.1.8/library/listing
% autoloading system:append/3 from /Users/pmoura/lib/swipl-7.1.8/library/lists
lists:append([], A, A).
lists:append([A|B], C, [A|D]) :-
append(B, C, D).
system:append([], A, A).
system:append([A|B], C, [A|D]) :-
append(B, C, D).
append([A|B], C, [A|D]) :-
append(B, C, D).
append([], A, A).
true.
?- trace.
true.
[trace] ?- append([a,b,c],[d,e],X).
Call: (6) append([a, b, c], [d, e], _G354) ? creep
Call: (7) append([b, c], [d, e], _G436) ? creep
Call: (8) append([c], [d, e], _G439) ? creep
Call: (9) append([], [d, e], _G442) ? creep
Exit: (9) append([], [d, e], [d, e]) ? creep
Exit: (8) append([c], [d, e], [c, d, e]) ? creep
Exit: (7) 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].
[trace] ?-
您可以编辑您的帖子并告诉我们导致您获得结果的确切调用顺序吗?
关于prolog - 覆盖 Prolog 中预定义的谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21913625/
我是一名优秀的程序员,十分优秀!