e-commerce84
18-12-2012, 18:49
Ciao a tutti,
ho da poco iniziato a studiare per un esame che comprende l'uso del Prolog e sono un tantinello disperato con la visione dichiarativa di tale linguaggio.
Un esempio proposto è l'implementazione di una propria funzione member2 che, come la funzione member, restiuisce TRUE se un elemento appartiene alla lista e falso se l'elemento non appartiene alla lista.
Il codice proposto è semplicemente questo:
/* FATTO: (CASO BASE) L'elemento X appartiene alla lista se è in testa alla lista */
member2(X, [X|_]).
/* REGOLA: Se non è in testa è nella TAIL */
member2(X,[_|T]):- member2(X,T).
A grandi linee ho capito come funziona questo semplice programmino ma ho dei dubbi...please...se c'è qualcuno che ne sà qualcosa mi aiuti...
Il FATTO rappresenta il CASO BASE DELLA RICORSIONE
Sostanzialmente dicendo:
member2(X, [X|_]).
stò dicendo che la proposizione member2 è VERA se l'elemento X unifica con la head della lista nel quale stò cercando l'elemento X cercato.
La REGOLA rappresenta il caso generale in cui l'elemento cercato non è nella HEAD della lista quindi praticamente elimino il primo elemento dalla lista e ricorsivamente guardo se l'elemento X ricercato è nella HEAD della restante parte della lista:
member2(X,[_|T]):- member2(X,T).
La cosa che non mi è ben chiara è come funziona esattamente tale operazione...
in pratica penso che nella head della regola member2(X,[_|T]) fà si che X unifica con la variabile anonima _ (che unifica con tutto).
Poi chiama il body della regola member2(X,T)
A questo punto Prolog controlla se c'è un fatto del tipo:
member2(X, [X|_]).
con X che è sempre il nostro elemento da cercare ed il secondo membro [X|_] dove X è il primo elemento della TAIL di prima e vede se il fatto è verificato...se è verificato risponde TRUE, altrimenti richiama ricorsivamente
Ci può stare come raggionamento?
La cosa che però mi risulta assolutamente oscusa in questo ragionamento è la seguente: da quello che sò quando ho una regola del tipo:
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?
Grazie mille
Andrea
ho da poco iniziato a studiare per un esame che comprende l'uso del Prolog e sono un tantinello disperato con la visione dichiarativa di tale linguaggio.
Un esempio proposto è l'implementazione di una propria funzione member2 che, come la funzione member, restiuisce TRUE se un elemento appartiene alla lista e falso se l'elemento non appartiene alla lista.
Il codice proposto è semplicemente questo:
/* FATTO: (CASO BASE) L'elemento X appartiene alla lista se è in testa alla lista */
member2(X, [X|_]).
/* REGOLA: Se non è in testa è nella TAIL */
member2(X,[_|T]):- member2(X,T).
A grandi linee ho capito come funziona questo semplice programmino ma ho dei dubbi...please...se c'è qualcuno che ne sà qualcosa mi aiuti...
Il FATTO rappresenta il CASO BASE DELLA RICORSIONE
Sostanzialmente dicendo:
member2(X, [X|_]).
stò dicendo che la proposizione member2 è VERA se l'elemento X unifica con la head della lista nel quale stò cercando l'elemento X cercato.
La REGOLA rappresenta il caso generale in cui l'elemento cercato non è nella HEAD della lista quindi praticamente elimino il primo elemento dalla lista e ricorsivamente guardo se l'elemento X ricercato è nella HEAD della restante parte della lista:
member2(X,[_|T]):- member2(X,T).
La cosa che non mi è ben chiara è come funziona esattamente tale operazione...
in pratica penso che nella head della regola member2(X,[_|T]) fà si che X unifica con la variabile anonima _ (che unifica con tutto).
Poi chiama il body della regola member2(X,T)
A questo punto Prolog controlla se c'è un fatto del tipo:
member2(X, [X|_]).
con X che è sempre il nostro elemento da cercare ed il secondo membro [X|_] dove X è il primo elemento della TAIL di prima e vede se il fatto è verificato...se è verificato risponde TRUE, altrimenti richiama ricorsivamente
Ci può stare come raggionamento?
La cosa che però mi risulta assolutamente oscusa in questo ragionamento è la seguente: da quello che sò quando ho una regola del tipo:
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?
Grazie mille
Andrea