Ответ в теме: Объединение списков без повторений элементов

      Комментарии к записи Ответ в теме: Объединение списков без повторений элементов отключены
#1953

append_without_dup([], List, List):-!.
append_without_dup([Head|Tail], List, AppendTail):-
  member(Head, List), !, append_without_dup(Tail, List, AppendTail).
append_without_dup([Head|Tail], List, [Head|AppendTail]):-
  append_without_dup(Tail, List, AppendTail).

Если первый список пуст – то функция должна вернуть второй список, т.к. в этом случае списки не имеют общих элементов.
В остальных случаях функция последовательно отделяет элементы первого списка, а остальную его часть обрабатывает рекурсивно. При этом, первый элемент может быть либо добавлен к результату, либо пропущен – решение принимается в зависимости от того, удастся его найти во втором списке или нет.

Для поиска элемента в списке используется встроенный предикат member.

Если элементы повторялись в каком-либо из исходных списков, то они будут повторяться в полученном результате. Если нужно избежать этого – преобразуйте список во множество перед вызовом функции.