为什么我的序言谓词仅适用于其列表中的偶数个元素?

Why does my prolog predicate only work with an even number of elements in its list?

我的谓词 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]

是列表中奇数个元素的预期结果。

此解决方案有效

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

您需要第二行处理一个元素的列表,

QuickCheck 不仅可以帮助查找错误谓词的失败查询,还可以缩小 将那些失败的查询缩小为最简单的查询。在这种情况下,使用 Logtalk 的 lgtunit 工具 QuickCheck 支持:

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

将失败的查询与您的代码进行比较,清楚地表明(其他)答案和评论中指出的错误:没有用于处理具有单个元素的输入列表的子句。

但请记住,QuickCheck 会生成 随机 测试查询,因此只能显示失败的查询,而不能证明正确性。