2011-12-18 4 views
6

Estaba tratando de lograr lo siguiente, si tengo dos listas, L1 y L2, quería que el resultado (R) fuera la "resta" de L2 de L1.Cuál es la diferencia entre una lista con algo ([_]) y cualquier cosa (_)

Ejemplo:

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

R = [1] 

yo era capaz de lograr esto, pero no puedo decir cuál es la diferencia entre _ y [_].

Si hago esto:

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). 

Funciona, si hago esto, me da falsa:

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). 

que podría suponer una lista que contiene nada [_] debería funcionar desde L2 será siempre ser una lista.

Respuesta

8

En realidad, _ coincide con una variable y una variable solamente. Aquí, querrá que coincida con 2, 3, 4, 5 (las cuatro variables). No puede. Solo puede coincidir con [2, 3, 4, 5] (la lista). Habría que escribir [_|_] manera que la cabeza y la cola se hacen coincidir ([2|[3, 4, 5]])

O [_, _, _, _, _, _, ...] con el número de _ siendo el número exacto de artículos en su lista de modo que cada elemento se corresponde adecuadamente con un anónimo variable.

Lo básico a recordar es que _ es solo una variable normal. Si tiene problemas para recordarlo, solo los nombres explícitos, como _Head o _Accumulator, para que se dé cuenta cuando escribe el código que la cosa que manipula es en realidad una variable, solo que no le importa (variable que comienza con _ ganado) Produce una advertencia de variable única, al menos en swi-pl, por lo que pueden utilizarse en lugar de _ para una mejor claridad general.

Editar: otra forma de decir es que en su título, usted piensa _ es cualquier cosa. Pero cualquier cosa puede ser nada, y cualquier cosa puede ser muchas cosas. _ solo puede ser una cosa. Es por eso que no funciona:]

+0

variable llamada '_' no es realmente una variable normal. Si tiene dos variables llamadas '_', no se unificarán, son dos variables diferentes. – svick

+0

variable normal se utilizó aquí para implicar que las variables anónimas no pueden hacer cosas que una variable regular no puede hacer cuando se trata de patrones de coincidencia. El hecho de que dos variables anónimas no necesariamente se unifican se muestra de todos modos en los ejemplos anteriores. Gracias por aclarar de todos modos! – m09

4

_ es nada ... foo, [1,2], la barra (42, foo [2,3,7]), etc
[_] es una lista que tiene exactamente un elemento que podría ser cualquier cosa

en su ejemplo, si L2 tiene más de un elementos (o es la lista vacía) entonces no va a coincidir con [_]

Cuestiones relacionadas