全局堆栈中的 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)它会返回:全局堆栈中的错误。我希望它返回[a,b].我知道这是因为L是无限的,但我该如何解决这个问题。

在谓词中:

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

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

如果打算创建变量绑定,则 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.
?-

最新更新