У меня есть проблема с домашней работой, которая требует от нас написать предикат, который создает дубликат каждого элемента в списке, сначала используя линейную рекурсию, а затем используя хвостовую рекурсию.Мы не можем использовать встроенные предикаты.
Я мог бы решить это с помощью линейной рекурсии, но у меня возникли небольшие проблемы с хвостовой рекурсией.
Вот что я пытался:
dup_elem_tail([], Res, Res).
dup_elem_tail([P | R], Lst2, Aux) :- dup_elems_tail(R, Lst2, [P, P | Aux]).
Если ввод dup_elem_tail([a, b, c], L)
.Выход должен быть L = [a, a, b, b, c, c]
.Вместо этого я получил [c, c, b, b, a, a]
.
Теперь я знаю, где моя ошибка.В
dup_elem_tail([P | R], Lst2, Aux) :- dup_elems_tail(R, Lst2, [P, P | Aux]).
я «помещаю» две буквы «P» в левую часть списка, когда я должен поместить их в правую часть.Однако я не нахожу способ сделать это.