Почему мой предикат пролога работает только с четным числом элементов в списке? - PullRequest
1 голос
/ 20 марта 2019

Предполагается, что мой предикат eo будет функционировать так:

?- eo([a,b,c,d,e,f],L).

L = [b,d,f]

Мой код прямо сейчас:

eo([], []).
eo([_,X|L], [X | R]) :-
    eo(L, R).

Но он работает только тогда, когда заданный список является четным числомэлементы.Если дан список с нечетным количеством элементов, он просто выводит false.Любой совет?

РЕДАКТИРОВАТЬ:

?- eo([a,b,c,d,e,f,g],L).

L = [b,d,f]

ожидаемые результаты для нечетного числа элементов в списке.

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Это решение работает

eo([],[]).
eo([_],[]).
eo([_,X|L],[X|R]) :- eo(L,R).

Вам нужна вторая строка, которая обрабатывает список одного элемента,

0 голосов
/ 21 марта 2019

QuickCheck может помочь не только в поиске сбойных запросов для ошибочных предикатов, но также и сузить , чтобы свести эти ошибочные запросы к самому простому. В этом случае, используя lgtunit утилиту Logtalk для поддержки QuickCheck:

?- lgtunit::quick_check(eo(+list(character), -list(character))).
*     quick check test failure:
*       eo([d],[])
false.

Сравнивая ошибочный запрос с вашим кодом, выявляет ошибку, указанную в (других) ответах и ​​комментариях: нет условия для обработки списка ввода с одним элементом.

Но помните, что QuickCheck генерирует случайных тестовых запросов и, таким образом, может показывать только ошибочный запрос, не доказывая правильность.

...