gpt4 book ai didi

prolog - 如何导出动态创建的谓词?

转载 作者:行者123 更新时间:2023-12-01 11:39:13 25 4
gpt4 key购买 nike

考虑以下代码:

:- module(my_export, [create/2]).

create(Predicate, Id) :-
assertz(Predicate),
export(Id).

假设谓词和标识符匹配,我希望新断言的谓词在模块外可用。但是,我得到了这个输出:

?- create(c(A,B) :- A > B, c/2).
true.

?- c(1,2).
Correct to: "my_export:c(1,2)"?

为什么不导出谓词?执行此操作的正确方法是什么?

最佳答案

您必须使用 use_module/1 导入模块。

例如,如果这是 sample_module.pl:

:- module(my_export, [create/2]).

create(Predicate, Id) :-
assertz(Predicate),
export(Id).

那么这个输入输出为真(仔细观察是怎么回事):

?- create(tmp(A,B) :- A > B, tmp/2).
ERROR: toplevel: Undefined procedure: create/2 (DWIM could not correct goal)

?- consult('c:\\Prolog\\pl\\bin\\sample_module.pl').
% c:\Prolog\pl\bin\sample_module.pl compiled into my_export 0.00 sec, 2 clauses
true.

?- create(tmp(A,B) :- A > B, tmp/2).
true.

?- tmp(1,2).
Correct to: "my_export:tmp(1,2)"? yes
false.

?- use_module('c:\\Prolog\\pl\\bin\\sample_module.pl').
true.

?- tmp(1,2).
false.

?- tmp(5,4).
true.

现在,当您在 SWI-Prolog 中“编译缓冲区”时,真正发生的是 consult/1。您需要手动导入模块。

关于prolog - 如何导出动态创建的谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23319710/

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