2015-12-21 1 views
1

У меня есть функция:Prolog списки расщепления

onlySecond([],[]). 

onlySecond([H1,H2|T1],[H2|T2]) :- onlySecond(T1,T2). 

Он возвращает каждый второй элемент в списке.

Но мне любопытно, почему он ничего не возвращает (по моему мнению, он должен возвращать [] - пустой список), когда первый аргумент является списком с 1 элементом. Пример:

onlySecond([1],X). - not return anything.. but why it doesn't return []?? 

ответ

2

Ваша программа имеет большую проблему: она возвращает false для любого списка нечетного размера. Причина этого в том, что нет предложения onlySecond/2, который объединит список, который имеет ровно один элемент - условие, которое вы обязательно достигнете, когда начнете с списка с нечетным количеством элементов, поскольку каждый рекурсивный вызов уменьшает длина исходного списка на два:

  • не унифицировать с первым пунктом, поскольку [1] является не пустой список
  • не унифицировать со вторым пунктом, поскольку [1] имеет меньше два предмета.

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

onlySecond([_], []). 

Добавление этого положения делает ваш код работает для списков нечетной длины, а также.

Demo.

+0

Спасибо! Прекрасно работает! – Src

 Смежные вопросы

  • Нет связанных вопросов^_^