我一直在尝试将给定的列表分成两个不同的列表:Unique 和 Duplicate。例如,如果我们有列表
我无法弄清为什么在两个列表的末尾我会得到 '
[1, 1, 2, 3, 3, 4, 5]
,我想让 Unique 列表为 [2, 4, 5]
,Duplicate 列表为 [1, 3]
。我不希望列表中所有的 1 都在 Duplicate 列表中,我只需要其中一个。目前我拥有的代码如下:compareL([_|[]], Unique, Dup).
compareL([X3,Y3 | Tail], [X3 | Unique], Dup) :-
X3 =\= Y3,
compareL([Y3 | Tail], Unique, Dup).
compareL([X3,Y3 | Tail], Unique, [X3 | Dup]) :-
X3 = Y3,
skipDups(X3, Tail, Unique, Dup).
skipDups(_, [], Unique, Dup).
skipDups(X3,[Y3 | Tail], Unique, Dup) :-
X3 =\= Y3,
compareL([Y3 | Tail], Unique, Dup).
skipDups(X3,[Y3 | Tail], Unique, Dup) :-
X3 = Y3,
skipDups(X3, Tail, Unique, Dup).
如果我运行compareL([1, 1, 2, 3, 3, 4, 5], Unique, Dup)
,根据以上给出的示例列表,结果如下:
Unique = [2, 4|_G1954],
Dup = [1, 3|_G1948].
我无法弄清为什么在两个列表的末尾我会得到 '
_G1954
' 和 '_G1948
'。如有帮助,请谢谢。
compareL([_], [], [])
替换compareL([_|[]], Unique, Dup)
。 - CapelliC