Пролог. Удалить четные индексы из списка

Я пытаюсь удалить элементы с четными индексами. Вот мой код:

DOMAINS
    list = integer*
PREDICATES
    remove(list,list)
CLAUSES 
    remove([],[]).

    remove([_,H|T1], [H|T2]):-
        remove(T1, T2).

GOAL
    remove([1,2,3,4,5], NewList).

Я пропускаю первый элемент в списке и сохраняю второй в новом списке NewList, Но это работает хорошо только тогда, когда длина списка четная.

Что мне не хватает? Может быть, мой подход неверен?

1 ответ

Решение

Да, ваш предикат работает только для списка с четным числом элементов. Первый пункт remove/2 для пустого списка (без элементов), второе предложение для списков с двумя или более элементами. Затем вы передаете остальное, без двух элементов спереди.

В случае списка с нечетным числом элементов вам нужен базовый случай списка с ровно одним элементом. Логика в том, что если вы начнете считать индексы с 0, вы получите:

  • список emtpy: все готово, результат - пустой список
  • список с ровно одним элементом: все готово, результат - пустой список
  • список с двумя или более элементами: отбросьте первый, поместите второй в качестве первого результата и примените предикат ко всем остальным.
Другие вопросы по тегам