2013-11-21 6 views
0

Я выполняю домашнюю работу, чтобы реализовать отношение list_merge (X, Y, Z), где X и Y - целые списки, Z содержит все элементы из X и Y, а там не дублируется в Z.Prolog: Удаление дубликатов объединенного списка

Я знаю, как реализовать функцию добавления и удалить дубликаты.

добавить

append2([X|A],B,[X|C]):-!,append(A,B,C). 
append2([],B,B). 

удалить дублирует

delete(X,[],[]). 
delete(X,[X|T],R) :- delete(X,T,R). 
delete(X,[H|T],[H|R]) :- not(X = H), delete(X,T,R). 

remdups([],[]). 
remdups([H|T],[H|R]) :- delete(H,T,S), remdups(S,R). 

Но я не знаю, как совместить эти два releations в одном отношении, так что я могу удалить дубликаты после слияния двух списков. Как я могу объединить отношения или любые другие методы, которые могут иметь такой же эффект.

Некоторый вход и выход образца:

?- list_merge([],[],L). 
L = []. 
?- list_merge([1],[1],L). 
L = [1]. 
?- list_merge([],[1,3,1,1,1],L). 
L = [1, 3] . 
?- list_merge([5,3,1,2,1],[7,3,2,5,7],L). 
L = [5, 7, 3, 2, 1] . 
+0

remdups вызова в списке возвращаемый Append – CapelliC

+0

Не было бы чище, если были заказаны списки, и вы сделали правильный «сливаться» между ними? –

ответ

-1

Ну, первый добавить два списка для промежуточного результата, и удалить дубликаты из этого промежуточного результата, чтобы получить конечный результат.

list_merge(X, Y, Z) :- 
    append2(X, Y, Z1), 
    remdups(Z1, Z). 
+0

Большое спасибо ^^ – Peter

Смежные вопросы