我的谓词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]
是列表中奇数个元素的预期结果。
答案 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会生成随机测试查询,因此只能显示失败的查询,而不能证明其正确性。