统一列表列表prolog

时间:2016-10-27 23:29:52

标签: list prolog

我用谷歌搜索了这个,但找不到答案,所以你走了:

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

我想在一个列表中统一列表列表,所以我可以删除重复项。我知道我必须使用递归,但这就是我所知道的。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以简单地修改谓词:

underscore

ing(Lis) :- setof(E, X^Y^I^( recipe2(X, ingredients(I,Y)), member(E, I) ), Lis). 是一个内置谓词,它将第一个参数与第二个参数中列表的元素统一起来。这是不确定的。

member/2的使用是存在量词,以确保您只在一个解决方案中获得结果。它基本上说,

  

对于作为其一部分的任何元素E,存在X,Y和I.   成分表,(I)。

使用X^Y^I^还可确保您获得的任何解决方案都是唯一元素的集合。

<小时/> member/2setof/3

的文档(SWI-Prolog)