Пролог. Удалить четные индексы из списка
Я пытаюсь удалить элементы с четными индексами. Вот мой код:
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: все готово, результат - пустой список
- список с ровно одним элементом: все готово, результат - пустой список
- список с двумя или более элементами: отбросьте первый, поместите второй в качестве первого результата и примените предикат ко всем остальным.