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
无限制,但我该如何解决这个问题。
答案 0 :(得分:0)
在谓语中:
arg(A, L) :- forall(member(S, L), (ass(S), \+ con(S,A))).
如forall/2
的SWI Prolog文档中所述,您的案例可能有限制:
如果您的目的是创建变量绑定,则使用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.
?-