在 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.
这个有效:
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.