2011-12-18 15 views
6

私はL1とL2の2つのリストを持っていると、次のことを達成しようとしていました。 L1からのL2の「減算」。リストと何か([_])と何か(_)の違い

例:

L1 = [1,2,3] 
L2 = [2,3,4,5] 

R = [1] 

私はこれを達成することができましたが、私は_[_]の違いが何であるかを伝えることはできません。

私が行う場合は、この:

diferencia([],_,[]). 
diferencia([X|Tail],L2,R):- 
    member(X,L2), 
    diferencia(Tail,L2,R). 
diferencia([X|Tail],L2,[X|R]):- 
    not(member(X,L2)), 
    diferencia(Tail,L2,R). 

それは私がこれを行う場合、それは偽の私を与え、作品:

diferencia([],[_],[]). 
diferencia([X|Tail],L2,R):- 
    member(X,L2), 
    diferencia(Tail,L2,R). 
diferencia([X|Tail],L2,[X|R]):- 
    not(member(X,L2)), 
    diferencia(Tail,L2,R). 

は、私は以来、L2は常に動作するはず何[_]を含むリストを引き受けますリストになる

答えて

8

実際には、_は1つの変数と1つの変数にのみ一致します。ここでは、2, 3, 4, 5(4つの変数)に一致させたいと考えています。それはできません。それは[2, 3, 4, 5](リスト)にしか一致しません。頭と尾が一つ一つの要素が適切に匿名と一致するように、_の数はあなたのリスト内の項目の正確な数であることと([2|[3, 4, 5]]

または[_, _, _, _, _, _, ...]を一致するようにあなたは[_|_]を書く必要があるだろう変数。

覚えておくべき基本的なことは、_が単なる通常の変数であることです。問題を覚えている場合は、​​や_Accumulatorのような明示的な名前を使用すると、コードを書くときに実際には変数であることに気づくので、気にしないでください(_で始まる変数swi-plでは少なくともシングルトンの変数警告を生成しないので、全体的な明快さのために_の代わりに使用可能です)。

を編集してください。あなたのタイトルでは、_は何でもいいと言っていいでしょう。しかし何でも何もできず、何かが多くなることがあります。 _は1つのことに過ぎません。それはそれが動作しない理由です:]

+0

変数と一致しませんあなたの例では何も

可能性が一つの要素。 '_'という2つの変数がある場合、それらは統合されません。それらは2つの異なる変数です。 – svick

+0

通常の変数は、匿名変数が通常の変数でパターンにマッチするときにできないことを実行できないことを暗示するために使用されています。とにかく上記の例では、2つの匿名変数が必ずしも統合されないという事実が示されていました。とにかく明確化のおかげで! – m09

4

_がある
[_]が正確に持つリストがあり、[1,2]、バー(42、FOO [2,3,7])など何も... FOO L2は、複数の要素(または空のリストである)を持っているならば、それは `_`が本当に通常の変数ではありませんと呼ばれる[_]

関連する問題