延迟绑定变量



我有logtalk规则要添加到prolog DB:

add(IF, THEN) :- new_uid(U), assertz(cond(IF, 0, U)), assertz(act(U) :- THEN).

它似乎还可以。也就是说,它将规则拆分为两个独立的事实(稍后我将对此进行解释(。

?- rules::add(greet(X),write([hi,X])).
true
?- listing(cond).
:- dynamic cond/3.
cond(greet(_), 0, 1).
true.
?- listing(act).
:- dynamic act/1.
act(1) :-
write([hi, _]).
true.

但正如你所看到的,我失去了变量X的连接/统一_"即,我想存储一个变量并稍后对其进行解释即延迟绑定。。我该怎么做?

我假设您对对象rules的定义类似于:

:- object(rules).
:- uses(user, [
cond/3, act/1
]).
:- public(add/2).
add(IF, THEN) :-
new_uid(U),
assertz(cond(IF, 0, U)),
assertz(act(U) :- THEN).
new_uid(1).
:- end_object.

这使我们能够重现您的报告结果:

?- {rules}.
% [ /Users/pmoura/rules.lgt loaded ]
% (0 warnings)
true.
?- rules::add(greet(X),write([hi,X])).
true.
?- listing(cond/3).
:- dynamic cond/3.
cond(greet(_), 0, 1).
true.
?- listing(act/1).
:- dynamic act/1.
act(1) :-
write([hi, _]).
true.

这里的问题是,您断言两个分离的子句,但是子句变量是子句的局部变量。

一个可能的解决方案是使该变量显式。例如,通过将代码修改为以下内容:

:- object(rules).
:- uses(user, [
cond/4, act/2
]).
:- public(add/3).
add(X, IF, THEN) :-
new_uid(U),
assertz(cond(X, IF, 0, U)),
assertz(act(X, U) :- THEN).
new_uid(1).
:- end_object.

然后,您将使用以下查询:

?- rules::add(X, greet(X),write([hi,X])).
true.
?- listing(cond/4).
:- dynamic cond/4.
cond(A, greet(A), 0, 1).
true.
?- listing(act/2).
:- dynamic act/2.
act(A, 1) :-
write([hi, A]).
true.

最新更新