问题描述
我有 logtalk 规则要添加到 prolog 数据库中:
add(IF,THEN) :- new_uid(U),assertz(cond(IF,U)),assertz(act(U) :- THEN).
它似乎工作正常......即将规则拆分为两个单独的事实(稍后我会解释)。
?- rules::add(greet(X),write([hi,X])).
true
?- listing(cond).
:- dynamic cond/3.
cond(greet(_),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,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(_),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,assertz(cond(X,assertz(act(X,U) :- THEN).
new_uid(1).
:- end_object.
然后您将使用以下查询:
?- rules::add(X,greet(X),X])).
true.
?- listing(cond/4).
:- dynamic cond/4.
cond(A,greet(A),1).
true.
?- listing(act/2).
:- dynamic act/2.
act(A,1) :-
write([hi,A]).
true.