Построить на основе списка L новый, содержащий номера вхождений элементов, принадлежащих списку H - Prolog

Узнай цену своей работы

Формулировка задачи:

ЗАДАЧА: Построить на основе списка L новый, содержащий номера вхождений элементов, принадлежащих списку H. МОЕ РЕШЕНИЕ:
Листинг программы
  1. pos(E, [E|_T], 0):-!.
  2. pos(E, [_H|T], Pos):-
  3. pos(E, T, TPos),
  4. Pos is TPos+1.
  5. % task_2(L1, L2, Result)
  6. task_2(_L1, [], []):-!.
  7. task_2(L1, [HL2|TL2], [(HL2,Pos)|TR]):-
  8. pos(HL2, L1, Pos), !,
  9. task_2(L1, TL2, TR).
  10. task_2(L1, [_HL2|TL2], TR):-
  11. task_2(L1, TL2, TR).
Сейчас при вводе, например таких входных данных:
Листинг программы
  1. task_2([1,2,2,3,4,4],[2,4],X).
Выводится так:
Листинг программы
  1. X = [ (2, 1), (4, 4)].
А нужно так:
Листинг программы
  1. X = [ (2, 1), (2,2), (4, 4), (4,5)].
То есть нужно чтобы он выводил номера вхождений и повторяющихся элементов тоже. ПОМОГИТЕ СРОЧНО! Кину 1000р на телефон!

Решение задачи: «Построить на основе списка L новый, содержащий номера вхождений элементов, принадлежащих списку H»

textual
Листинг программы
  1. pos_list(_, [], _, R, R).
  2. pos_list(E, [E|T], N, Old, [(E,N)|TP]):-
  3.     !,
  4.     NN is N + 1,
  5.     pos_list(E, T, NN, Old, TP).
  6. pos_list(E, [_|T], N, Old, L):-
  7.     NN is N + 1,
  8.     pos_list(E, T, NN, Old, L).
  9.  
  10. % task_2(L1, L2, Result)
  11. task_2(_L1, [], []).
  12. task_2(L1, [HL2|TL2], Res):-
  13.     task_2(L1, TL2, ResT),
  14.     pos_list(HL2, L1, 0, ResT, Res).

Объяснение кода листинга программы

В коде представлены две процедуры: pos_list и task_2. Процедура pos_list принимает четыре аргумента:

  1. E - элемент, вхождения которого нужно найти в списке L
  2. L - список, в котором нужно найти вхождения элемента E
  3. N - номер текущего вхождения элемента E (начинается с 0)
  4. Old - результат предыдущего вызова (для рекурсивного случая)
  5. TP - результат предыдущего вызова (для рекурсивного случая) Если элемент E присутствует в списке L, то он добавляется в результат (список L) с указанием его номера. Процедура task_2 принимает три аргумента:
  6. L1 - список, элементы которого нужно обработать
  7. L2 - список элементов, которые нужно найти в списке L1
  8. Res - результат выполнения задачи Если список L1 пуст, то список результатов также будет пустым. В противном случае, рекурсивно вызывается процедура task_2 для оставшейся части списка L1 и результатов предыдущего вызова. Кроме того, вызывается процедура pos_list для каждого элемента списка L2, чтобы найти его номер в списке L1. Эти номера вместе с соответствующими элементами добавляются в список результатов.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы