我迷惑自己,如果有人能指出我正确的方向,它会有所帮助。我需要从嵌套列表中获取重复项。我想我可以简单地找出如何从常规列表中获取重复项,然后制定一个规则来获取子集然后以某种方式将它们组合起来并且它可以工作但我认为我通过这样做会使自己更加困惑。
这是我到目前为止所做的,它删除了重复的内容。
删除重复项:
duplicate([],[]).
duplicate([H|T],C) :- var(H,T),!, duplicate(T,C).
duplicate([H|T],[H|C]) :- duplicate(T,C).
var(X,[H|_]) :- X==H,!.
var(X,[_|T]) :- var(X,T).
子集规则:
subset([],_).
subset([H|T],L):- member(H,L),subset(T,L).
目前,如果我致电duplicate([1,2,2,3,4,a,a,a,b,b,b], X).
,它会返回X = [1,2,3,4a,b]
这是正确的,但我希望能够致电duplicate([1,[2,[2,[1,[a,[a]]]]]], X).
并让它返回X = [1,2,a]
我的思维过程是正确的还是我错误地想到了这个?
答案 0 :(得分:1)
您可以将列表展平为预处理步骤:
?- flatten([1,[2,[2,[1,[a,[a]]]]]], L).
L = [1, 2, 2, 1, a, a].
然后在展平列表中使用现有的duplicate
:flatten([1,[2,[2,[1,[a,[a]]]]]], L), duplicate(L, X).