Ответ в теме: Косвенная рекурсия не работает

      Комментарии к записи Ответ в теме: Косвенная рекурсия не работает отключены
#2459

Прочитал более детально что именно Вы пытаетесь сделать. На мой взгляд, сам подход не верен. По теме можно почитать статьи:

  • Рекурсия в программировании — описан анализ рекурсивных алгоритмов, при этом можно заметить, что анализу поддаются только алгоритмы записанные определенным образом. Для всех более сложных вариантов, включая косвенную рекурсию нет способов даже оценить трудоемкость, поэтому их строго не рекомендуется использовать;
  • SOLID принципы — описаны наиболее общие 5 принципов хорошего кода и способов рефакторинга. Надо обратить внимание на принципы, призванные снизить сложность, т.к. у вас она зашкаливает из-за сильных связей между функциями и попыткой решить сразу несколько задач.

Я бы сначала обработал второй список и на его основе сформировал новый, при этом каждому элементу приписал бы количество повторений (параметр Б), а затем — отфильтровал бы записи БД:

requirement(Model, Buses, Requirement):-
  count_repeat(Buses, RepeatBuses),
  filter_buses(Model, RepeatBuses, Requirement).

Для формирования списка Б с повторениями можно использовать готовую функцию подсчета повторений:

count_repeat([], []):-!.
count_repeat([Head|Tail], [(Head, Count)|CountTail]):-
  count(Tail, Head, Count),
  count_repeat(Tail, CountTail).

Такая функция реализуется очень просто, не менее легко тестируется, не зависит от других функций и значительно упрощает задачу.