2015-03-23 2 views
0

Я пытаюсь удалить элементы с четными индексами. Вот мой код:Пролог. Удалите даже индексы из списка

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. Но он работает только тогда, когда длина списка равна числу.

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

ответ

2

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

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

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

спасибо. Я добавил 'remove ([H | T1], []).' Базовый случай, но теперь у меня есть '3 решения: NewList = [], NewList = [2], NewList = [2,4]', когда список ' [1,2,3,4,5] '. – HelterShelter

+0

вы сказали, что «список с одним элементом: вы закончили, результат - это тот элемент», но если этот элемент один, то это даже элемент, и мне нужно его удалить. Я прав? – HelterShelter

+0

т. Е. Мой базовый регистр 'remove ([H | T1], [])' прав? Почему я получаю 3 ответа? если подсчет начинается с 1, то я использую 'remove ([H | T1], [H])' базовый случай, как вы сказали – HelterShelter