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

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на списки Swi Prolog: Встречающиеся и остальные элементы списков

Помечено: , ,

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 6 мес., 2 нед. назад.

  • Автор
    Сообщения
  • #3974

    Zzz
    Участник

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

  • #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).

Для ответа в этой теме необходимо авторизоваться.