【问题标题】:Prolog ERROR out of global stackProlog ERROR 超出全局堆栈
【发布时间】:2014-02-28 13:46:23
【问题描述】:
ass(a).
ass(b).
ass(c).

con(c,r).

arg(A, L) :- forall(member(S, L), (ass(S), \+ con(S,A))).

如果我运行arg(r, [a,b]),它会工作,但如果我运行arg(r,X),它会返回:ERROR out of global stack。我希望它返回[a,b]。我知道这是因为L 是无限的,但是我该如何解决这个问题。

【问题讨论】:

  • 如果您解释了arg 谓词的含义,那将会有所帮助。
  • @mbratch 是的,你是对的,对不起!我需要找到所有 ass() 且与 A 不相反的原子。
  • @mbratch:你为什么要再次添加标签 swi-prolog。在这个问题中根本没有任何特定于 SWI 的内容......
  • @false 抱歉,我以为 OP 使用的是 SWI 特定谓词,但我错了。已删除。

标签: prolog


【解决方案1】:

在谓词中:

arg(A, L) :- forall(member(S, L), (ass(S), \+ con(S,A))).

forall/2 的 SWI Prolog 文档中所述,您的情况可能存在限制:

如果您的意图是创建变量绑定,则 forall/2 控件 结构不够完善。可能您正在寻找maplist/2findall/3foreach/2

所以在这种情况下,你可能会更好:

arg(A, L) :- findall(S, (ass(S), \+ con(S,A)), L).

这将产生:

?- arg(r, X).
X = [a, b].

?- arg(r, [a,b]).
true.

?-

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多