2010-12-07 120 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