2014-02-28 72 views
1
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是無限的,但我該如何解決這個問題。Prolog的錯誤了全球棧

+0

如果你解釋了'arg'謂詞的意義,這將有助於。 – lurker

+0

@mbratch是的,你是對的!我需要找到所有的原子是屁股()並且與A相反。 – user1855165

+0

@mbratch:你爲什麼再添加標籤swi-prolog。在這個問題上沒有什麼特別的SWI ...... – false

回答

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. 

?-