从Prolog中的列表列表中删除重复元素

从Prolog中的列表列表中删除重复元素,prolog,Prolog,我正在尝试解决如何在Prolog中删除列表列表中的重复元素 例如: 输入:[[1,2,3],[5,6],[3,4],[1,7]] 预期产出:[[1,2,3],[5,6],[4],[7]] 我知道我可以使用谓词排序/2删除单个列表中的重复项,但如何使其在多个列表中工作?以下是我的尝试。希望您已尝试解决此问题并从中学习…无论如何,如果您仍然没有找到任何解决方案,请查看以下代码: remove_dupl(InL, OutL):- remove_dupl(InL, [], OutL1),remove_

我正在尝试解决如何在Prolog中删除列表列表中的重复元素

例如: 输入:[[1,2,3],[5,6],[3,4],[1,7]]

预期产出:[[1,2,3],[5,6],[4],[7]]


我知道我可以使用谓词排序/2删除单个列表中的重复项,但如何使其在多个列表中工作?

以下是我的尝试。希望您已尝试解决此问题并从中学习…无论如何,如果您仍然没有找到任何解决方案,请查看以下代码:

 remove_dupl(InL, OutL):- remove_dupl(InL, [], OutL1),remove_empty(OutL1,OutL).

remove_dupl([],_,[]).
remove_dupl([H|T],L,[[H1]|T2]):-
              H=[H1], \+member(H1,L), 
              remove_dupl(T,[H1|L],T2).
remove_dupl([H|T],L,[[H1|T2]|T3]):- 
              H=[H1|T1], \+member(H1,L), 
              remove_dupl([T1|T],[H1|L],[T2|T3]).
remove_dupl([H|T],L,T2):- 
              H=[H1|T1], member(H1,L), 
              remove_dupl([T1|T],L,T2).
remove_dupl([H|T],L,[[]|T2]):- 
              H=[H1], member(H1,L), 
              remove_dupl(T,L,T2).

remove_empty([],[]).
remove_empty([[]|T],T1):-remove_empty(T,T1).
remove_empty([[H|T]|T1],[[H|T]|T2]):-remove_empty(T1,T2).
也许不是最有效的解决方案。 例如:


编码员,到目前为止,我已经尝试过使用排序,但没有什么成功。一个简单的想法是遍历列表列表,如果当前元素不属于列表,则在列表中检查当前元素,如果它已经属于它,则意味着您以前遇到过它,因此忽略它并递归地继续下一步。我需要实现什么类型的谓词来执行遍历?只是一个递归,例如编写一个谓词:remove_dupl[H | T],L,L2:-。。。其中[H | T]是列表的列表H是列表,L是您将保留找到的元素的列表,L2是您将递归构建的输出列表。那么我是否应该使用member检查H中的每个元素是否都在T中?感谢您提供的代码,但您能否告诉我第二个和第三个代码之间的区别?谢谢。你是说第二条和第三条,因为这是一个代码?如果是的话,那么我使用第二个子句来分析列表的最后一个元素,所以H=[H1]而不是[H1 | T1],所以在这一点上,通过只写[[H1]| T2]而不是[[H1 | T2]| T3]来结束输出列表,我必须将这两个例子分开。是的,谢谢你的解释。我已经追踪了代码并理解了它^_^嘿,只有一个问题,当我运行查询时?-remove_dupl[[-1,-3,-4],[2,3,-4],[1,-2,4],[1,3,4],-1,2,-3]],L。它输出为false失败。问题是在处理情况H=[H1]时,当memberH1,L添加了last子句,尽管这可能会在最终列表中留下空列表,例如在上次查询中,来自[1,3,4]的所有元素不能包括在这个解决方案中留下空列表,因此我认为基于上述解决方案的最简单方法就是使用另一个谓词删除空列表。
?- remove_dupl([[1,2,3],[5,6],[3,4],[1,7]],L).
L = [[1, 2, 3], [5, 6], [4], [7]] ;
false.