 | |
Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum |
AIUTO! esercizio prolog Clicca QUI per vedere il messaggio nel forum |
monik |
ciao a tutti!potreste dare un occhio a questo esercizio....questa è la soluzione proposta dalla prof.,ma non capisco perchè la lista L al secondo e terzo ramo esce, L = [ho, oggi, esami] e L = [ho, esami, oggi], mentre a me esce: L=[oggi,esami] e L=[oggi].
grazie in anticipo!
Esercizio 3.2
del(X,[X|T],T).
del(X,[Y|T],[Y|T1]):-del(X,T,T1).
soluzione:
del(oggi, L, [ho, esami]).
1 | oggi=>X, L=>[X|T], [ho, esami]=>T
L = [oggi, ho, esami]
Redo del(oggi, L, [ho, esami]).
2 | oggi=>X, L=>[Y|T], [ho, esami]=>[Y|T1], ho=>Y, [esami]=>T1
del(oggi, T, [esami]).
1 | oggi=>X, T=>[X|T'], [esami]=>T'
L = [ho, oggi, esami]
Redo del(oggi, T, [esami]).
2 | oggi=>X, T=>[Y|T'], [esami]=>[Y|T1], esami=>Y, []=>T1
del(oggi, T', []).
1 | oggi=>X, T'=>[X|T''], []=>T''
L = [ho, esami, oggi]
Redo del(oggi, T', []).
FAIL
:?:? |
picoid82 |
ti posto il trace fatto proprio con prologSWI:
1 ?- trace.
Yes
[trace] 1 ?- del(oggi,L,[ho,esami]).
Call: (7) del(oggi, _G508, [ho, esami]) ? creep
Exit: (7) del(oggi, [oggi, ho, esami], [ho, esami]) ? creep
L = [oggi, ho, esami] ;
Redo: (7) del(oggi, _G508, [ho, esami]) ? creep
Call: (8) del(oggi, _G566, [esami]) ? creep
Exit: (8) del(oggi, [oggi, esami], [esami]) ? creep
Exit: (7) del(oggi, [ho, oggi, esami], [ho, esami]) ? creep
L = [ho, oggi, esami] ;
Redo: (8) del(oggi, _G566, [esami]) ? creep
Call: (9) del(oggi, _G569, []) ? creep
Exit: (9) del(oggi, [oggi], []) ? creep
Exit: (8) del(oggi, [esami, oggi], [esami]) ? creep
Exit: (7) del(oggi, [ho, esami, oggi], [ho, esami]) ? creep
L = [ho, esami, oggi] ;
Redo: (9) del(oggi, _G569, []) ? creep
No
Quindi:
- primo pensa bene a cosa fa il programma: dato un elemento e una lista, se questo elemento è il primo lo toglie, altrimenti si richiama ricorsivamente sul resto della lista.
-secondo (sempre ragionando sul funzionamento) del(oggi, L, [ho,esami]). ti chiede: quali sono le liste L tali che togliendoci l'elemento "oggi" ottengo la lista [ho, esami]? ed ecco che hai una controprova del perchè hai quelle soluzioni giuste della prof ed errate tue
-terzo (facendo l'albero) le altre soluzioni vengon fuori perchè ricostruendo la riorsione hai:
2ramo) L=[Y|T] e Y=ho nel primo passo; T=[X'|T'], X'=oggi e T'=[esami] nel secondo passo, ricostruendo L=[ho,oggi,esami].
3ramo) L=[Y|T] e Y=ho nel promo passo; T=[Y'|T'], Y'=esami T1=[] nel secondo passo; T'=[X|T''], T''=[], X=oggi, ricostruendo L=[ho,esami,oggi]. |
|
|
|
|