Quote:
Originariamente inviato da e-commerce84
member2(X,[_|T]):- member2(X,T).
member2(X, [X|_]).
|
Il ragionamento e' un po' piu' semplice se vuoi.
Quote:
HEAD :- BODY
significa che stò dicendo: affinchè HEAD sia verificata, deve essere verificata BODY
Ok...in questo caso però (se fosse come dico io) BODY viene verificata DOPO che la HEAD ha tolto il primo elemento dalla lista...come mai?
|
Head non toglie elementi dalla lista. In prolog gli elementi non vengo mai aggiunti o tolti.
Si tratta solo di unificare (con delle eccezioni se vuoi, ma la regola generale e' quella).
Ti riscrivo il caso generico in forma piu' estesa
Codice:
member2(X,Y):-
Y = [_|T],
member2(X,T).
(Se mi ricordo correttamente la notazione) e' una formulazione assolutamente identica.
E va letta cosi'
"X e' un element di Y se sono verificate le seguenti condizioni:
1 - Y e' una lista, del cui primo elemento non mi frega niente, ma tutto il resto lo chiamo T
2 - X e' un elemento di T"
Come vedi non c'e' alcuna aggiunta o rimozione, si tratta semplicemente di identificare alcune variabili (o parti di), con altre.
Analogamente potresti pensare il caso base come
Codice:
member2(X, Y):-
Y = [X|_].
Ovvero "X e' un elemento di Y se il primo elemento di Y e' X stesso"
(ancora una volta, spero di ricordarmi correttamente la notazione, ma spero sia comunque chiaro il discorso)