gpt4 book ai didi

prolog - 覆盖 Prolog 中预定义的谓词

转载 作者:行者123 更新时间:2023-12-02 06:21:24 25 4
gpt4 key购买 nike

我编写了以下谓词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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com