为什么我的序言谓词仅适用于其列表中的偶数个元素?
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 会生成 随机 测试查询,因此只能显示失败的查询,而不能证明正确性。
我的谓词 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 会生成 随机 测试查询,因此只能显示失败的查询,而不能证明正确性。