2016-10-27 2 views
1

をプロローグ:統一リスト私はこれをグーグルが、答えを見つける傾けるので、ここであなたが行く

を私はプロローグでこの機能を持っている:

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]]. 

リストのリストを1つのリストに統一したいので、重複を取り除くことができます。私は再帰を使用しなければならないことを知っているが、それはすべて私が知っている。

ありがとうございます。

答えて

0

あなたは、単に、そのようなのような述語を変更することがあります。

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

member/2は、第二引数で、リストの要素を持つ最初の引数を統合内蔵の述語です。それは非決定論的です。

X^Y^I^の使用は、1つの解決策で結果を得ることができるようにするための存在量限定子です。

成分リスト(I)の一部である任意のエレメントEにX、Y、Iが存在します。

setof/3を使用すると、取得するすべてのソリューションが固有の要素のコレクションになります。


member/2setof/3

+3

右のドキュメント(SWI-Prologの)が、OPのニーズので、重複、@CapelliC – CapelliC

+0

のfindAll/3の後/ 3、またはソート/ 2 SETOF活用、それを指摘して感謝を削除しています。重複を扱うことに言及された質問の部分は、何らかの奇妙な理由で私の心を完全に逃れました。私は私の答えを編集しました。 – eazar001

関連する問題