Prolog 使用时的额外输出_

Prolog 使用时的额外输出_,prolog,Prolog,我有以下代码: pick_even([], []). pick_even([_, H | T], [H | R]) :- pick_even(T, R). pick_even([_, H , _ | T], [H | R]) :- pick_even(T, R). 运行查询时,?-pick_偶数(L[4,7])。,我希望接收输出: L = [_7650, 4, _7662, 7] ; L = [_7650, 4, _7662, 7, _7674] ; 相反,我收到了一些我不想

我有以下代码:

pick_even([], []).
pick_even([_, H | T], [H | R]) :-
    pick_even(T, R).
pick_even([_, H , _ | T], [H | R]) :-
    pick_even(T, R).
运行查询时,
?-pick_偶数(L[4,7])。
,我希望接收输出:

L = [_7650, 4, _7662, 7] ;
L = [_7650, 4, _7662, 7, _7674] ;
相反,我收到了一些我不想要的额外输出:

L = [_7650, 4, _7662, 7] ;
L = [_7650, 4, _7662, 7, _7674] ;
L = [_7650, 4, _7662, _7668, 7] ;
L = [_7650, 4, _7662, _7668, 7, _7680].
如何在不修改查询的情况下消除这些额外输出

我是prolog的新手,所以我希望这是一个非常简单的语法修复

list_evens([], []).
list_evens([_|Es], Fs) :-
   list_evens2(Es, Fs).

list_evens2([], []).
list_evens2([E|Es], [E|Fs]) :-
   list_evens(Es, Fs).
也就是说,您特别忘记了单元素列表的情况

对于测试,最好的方法是采用最通用的查询:

?- 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]
...
你这样说:

哦,序言,为什么我要弄清楚哪些案例是有意义的?请帮我做这个


并且,Prolog将努力地填补空白。因此,您只需确保您期望的所有答案都在这里。

@Lance\u p:实际上,我只是想改进名称并修改我的答案-出于某种原因,我得到了一个新的答案。。。