Prolog中的Assert高阶子句

Prolog中的Assert高阶子句,prolog,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/

这项工作:

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.

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

@重复一遍,我不明白为什么不应该。在SWI Prolog中,
:-
声明为运算符;是在西施都吗?(试一下当前的操作(P,T,:-).@重复一遍。你能把至少一个问题链接起来吗?我在你提供的链接上找不到任何东西。不管怎样,如果参数中某处有连接词,通常需要额外的括号:例如,连接词作为
bago的第二个参数f/3
@repeat什么是“标准语法”?是
a:-b
标准语法,还是
:-(a,b)
?你能用SICStus写
assertz(:-(a,b))
吗?请注意,
assertz(a:-b)
被接受为有效语法并不一定是不符合的情况。它可能是a(有效)的情况具体实施扩展qua ISO/IEC 13211-1:1995 5.5.1。然而,我不知道此类扩展的精确定义。还有太多的案例需要解决,但在SWI中没有解决。作为这样的一个例子,请思考其他系统的不同之处。并且,要求合规的一方将承担提供此类扩展的责任一致的定义。@重复一遍,我们似乎有了答案。我的感觉是,
a:-b
并不含糊(据我所知),所以应该不需要额外的括号。@重复一遍,我不明白为什么不应该。在SWI Prolog中,
:-
被声明为运算符;它是在SICStus中吗?(尝试
current\u op(P,t,:-).
@重复一遍。你能把至少一个问题链接起来吗?我在你提供的链接上找不到任何东西。不管怎样,如果参数中某处有连接词,通常需要额外的括号:例如,连接词作为
bago的第二个参数f/3
@repeat什么是“标准语法”?是
a:-b
标准语法,还是
:-(a,b)
?你能用SICStus写
assertz(:-(a,b))
吗?请注意,
assertz(a:-b)
被接受为有效语法并不一定是不符合的情况。它可能是a(有效)的情况具体实施扩展qua ISO/IEC 13211-1:1995 5.5.1。然而,我不知道此类扩展的精确定义。还有太多的案例需要解决,但在SWI中没有解决。作为这样的一个例子,请思考其他系统的不同之处。并且,要求合规的一方将承担提供此类扩展的责任定义一致。@重复一遍,我们似乎有了答案。我的感觉是,
a:-b
并不含糊(就我所见),所以不需要额外的括号。
assert(p(X):-q(X))。
是无效语法。
assert((p(X):-q(X)))
是有效语法。前者是,即没有其他系统接受它。
assert(p(X):-q(X))。
是无效语法。
assert((p(X):-q(X))
是有效语法。前者是,即没有其他系统接受它。