2010-12-07 85 views
-2

這與我最後一個問題類似,但我現在要使用字母過濾列表。篩選器列表序言

test_filter0 :- filter_list([a,b,c,a,b,c],a,[a,a]). 
test_filter1 :- filter_list([abc,abc,abc,bc,bc,bc,cd],bc,[bc,bc,bc]). 
test_filter2 :- filter_list([a,b,c,d,e,f,g],h,[]). 
test_filter3 :- filter_list([a,b,b,b,c,b,b],b,[b,b,b,b,b]). 
test_filter :- test_filter0, test_filter1, test_filter2, test_filter3. 

我想:

filter_list([],C,[]) :- true, !. 
filter_list([A|L1],C,[A|L2]) :- A==C, filter_list(L1,C,L2). 
filter_list([A|L1],C,L2) :- C==A, filter_list(L1,C,L2). 

回答

-1

非常接近,你只需要一個不平等的filter_list/3你最後的子句中,像這樣的:

filter_list([], C, []). 
filter_list([A|L1], C, [A|L2]) :- 
    A == C, % equal to 
    filter_list(L1, C, L2). 
filter_list([A|L1], C, L2) :- 
    C \== A, % not equal to 
    filter_list(L1, C, L2). 

爲了使這更有效,你可以在A == C之後添加一個剪輯(!)以提交到該分支,因爲Prolog將爲執行最後一個子句留下一個選擇點,只要第二個是i因爲最後一個包含前者([A|L1], C, [A|L2])的綁定模式(即[A|L1], C, L2)。請注意,第一個子句實際上並不需要剪切,因爲[], C, []的綁定模式未包含在謂詞的任何其他後續子句中。

+0

感謝那些懦弱的人,他在沒有留下任何評論的情況下,對我的答案進行了低估。 – sharky 2015-05-04 01:19:53