【发布时间】:2014-03-25 03:04:57
【问题描述】:
我想返回一个删除所有唯一元素的列表,例如
remUniqueVals([1,1,2,2,3,4,4,5,6,6,6],Q).
Q = [1,1,2,2,4,4,6,6,6].
我的问题是目前我有返回的代码
remUniqueVals([1,1,2,2,3,4,4,5,6,6,6],Q).
Q = [1, 2, 4, 6, 6].
因此只返回这些非唯一值的第一个实例。 这是我的代码:
remUniqueVals([], []).
remUniqueVals([Q1|RestQ],[Q1|Xs]) :-
member(Q1,RestQ),
remUniqueVals(RestQ,Xs).
remUniqueVals([Q1|RestQ],Xs) :-
remove(Q1,[Q1|RestQ], NewQ),
remUniqueVals(NewQ,Xs).
我可以看到member(Q1,RestQ) 在第二次检查 1、2、4 时失败,因为它们现在不再在列表中,因此将它们删除。我想要一些帮助解决这个问题,我的想法是检查member(Q1, PreviousQ),这是已经在最终Q 中的元素。不知道如何去实施,尽管任何帮助将不胜感激。
更新:
好的,感谢您最后提出的建议:
remUniqueVals(_,[], []).
remUniqueVals(_,[Q1|RestQ],[Q1|Xs]) :-
member(Q1,RestQ),
remUniqueVals(Q1,RestQ,Xs).
remUniqueVals(PrevQ,[Q1|RestQ],[Q1|Xs]) :-
Q1 = PrevQ,
remUniqueVals(PrevQ,RestQ,Xs).
remUniqueVals(PrevQ,[_|RestQ],Xs) :-
remUniqueVals(PrevQ,RestQ,Xs).
remUniqueVals(0,[4,1,1,3,2,2,5,5],Q).
Q = [1, 1, 2, 2, 5, 5].
remUniqueVals(0, [A,B,C], [1,1]).
A = 1,
B = 1,
C = 1.
【问题讨论】:
-
我怀疑你得到的答案不止一个。至少,你有六倍的三倍......
-
我不确定我理解你的意思……三个 6 不是一回事。为了把它放到上下文中,我正在查看元组,例如上面可能是 [[a,6],[b,6],[c,6]]。我想删除最后一个元素唯一的所有元组。
-
对于
remUniqueVals([6,6,6],Q),member(E, [6,6])将有两个答案 - 但您不要报告它们。 -
我认为我的问题不是他们没有被报告,而是只有两个答案。所以它检查成员(6,[6,6])。 (统一 Q = [6])然后检查成员(6,[6])。 (Q = [6,6]) 然后检查成员(6,[])。这失败了,因此返回 Q = [6,6]。这是我的问题。我想返回 Q = [6,6,6] 但不确定如何使用这种方法进行此操作。
-
是否要求保留剩余元素的原始顺序?