2016-10-23 4 views
0

良い日にリストを変性する、フィルタリングとプロローグ

私はリスト[3,9,11,2,14]与えられた、私は6 Iよりも大きい任意の値をフィルタしたいというようなタスクを持っています今すぐ働いてください。

sift([],[]). 
sift([X|T], [X|Result]):- 
    X > 6,       /* is X greater than 6 */ 
    write(isList(Result)), 
    /* append([X]|['CCC'], [Result]), but this didn't work */ 
    sift(T,Result).    /* if so then go find the rest */ 
sift([ThrowAway|Tail],Result):- /* disregard the head */ 
    sift(Tail,Result).    /* and look in the tail */ 

前述のとおり、正しい結果が返されます。私のジレンマは、の値が6より大きい場合、条件に一致する番号の後に追加の値 'CCC'を追加したいと考えています。だから、

[9、CCC、11、CCC、14、CCC]のようになります。

私は、リストの内容を書き出すためにしようとしましたが、私はそれを行うとき、私は値を取得する:私はそれが何であるかを確認するために、リストの内容を点検しようとしている

12 ?- sift([3,9,11,2,14], Results). 
isList(_G2271)isList(_G2276)isList(_G2281) 
Results = [9, 11, 14]. 
13 ?- 

を。

私はこれをどのように行うことができますか?

TIA、

coson

答えて

1

問題append([X]|['CCC'], [Result])を追加すると、あなたはResult=[X,'CCC']をインスタンス化することです。 'CCC'Resultに追加するだけではなく、を['CCC']と追加すると結果がリスト(結果:Result=[X,'CCC'])になります。その後、sift(T,Result)と呼んだとき。結果が完全にインスタンス化されるので、要素を追加するとfalseが返されます。

?- sift([3,9,11,2,14], Results).が与える照会、また別の問題があります:

?- sift([3,9,11,2,14], Results). 
isList(_G1296)isList(_G1301)isList(_G1306) 
Results = [9, 11, 14] ; 
Results = [9, 11] ; 
isList(_G1301) 
Results = [9, 14] ; 
Results = [9] ; 
isList(_G1296)isList(_G1301) 
Results = [11, 14] ; 
Results = [11] ; 
isList(_G1296) 
Results = [14] ; 
Results = []. 

それが原因あなたの第三節は、すべての入力例と一致しているという事実に非常に多くのリストを提供します。これを修正するには、第3節にX=<6を追加することができます。

最後に書くことができ:両方の問題が修正されてい

sift([],[]). 
sift([X|T],[X,'CCC'|Result]):-X > 6,sift(T,Result). 
sift([ThrowAway|Tail],Result):-ThrowAway=<6,sift(Tail,Result). 

を。あなたの例:

?- sift([3,9,11,2,14], Results). 
Results = [9, 'CCC', 11, 'CCC', 14, 'CCC'] ; 
false.