Homepage  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


.dsy:it. .dsy:it. Archive > Didattica > Didattica in generale
 
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].

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate