2017-11-17 166 views
3

我有以下代碼:剩餘輸出_

pick_even([], []). 
pick_even([_, H | T], [H | R]) :- 
    pick_even(T, R). 
pick_even([_, H , _ | T], [H | R]) :- 
    pick_even(T, R). 

當運行查詢,?- pick_even(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,所以我期望這是一個非常簡單的語法修復。

回答

4
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的,我爲什麼要弄清楚什麼案件是有趣的?請爲我做這個!

而且,殷勤地,Prolog將填補空白。所以你只需要確保你所期望的所有答案都在這裏。

+1

@ Lance_P:其實,我只是想改善名稱並修改我的答案 - 出於某種原因提出了新的答案...... – false