为什么我的序言谓词只对列表中的偶数个元素起作用?

时间:2019-03-20 03:27:16

标签: list prolog predicate

我的谓词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 个答案:

答案 0 :(得分:1)

此解决方案有效

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

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

答案 1 :(得分:0)

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

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

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

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