为什么我的序言谓词仅与列表中的均匀数量一起使用



我的谓词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不仅可以帮助您查找故障谓词查询,而且还可以 narrow 降低那些失败的查询到最简单的查询。在这种情况下,使用LogTalk的lgtunit工具QuickCheck支持:

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

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

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

最新更新