2010-12-07 2 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が2番目のときに最後の句を実行するためのchoicepointを残すためです最後の部分は、前者([A|L1], C, [A|L2])を包含する結合パターン(すなわち、[A|L1], C, L2)を有するため、nvokedされる。 [], C, []の束縛パターンは述語の他の後続節の束縛パターンに包含されていないので、最初の節は実際にはカットを必要としないことに注意してください。

+0

コメントを残さずにすべての回答をdownvotingしている臆病者に感謝します。 – sharky