我有以下代码:
pick_even([], []).
pick_even([_, H | T], [H | R]) :-
pick_even(T, R).
pick_even([_, H , _ | T], [H | R]) :-
pick_even(T, R).
Run Code Online (Sandbox Code Playgroud)
运行查询时?- pick_even(L,[4,7]).
,我想收到输出:
L = [_7650, 4, _7662, 7] ;
L = [_7650, 4, _7662, 7, _7674] ;
Run Code Online (Sandbox Code Playgroud)
相反,我收到了一些我不想要的额外输出:
L = [_7650, 4, _7662, 7] ;
L = [_7650, 4, _7662, 7, _7674] ;
L = [_7650, 4, _7662, _7668, 7] ;
L = [_7650, 4, _7662, _7668, 7, _7680].
Run Code Online (Sandbox Code Playgroud)
如何在不修改查询的情况下消除这些额外的输出?
我是prolog的新手,所以我希望这是一个非常简单的语法修复.
list_evens([], []).
list_evens([_|Es], Fs) :-
list_evens2(Es, Fs).
list_evens2([], []).
list_evens2([E|Es], [E|Fs]) :-
list_evens(Es, Fs).
Run Code Online (Sandbox Code Playgroud)
也就是说,您特别忘记了单元素列表的情况.
而且,对于测试,最好的方法是采用最一般的查询:
?- list_even(Xs, Ys).
Xs = [],
Ys = []
; Xs = [_A],
Ys = []
; Xs = [_A,_B],
Ys = [_B]
; Xs = [_A,_B,_C],
Ys = [_B]
; Xs = [_A,_B,_C,_D],
Ys = [_B,_D]
; Xs = [_A,_B,_C,_D,_E],
Ys = [_B,_D]
; Xs = [_A,_B,_C,_D,_E,_F],
Ys = [_B,_D,_F]
...
Run Code Online (Sandbox Code Playgroud)
你这样说:
哦,Prolog,我为什么要弄清楚哪些案例是有意义的?请为我这样做!
并且,勤奋地,Prolog将填补空白.所以你只需要确保你期望的所有答案都在这里.