2

我有 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 的连接/统一变成“_”,即我想存储一个变量并稍后解释它,即后期绑定..我该怎么做?

4

1 回答 1

1

我假设您对对象的定义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.
于 2020-12-18T22:45:41.093 回答