这有效:
assert(p(X) :- q(X)).
这不起作用:
P = p,Q = q, assert(P(X) :- Q(X)).
如何让后者奏效?
答案 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.