【问题标题】:Assert higher-order clause in Prolog在 Prolog 中断言高阶子句
【发布时间】:2015-03-28 14:56:38
【问题描述】:

这行得通:

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

这不起作用:

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

我怎样才能使后者工作?

【问题讨论】:

  • assert(p(X) :- q(X)). 是无效的语法。 assert((p(X) :- q(X))) 是有效的语法。前者是SWI's idiosyncrasy,即没有其他系统接受。

标签: prolog


【解决方案1】:

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

【讨论】:

  • @repeat 我不明白为什么不应该这样做。在 SWI-Prolog 中,:- 被声明为运算符;是在 SICStus 吗? (试试current_op(P, T, :-).
  • @repeat 您能否至少链接一个实际详细说明需要额外括号的问题?我在您提供的链接中找不到任何内容。无论如何,如果参数中的某处存在连词,则通常需要额外的括号:例如,作为 bagof/3 的第二个参数的连词。
  • @repeat “标准语法”是什么意思? a :- b 是标准语法,还是 :-(a, b)?你能在 SICStus 写assertz(:-(a, b)) 吗?
  • 请注意,assertz(a :-b) 被接受为有效语法不一定是不合规的情况。这可能是 ISO/IEC 13211-1:1995 5.5.1 的(有效)实现特定扩展的情况。但是,我不知道这种扩展的精确定义。在 SWI 中没有解决的还有太多需要解决的进一步案例。作为这样的例子,想想其他系统不同的#92。提供这样一个一致的定义将是声称符合的一方的负担。
  • @repeat 看来我们有答案了。我的感觉是a :- b 没有歧义(据我所知),所以应该不需要额外的括号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多