Ответ в теме: Элементы с нечетными индексами двух списков

      Комментарии к записи Ответ в теме: Элементы с нечетными индексами двух списков отключены
#2493

У вас реализован следующий алгоритм:

  1. из первого списка выбираются пары элементов, при этом второй элемент игнорируется, а первый добавляется к результату, полученному при рекурсивной обработке хвоста первого списка;
  2. если пару элементов выбрать нельзя, но первый список состоит из единственного элемента – этот элемент дописывается в результат, полученный при обработке пустого списка в качестве первого аргумента;
  3. если первый список пуст – то аналогичным образом обрабатывается второй список;
  4. если оба списка пусты – результат работы эквивалентен пустому списку.

Что касается ошибки – у вас последний элемент второго списка игнорируется, но ведь вы сами написали такое поведение во втором правиле:
odd_indexes_append([],[_],[]):-!.
Нужно понимать так, что если первый список пуст, а второй состоит из одного элемента – верни пустой список. Замените этот фрагмент на следующий чтобы программа заработала:
odd_indexes_append([],[SingleElement],[SingleElement]):-!.

Тут видно (и а алгоритме, и в коде), что решение не достаточно выразительное (значительная часть кода дублируется два раза). Достаточно было написать функцию, которая принимает один список и переписывает элементы с нечетными индексами в результирующий список. Для решения вашей задачи было бы достаточно вызвать такую функцию два раза (это было бы гораздо эффективнее, кстати) и объединить результаты.

При этом для выделения элементов с нечетными индексами можно использовать готовую функцию split, которая более чем тривиальна, а для соединения результатов – встроенную во многие диалекты пролога – функцию append:

odd_indexes_append(A, B, Appended):-
  split(A, OddA, _EvenA),
  split(B, OddB, _EvenB),
  append(OddA, OddB, Appended).

Разве не проще? :)