Ответ в теме: Даны два списка и элемент. Выбрать элементы. Visual Prolog

      Комментарии к записи Ответ в теме: Даны два списка и элемент. Выбрать элементы. Visual Prolog отключены
#2453

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

solve(ListA, ListB, ElementA, ElementB):-
  nth0(Position, ListA, ElementA).
  nth0(Position, ListB, ElementB).

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

Однако, сделать такую реализацию nth0, чтобы она работала в обе стороны (и выбирала элемент на заданной позиции, и и определяла позицию элемента в списке) – не так просто. Поэтому возьмите правило pos для определения позиции (по ссылке подробное описание его работы), за тем исключением, что в вашем случае оно должно быть недетерминированным (возвращать все возможные решения):

pos(Element, [Element|_Tail], 0).
pos(Element, [_Head|Tail], Index):-
  pos(Element, Tail, TailPos), 
  Index = TailPos + 1.

Тогда решение запишется следующим образом:

solve(ListA, ListB, ElementA, ElementB):-
  pos(ElementA, ListA, Position),
  nth0(Position, ListB, ElementB).

Результаты работы программы на снимке экрана.