何のリスト([_])と何か(_)の違いは何ですか?

私は次のことを達成しようとしていました.L1とL2の2つのリストがある場合、結果(R)を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は常にリストになるので、 [_] なんらかのものを含むリストは動作するはずです。

6

2 答え

実際、 _ は1つの変数と1つの変数にのみ一致します。ここでは、 2、3、4、5 (4つの変数)と一致させたいと考えています。それはできません。 [2、3、4、5] (リスト)としか一致しません。頭と尾が一致するように( [2 | [3、4、5]] [_ | _]

または、 _ の数がリスト内の項目の正確な数である [_、_、_、_、_、...] 要素は匿名変数と適切にマッチします。

覚えておくべき基本的なことは、 _ が単なる普通の変数であることです。問題を覚えている場合は、 _Head _Accumulator のような明示的な名前をつけて、コードを書くときに、あなたは気にしません( _ で始まる変数は、少なくともswi-plでは変数singletonを生成しないので、 _ より全体的に明瞭にするため)。

Edit : one other way to say it is that in your title, you think _ is anything. But anything can be nothing, and anything can be many things. _ can only be one thing. That's why it doesn't work : ]

8
追加された
通常の変数は、匿名の変数がパターンにマッチするときに通常の変数ができないことを実行できないことを暗示するために使用されていました。とにかく上記の例では、2つの匿名変数が必ずしも統合されないという事実が示されていました。とにかく明確化のおかげで!
追加された 著者 m09,
_ という変数は実際には通常の変数ではありません。 _ という2つの変数がある場合、それらは統合されませんが、2つの異なる変数です。
追加された 著者 svick,

_ is anything... foo, [1,2], bar(42,foo[2,3,7]) etc
[_] is a list that has exactly one element that could be anything

in your example if L2 has more than one elements (or is the empty list) then it won't match with [_]

4
追加された