Professional Documents
Culture Documents
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 1/ 52
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 2/ 52
Cuprins
ntrzierea evaluarii Abstrac tii procedurale s i de date Fluxuri n spa Rezolvarea problemelor prin cautare lene sa tiul starilor
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 3/ 52
ntrziere
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 4/ 52
Motiva tie
Prin exemplu
Exemplul 20.1.
se implementeze func prod , astfel nct al Sa tia nestricta e evaluat doar daca primul este true: doilea parametru sa prod (F , y ) = 0 prod (T , y ) = y (y + 1)
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 5/ 52
Varianta 1
ncercare implementare directa
1 2 3 4 5 6 7 8 9 10 11
( define prod ( lambda ( x y ) ( if x (* y (+ y 1) ) 0) ) ) ( define test ( lambda ( x ) ( let (( y 5) ) ( prod x ( begin ( display " y " ) y ) ) ) ) ) ( test # f ) ( test # t )
Output:
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 6/ 52
Varianta 1
ncercare implementare directa
1 2 3 4 5 6 7 8 9 10 11
( define prod ( lambda ( x y ) ( if x (* y (+ y 1) ) 0) ) ) ( define test ( lambda ( x ) ( let (( y 5) ) ( prod x ( begin ( display " y " ) y ) ) ) ) ) ( test # f ) ( test # t )
Output: y 0 | y 30
Varianta 2
ncercare quote & eval
1 2 3 4 5 6 7 8 9 10 11
( define prod ( lambda ( x y ) ( if x (* ( eval y ) (+ ( eval y ) 1) ) 0) ) ) ; eval ( define test ( lambda ( x ) ( let (( y 5) ) ( prod x ' ( begin ( display " y " ) y ) ) ) ) ) ; quote ( test # f ) ( test # t )
Output:
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 7/ 52
Varianta 2
ncercare quote & eval
1 2 3 4 5 6 7 8 9 10 11
( define prod ( lambda ( x y ) ( if x (* ( eval y ) (+ ( eval y ) 1) ) 0) ) ) ; eval ( define test ( lambda ( x ) ( let (( y 5) ) ( prod x ' ( begin ( display " y " ) y ) ) ) ) ) ; quote ( test # f ) ( test # t )
Varianta 3
ncercare nchideri func tionale
1 2 3 4 5 6 7 8 9 10 11 12
( define prod ( lambda ( x y ) ( if x (* ( y ) (+ ( y ) 1) ) 0) ) ) ; ( y ) ( define test ( lambda ( x ) ( let (( y 5) ) ( prod x ( lambda () ( begin ( display " y " ) y ) ) ) ) ) ) ( test # f ) ( test # t )
Output:
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 8/ 52
Varianta 3
ncercare nchideri func tionale
1 2 3 4 5 6 7 8 9 10 11 12
( define prod ( lambda ( x y ) ( if x (* ( y ) (+ ( y ) 1) ) 0) ) ) ; ( y ) ( define test ( lambda ( x ) ( let (( y 5) ) ( prod x ( lambda () ( begin ( display " y " ) y ) ) ) ) ) ) ( test # f ) ( test # t )
Output: 0 | y y 30
Varianta 4
Promisiuni: delay & force
1 2 3 4 5 6 7 8 9 10 11 12
( define prod ( lambda ( x y ) ( if x (* ( force y ) (+ ( force y ) 1) ) 0) ) ) ( define test ( lambda ( x ) ( let (( y 5) ) ( prod x ( delay ( begin ( display " y " ) y ) ) ) ) ) ) ( test # f ) ( test # t )
Output:
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 9/ 52
Varianta 4
Promisiuni: delay & force
1 2 3 4 5 6 7 8 9 10 11 12
( define prod ( lambda ( x y ) ( if x (* ( force y ) (+ ( force y ) 1) ) 0) ) ) ( define test ( lambda ( x ) ( let (( y 5) ) ( prod x ( delay ( begin ( display " y " ) y ) ) ) ) ) ) ( test # f ) ( test # t )
Output: 0 | y 30
Promisiuni
Descriere
Promisiuni
Cerin te
Salvarea contextului computa tional al expresiei a carei s n acel evaluare este ntrziata i evaluarea ei ulterioara ator context aseman cu nchiderile func tionale.
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 11/ 52
Promisiuni
Cerin te
Salvarea contextului computa tional al expresiei a carei s n acel evaluare este ntrziata i evaluarea ei ulterioara ator context aseman cu nchiderile func tionale.
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 11/ 52
Promisiuni
Implementare n Scheme (1)
numai p = o promisiune expresie care se evalueaza s cnd este necesar prima oara, , i ret , ine valoarea la care s-a evaluat;
my-delay construies , te promisiunea;
( define-macro my-delay ( lambda ( expr ) ( make-promise ( lambda () , expr ) ) )) ( define my-force ( lambda ( p ) (p) ))
ntrziere Abstrac tii Fluxuri Cautare 5 : 12/ 52
Promisiuni
Implementare n Scheme (2a)
1 2 3 4 5 6 7 8
( define make-promise ( lambda ( closure ) ( let (( ready ? # f ) ( result # f ) ) ( lambda () ; promisiunea ( if ( not ready ?) ( begin ( set! ready ? # t ) ( set! result ( closure ) ) ) ) result ))))
Dar daca:
1 2 3 4
100, des de o (my-force p) returneaza , i prima valoare calculata a fost 0 (cnd x a ajuns la 3). promisiune terminata
ntrziere Abstrac tii Fluxuri Cautare 5 : 13/ 52
Promisiuni
Implementare n Scheme (2b corect)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
( define make-promise ( lambda ( closure ) ( let (( ready ? # f ) ( result # f ) ) ; promisiunea ( lambda () ( if ready ? result ( let (( r ( closure ) ) ) ( if ready ? result ( begin ( set! ready ? # t ) ( set! result r ) result ) )) )) )))
ntrziere Abstrac tii Fluxuri Cautare 5 : 14/ 52
Promisiuni
Implementare n Scheme discut , ie
Situa tii n care evaluarea expresiei mpachetate ea nsa si, for declan seaza, tarea promisiunii a doua vericare a lui ready?. Promisiuni obiecte cu stare. Prima for tare efecte laterale.
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 15/ 52
Observa tii
ntre mecanismul de ntrziere s Dependen ta i cel de a expresiilor nchideri/aplica evaluare ulterioara tii (varianta 3), delay/force (varianta 4) etc. mare de modicari la nlocuirea unui mecanism Numar mare de func existent, utilizat de un numar tii Cum se pot diminua dependen tele?
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 16/ 52
Abstrac tii
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 17/ 52
Probleme cu complexitate ridicata. unde? Descompunere n subprobleme, dar pna Nevoia restrngerii detaliilor luate n calcul la un anumit moment abstractizare. Lucru la nivel conceptual, al gndirii programatorului, deasupra nivelului opera tiilor elementare din limbaj.
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 18/ 52
Exemplul 21.1.
1 2 3 4 5 6 7
a patratelor, sum-of-squares: conceptul de suma deasupra conceptului de ridicare la patrat square: conceptul de ridicare la patrat, deasupra conceptului de nmul tire
ntrziere Abstrac tii Fluxuri Cautare 5 : 19/ 52
Combinarea conceptelor pentru ob tinerea de concepte mai complexe, cu propria identitate. cu square, din perspectiva sum-of-squares, substituibila func orice alta tie cu acela si comportament.
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 20/ 52
numere Func tionale (e.g. map, filter, foldl) generalizare la nivel de comportament ! Gndirea n termenii diverselor abstrac tii raspndite (patterns) aplicarea lor n situa tii noi.
ntrziere Abstrac tii Fluxuri Cautare 5 : 21/ 52
expresiile cu evaluare Exemplu: cum reprezentam ntrziata? 1 singur nivel: Abordarea din sec tiunea precedenta:
cu expresii func tii ce opereaza cu evaluare ntrziata: implementare s i utilizare, de nchideri sau promisiuni sub forma
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 22/ 52
Bariera:
analiza detaliilor limiteaza dependen elimina tele dintre nivele
ntrziere Abstrac tii Fluxuri Cautare 5 : 23/ 52
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 24/ 52
( define-macro pack ( lambda ( expr ) ( delay , expr ) ) ) ( define unpack force ) ( define prod ( lambda ( x y ) ( if x (* ( unpack y ) (+ ( unpack y ) 1) ) 0) ) ) ( define test ( lambda ( x ) ( let (( y 5) ) ( prod x ( pack ( begin ( display " y " ) y ) ) ) ) ) )
ntrziere Abstrac tii Fluxuri Cautare 5 : 25/ 52
( define-macro pack ( lambda ( expr ) ( lambda () , expr ) ) ) ( define unpack ( lambda ( p ) ( p ) ) ) ( define prod ( lambda ( x y ) ( if x (* ( unpack y ) (+ ( unpack y ) 1) ) 0) ) ) ( define test ( lambda ( x ) ( let (( y 5) ) ( prod x ( pack ( begin ( display " y " ) y ) ) ) ) ) )
ntrziere Abstrac tii Fluxuri Cautare 5 : 26/ 52
Fluxuri
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 27/ 52
Motiva tie
Exemplul 22.1.
se determine suma numerelor pare din intervalul [a, b]. Sa
1 2 3 4 5 6 7 8 9 10 11
( define even-sum-iter ; varianta 1 ( lambda ( a b ) ( let iter (( n a ) ( sum 0) ) ( cond (( > n b ) sum ) (( even ? n ) ( iter (+ n 1) (+ sum n ) ) ) ( else ( iter (+ n 1) sum ) ) ) ) ) ) ( define even-sum-lists ; varianta 2 ( lambda ( a b ) ( foldl + 0 ( filter even ? ( interval a b ) ) ) ) )
ntrziere Abstrac tii Fluxuri Cautare 5 : 28/ 52
Observa tii
(d.p.d.v. proces): ecienta, datorita Varianta 1 iterativa spa tiului suplimentar constant Varianta 2 foloses , te liste:
s eleganta i concisa datorita spa inecienta, tiului posibil mare, ocupat la un moment dat toate numerele din intervalul [a, b]
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 29/ 52
Fluxuri
Caracteristici
Secven te construite par tial, extinse la cerere, ce iluzia completitudinii structurii creeaza listelor cu ecien mbinarea elegan tei manipularii ta calculului incremental Bariera de abstractizare:
componentele listelor evaluate la construc tie (cons) componentele uxurilor evaluate la selec tie (cdr)
Fluxuri
Operatori: construct , ie s , i select , ie
cons, car, cdr, nil, null?.
1 2 3 4 5 6 7 8 9 10 11
( define-macro stream-cons ( lambda ( head tail ) ( cons , head ( pack , tail ) ) ) ) ( define stream-car car ) ( define stream-cdr ( lambda ( s ) ( unpack ( cdr s ) ) ) ) ( define stream-null ' () ) ( define stream-null ? null ?)
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 31/ 52
Fluxuri
Operatori: take s , i drop select , ie / eliminare dintr-un ux a n elemente.
1 2 3 4 5 6 7 8 9 10 11 12
( define stream-take ( lambda ( n s ) ( cond (( zero ? n ) ' () ) (( stream-null ? s ) ' () ) ( else ( cons ( stream-car s ) ( stream-take (- n 1) stream-cdr s ) ) ) ))) ( define stream-drop ( lambda ( n s ) ( cond (( zero ? n ) s ) (( stream-null ? s ) s ) ( else ( stream-drop (- n 1) ( stream-cdr s ) ) ) )))
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 32/ 52
Fluxuri
Operatori: map s , i filter operatori de aplicare s , i ltrare pe liste.
1 2 3 4 5 6 7 8 9 10 11 12 13
( define stream-map ( lambda ( f s ) ( if ( stream-null ? s ) s ( stream-cons ( f ( stream-car s ) ) ( stream-map f ( stream-cdr s ) ) ) ))) ( define stream-filter ( lambda ( f ? s ) ( cond (( stream-null ? s ) s ) (( f ? ( stream-car s ) ) ( stream-cons ( stream-car s ) ( stream-filter f ? ( stream-cdr s ) ) ) ) ( else ( stream-filter f ? ( stream-cdr s ) ) ) )))
ntrziere Abstrac tii Fluxuri Cautare 5 : 33/ 52
Fluxuri
Operatori: zip, append s , i conversie
1 2 3 4 5 6 7 8 9 10 11 12 13 14
( define stream-zip ( lambda ( f s1 s2 ) ( if ( stream-null ? s1 ) s2 ( stream-cons ( f ( stream-car s1 ) ( stream-car s2 ) ) ( stream-zip f ( stream-cdr s1 ) ( stream-cdr s2 ) ) ) ))) ( define stream-append ( lambda ( s1 s2 ) ( if ( stream-null ? s1 ) s2 ( stream-cons ( stream-car s1 ) ( stream-append ( stream-cdr s1 ) s2 ) ) ) ) ) ( define list- > stream ( lambda ( L ) ( if ( null ? L ) stream-null ( stream-cons ( car L ) ( list- > stream ( cdr L ) ) ) ) ) )
ntrziere Abstrac tii Fluxuri Cautare 5 : 34/ 52
Fluxuri Exemple
Implementarea unui ux de numere 1
Denit , ie cu nchideri:
(define ones (lambda ()(cons 1 (lambda ()(ones)))))
Denit , ie cu uxuri:
1 2
Denit , ie cu promisiuni:
(define ones (delay (cons 1 ones)))
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 35/ 52
Fluxuri Exemple
Flux de numere 1 discut , ie
()
...
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 36/ 52
nchideri: multiple parcurgeri ale uxului determina reevaluarea por tiunilor deja explorate. Promisiuni: multiple parcurgeri ale uxului determina evaluarea dincolo de por tiunile deja explorate.
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 37/ 52
din ux poate utilizata pentru Por tiunea deja explorata explorarea por tiunii urmatoare
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 38/ 52
( define even-naturals ( stream-filter even ? naturals ) ) ( define even-naturals ( stream-zip-with + naturals naturals ) )
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 39/ 52
Ciurul lui Eratostene. Pornim de la uxul numerelor naturale, ncepnd cu 2. Elementul curent din uxul ini tial apar tine uxului numerelor prime. Restul uxului generat se ob tine
eliminnd multiplii elementului curent din uxul ini tial; continund procesul de ltrare, cu elementul urmator.
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 40/ 52
( define sieve ( lambda ( s ) ( if ( stream-null ? s ) s ( stream-cons ( stream-car s ) ( sieve ( stream-filter ( lambda ( n ) ( not ( zero ? ( remainder n ( stream-car s ) ) ) ) ) ( stream-cdr s ) ))) ))) ( define primes ( sieve ( naturals-from 2) ) )
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 41/ 52
Grafuri ciclice
Concept
rst (
second
second
) rst
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 42/ 52
Grafuri ciclice
Implementare
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
( define-macro node ( lambda ( key fst snd ) ( pack ( list , key , fst , snd ) ) ) ) ( define key car ) ( define fst ( compose unpack cadr ) ) ( define snd ( compose unpack caddr ) ) ( define graph ( letrec (( a ( node ' a a b ) ) ( b ( node ' b b a ) ) ) ( unpack a ) ) ) ( eq ? graph ( fst graph ) ) ; similar cu == din Java ; # f pentru inchideri , # t pentru promisiuni
ntrziere Abstrac tii Fluxuri Cautare 5 : 43/ 52
Grafuri ciclice
Explorare
a
second
rst
a ...
...
second rst
rst
b ... ... b
second second rst second
b ...
...
second rst
rst
a ... ...
second
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 44/ 52
Cautare
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 45/ 52
Exemplul 23.2.
se determine palindroamele de Fie problema Paln : Sa lungime cel pu tin n, ce se pot forma cu elementele unui alfabet xat. Starile problemei toate s irurile generabile cu elementele alfabetului respectiv.
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 46/ 52
s Starea ini tiala: irul vid Operatorii de generare a starilor succesor ale unei stari: inserarea unui caracter la nceputul unui s ir dat tii de scop a unei Operatorul de vericare a proprieta palindrom stari:
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 47/ 52
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 48/ 52
time Cautare n la
Obis , nuita
1 2 3 4 5 6 7 8 9
( define b re a dt h -s e a rc h -g o a l ( lambda ( init expand goal ?) ( letrec (( search ( lambda ( states ) ( if ( null ? states ) ' () ( let (( state ( car states ) ) ( states ( cdr states ) ) ) ( if ( goal ? state ) state ( search ( append states ( expand state ) ) ) )))))) ( search ( list init ) ) ) ) )
Generarea unei singure solu tii spa Cum le ob tinem pe celelalte, mai ales daca tiul e innit?
ntrziere Abstrac tii Fluxuri Cautare 5 : 49/ 52
time Cautare n la
(1) uxul starilor scop Lenes ,a
1 2 3 4 5 6 7 8 9 10 11
( define l az y -b r ea d t h- s ea r c h ( lambda ( init expand ) ( letrec (( search ( lambda ( states ) ( if ( stream-null ? states ) states ( let (( state ( stream-car states ) ) ( states ( stream-cdr states ) ) ) ( stream-cons state ( search ( stream-append states ( expand state ) ) ) )))))) ( search ( stream-cons init stream-null ) ) )))
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 50/ 52
time Cautare n la
(2) Lenes ,a
1 2 3 4 5
Nivel nalt, conceptual: separare ntre explorarea spa tiului s i identicarea starilor scop. Nivel scazut, al instruc tiunilor: ntrepatrunderea celor aspecte. doua Aplicat , ii:
Palindroame Problema reginelor
ntrziere Abstrac tii Fluxuri Cautare 5 : 51/ 52
ntrziate, abstractizare procedurala, Aplicat , ii ale evaluarii uxuri, cautare n spat , iul starilor.
ntrziere
Abstrac tii
Fluxuri
Cautare 5 : 52/ 52