【发布时间】:2013-04-06 11:13:44
【问题描述】:
我一直在尝试将给定列表拆分为两个不同的列表:唯一列表和重复列表。
例如,如果我们有列表[1, 1, 2, 3, 3, 4, 5],我希望唯一列表为[2, 4, 5],重复列表为[1, 3]。
我不希望列表中的所有 1 都在重复列表中。我只需要其中之一。
我现在的代码:
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([_|[]], Unique, Dup).试试compareL([_], [], []). -
谢谢。这摆脱了'_G1954'和'_G1948'。但是当我在列表末尾有两个 5 时,它又回来了。知道为什么吗?
-
我认为你的谓词太复杂了......我会用替代代码发布答案。
-
如果可以,那就太好了。谢谢!