在Prolog中断言高阶子句

时间:2015-03-27 17:20:23

标签: prolog

这有效:

assert(p(X) :- q(X)).

这不起作用:

P = p,Q = q, assert(P(X) :- Q(X)).

如何让后者奏效?

1 个答案:

答案 0 :(得分:4)

您需要先制定条款;你可以使用" univ"运算符,=..为此:

?- P = p, Q = q, Head =.. [P, X], Body =.. [Q, X], assertz((Head :- Body)).
P = p,
Q = q,
Head = p(X),
Body = q(X).

?- listing(p/1).
:- dynamic p/1.

p(A) :-
    q(A).

显然,在大多数实现中你需要第二对括号。如果您在身体中有一个连接,那么无论如何你都需要它们。

?- assertz(a :- b).
true.

?- assertz(a :- b, c).
ERROR: assertz/2: Uninstantiated argument expected, found c (2-nd argument)
?- assertz((a :- b, c)).
true.