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.
variable llamada '_' no es realmente una variable normal. Si tiene dos variables llamadas '_', no se unificarán, son dos variables diferentes. – svick
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