2016-10-27 75 views
1

我GOOGLE了這一點,但不能找到答案,所以在這裏你去:統一名單列表的Prolog

我在序言中這樣的功能:

ing(Lis) :- findall(I,(recipe2(_,ingredients(I,_))),Lis). 

此功能搜索和返回我列出的清單像這樣:

L = [['wheat flour', egg, salt], ['wheat flour', cheese, olives, tomato, salt, basil], ['wheat flour', potatoes, salt], [milk, egg, sugar]]. 

我想統一列表列表只在一個列表中,所以我可以得出重複。我知道我必須使用遞歸,但這就是我所知道的。

在此先感謝。

回答

0

您可能只需修改謂詞像這樣:

ing(Lis) :- 
    setof(E, X^Y^I^(recipe2(X, ingredients(I,Y)), member(E, I)), Lis). 

member/2是一個內置的謂詞統一與第二個參數列表中的一個元素的第一個參數。它是非確定性的。

使用X^Y^I^是存在量化符,以確保您只能在一個解決方案中獲得結果。它基本上說,

作爲 成分表,(I)的一部分的任何元素E存在X,Y和I.

使用setof/3還可確保您獲得的任何解決方案都是獨特元素的集合。


文檔(SWI-Prolog的)爲 member/2setof/3

+3

權,但由於OP的需求,是的findall/3 – CapelliC

+0

@CapelliC之後,除去重複,更好地利用SETOF/3,或排序/ 2,感謝指出了這一點。涉及處理重複的問題部分由於某種奇怪的原因完全逃脫了我的想法。我編輯了我的答案。 – eazar001