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/2
,findall/3
或foreach/2
.
因此,在这种情况下,您可能最好使用:
arg(A, L) :- findall(S, (ass(S), + con(S,A)), L).
这将产生:
?- arg(r, X).
X = [a, b].
?- arg(r, [a,b]).
true.
?-