Ответ в теме: Swi Prolog: Встречающиеся и остальные элементы списков

#3977

Чтобы решить задачу – можно сначала разделить исходный список на два в соответствии с условием:

%divide_meeting(+ListA, +ListB, -AInB, -ANotINB)
divide_meeting([], _ListB, [], []).
divide_meeting([Head|Tail], ListB, [Head|AInBTail], ANotINB):-
  member(Head, ListB), !,
  divide_meeting(Tail, ListB, AInBTail, ANotINB).
divide_meeting([Head|Tail], ListB, AInB, [Head|ANotINBTail]):-
  divide_meeting(Tail, ListB, AInB, ANotINBTail).

Результаты работы функции выглядят примерно так:

Остается только соединить два списка в один. Сделать это можно с помощью стандартного предиката append:

divide_meeting_and_append(A, B, Result):-
  divide_meeting(A,B, AInB, ANotInB), 
  append(AInB, ANotInB, Result).