Я пытался разбить данный список на два разных списка: Уникальный и Дубликат. Например, если у нас есть список [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 ([ _], [], []). ' – CapelliC
Спасибо. Это избавилось от «_G1954» и «_1919». Но когда у меня есть два 5 в конце списка, он возвращается снова. Любая идея почему? – saviok
Я думаю, что ваши предикаты слишком сложны ... Я отправлю ответ альтернативным кодом. – CapelliC