Prolog ERROR超出全局堆栈

时间:2014-02-28 13:46:24

标签: prolog

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超出全局堆栈。我希望它返回[a,b]。我理解这是因为L无限制,但我该如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

在谓语中:

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

forall/2的SWI Prolog文档中所述,您的案例可能有限制:

  

如果您的目的是创建变量绑定,则使用forall / 2控件   结构不足。可能你正在寻找maplist/2,   findall/3foreach/2

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

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

将产生:

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

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

?-