在 Prolog 中断言高阶子句

Assert higher-order clause in Prolog

这个有效:

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

这不起作用:

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

我怎样才能使后者工作?

您需要先制定条件;您可以使用 "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.