2011-12-18 6 views
6

Stavo cercando di realizzare quanto segue, se ho due liste, L1 e L2, volevo che il risultato (R) fosse la "sottrazione" di L2 da L1.Qual è la differenza tra un elenco con qualsiasi cosa ([_]) e qualsiasi cosa (_)

Esempio:

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

R = [1] 

ero in grado di raggiungere questo obiettivo, ma non posso dire che cosa è la differenza tra _ e [_].

Se faccio questo:

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

Funziona, se faccio questo, mi dà 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). 

Vorrei assumere una lista che contiene nulla [_] dovrebbe funzionare dal L2 sarà sempre sii una lista.

risposta

8

In realtà, _ corrisponde solo a una variabile e una variabile. Qui, vorresti che corrisponda a 2, 3, 4, 5 (le quattro variabili). Non può Può solo corrispondere a [2, 3, 4, 5] (l'elenco). Dovresti scrivere [_|_] modo che la testa e la coda sono abbinati ([2|[3, 4, 5]])

O [_, _, _, _, _, _, ...] con il numero di _ essere l'esatto numero di elementi nella vostra lista in modo che ogni singolo elemento è correttamente abbinato con un anonimo variabile.

La cosa fondamentale da ricordare è che _ è solo una variabile normale. Se hai problemi a ricordarlo, solo nomi espliciti, come _Head o _Accumulator, in modo che ti rendi conto quando scrivi il tuo codice che la cosa che manipoli è in realtà una variabile, solo che non ti interessa (variabile a partire da _ vinta 'produrre un avvertimento variabile singleton, almeno in swi-pl, quindi sono utilizzabili invece di _ per una migliore chiarezza generale).

Modifica: un altro modo per dire che nel tuo titolo, pensi che _ sia qualsiasi cosa. Ma tutto può essere niente e qualsiasi cosa può essere molte cose. _ può essere solo una cosa. Ecco perché non funziona:]

+0

variabile chiamata '_' in realtà non è una variabile normale. Se hai due variabili chiamate '_', non si unificheranno, sono due variabili diverse. La variabile normale – svick

+0

è qui usata per implicare che le variabili anonime non possono fare cose che una variabile normale non può fare quando si tratta di abbinare i modelli. Il fatto che due variabili anonime non si uniscano necessariamente è stato comunque mostrato negli esempi sopra. Grazie per aver chiarito comunque! – m09

4

_ è nulla ... foo, [1,2], bar (42, foo [2,3,7]), ecc
[_] è una lista che ha esattamente un elemento che potrebbe essere qualsiasi cosa

nel tuo esempio, se L2 ha più di un elementi (o l'elenco vuoto) allora non corrisponderà con [_]

Problemi correlati