You are on page 1of 57

Paradigme de Programare

S.l. dr. ing. Andrei Olaru


slides: Mihnea Muraru si Andrei Olaru
Catedra de Calculatoare

2013 2013, semestrul 2

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 1/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Cursul 5 n Scheme Evaluare lene sa

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 2/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

ntrziere

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 4/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

deoarece ambii parametri sunt Implementare eronata, evalua ti n momentul aplicarii


ntrziere Abstrac tii Fluxuri Cautare 5 : 6/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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: 0 | reference to undefined identifier


x = #f comportament corect: y neevaluat contextul x = #t eroare: quote nu salveaza
ntrziere Abstrac tii Fluxuri Cautare 5 : 7/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Comportament corect: y evaluat la cerere x = #t y evaluat de 2 ori inecient


ntrziere Abstrac tii Fluxuri Cautare 5 : 8/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Comportament corect: y evaluat la cerere, o singura data evaluare lene sa


ntrziere Abstrac tii Fluxuri Cautare 5 : 9/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Promisiuni
Descriere

neevaluat al unei expresii Rezultatul nca


Exemplu: (delay (* 5 6))

Valori de prim rang n limbaj (v. Deni tia 4.8)


delay construie ste o promisiune

func tie nestricta


force respectarea unei promisiuni, evalund expresia for teaza doar la prima aplicare, s i salvndu-i valoarea

ncepnd cu a doua invocare, ntoarce, direct, valoarea memorata


ntrziere Abstrac tii Fluxuri Cautare 5 : 10/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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.

a expresiei Salvarea rezultatului primei evaluari

de celelalte Distingerea primei for tari

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 11/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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.

a expresiei Salvarea rezultatului primei evaluari

de celelalte Distingerea primei for tari efect lateral.

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 11/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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;

promisiunea; my-force evalueaza


1 2 3 4 5 6 7

( define-macro my-delay ( lambda ( expr ) ( make-promise ( lambda () , expr ) ) )) ( define my-force ( lambda ( p ) (p) ))
ntrziere Abstrac tii Fluxuri Cautare 5 : 12/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

( define x 1) ( define p ( my-delay ( if (= x 3) 0 ( begin ( set! x (+ x 1) ) ( my-force p ) 100) )))

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Abstrac tii

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 17/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Abstrac tii procedurale


Motivat , ie
Context:

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Abstrac tii procedurale


Exemplu

Exemplul 21.1.
1 2 3 4 5 6 7

( define sum-of-squares ( lambda ( x y ) (+ ( square x ) ( square y ) ) ) ) ( define square ( lambda ( x ) (* x x ) ) )

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Abstrac tii procedurale


Denit , ie

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.

Denit tie procedurala). , ia 21.2 (Abstrac


independenta de implementare. Func tionalitate autonoma,

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 20/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Abstrac tii procedurale


Cerint ,e

de utilizare Izolarea implementarii modularitate. Reutilizabilitate.


square, sum-of-squares generalizare la nivel de

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Abstrac tii de date


Motivat , ie

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Abstrac tii de date


Solut , ie

de Alternativ: 2 nivele, separate de o bariera abstractizare


cu expresii func tii ce opereaza cu evaluare ntrziata: utilizare pack, unpack interfat , a: expresii cu evaluare ntrziata, ca nchideri funct ionale sau promisiuni: , implementare

Bariera:
analiza detaliilor limiteaza dependen elimina tele dintre nivele
ntrziere Abstrac tii Fluxuri Cautare 5 : 23/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Abstrac tii de date


Denit , ie

Denit tie de date). , ia 21.3 (Abstrac


de separare a utilizarii unei structuri de date de Tehnica implementarea acesteia. Permit wishful thinking: utilizarea structurii naintea acesteia. implementarii

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 24/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Abstrac tii de date


diferite, aceeas Implementari , i utilizare; v1: promisiuni

Exemplul 21.4 (Continuare a exemplului 20.1).


1 2 3 4 5 6 7 8 9 10 11

( 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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Abstrac tii de date


diferite, aceeas Implementari , i utilizare; v2: inchideri

Exemplul 21.5 (Continuare a exemplului 20.1).


1 2 3 4 5 6 7 8 9 10 11

( 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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Fluxuri

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 27/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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]

avantajele celor 2 abordari? Cum mbinam

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 29/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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)

Construc tie s i utilizare:


separate la nivel conceptual modularitate ntrepatrunse la nivel de proces
ntrziere Abstrac tii Fluxuri Cautare 5 : 30/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

( define ones ( stream-cons 1 ones ) ) ( stream-take 5 ones ) ; (1 1 1 1 1)

Denit , ie cu promisiuni:
(define ones (delay (cons 1 ones)))

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 35/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Fluxuri Exemple
Flux de numere 1 discut , ie

n spa Extinderea se realizeaza tiu constant: 1 Ca proces: 1 Structural: 1


1 ...

()

...

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 36/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Fluxul numerelor naturale


Formulare explicita
1 2 3 4

( define naturals-from ( lambda ( n ) ( stream-cons n ( naturals-from (+ n 1) ) ) ) ) ( define naturals ( naturals-from 0) )

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Fluxul numerelor naturale


Formulare implicita
1 2 3

( define naturals ( stream-cons 0 ( stream-zip-with + ones naturals ) ) )

din ux poate utilizata pentru Por tiunea deja explorata explorarea por tiunii urmatoare

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 38/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Fluxul numerelor pare


variante n doua
1 2 3 4 5

( define even-naturals ( stream-filter even ? naturals ) ) ( define even-naturals ( stream-zip-with + naturals naturals ) )

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 39/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Fluxul numerelor prime


Metoda

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Fluxul numerelor prime


Implementare
1 2 3 4 5 6 7 8 9 10 11

( 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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Grafuri ciclice
Concept

rst (


second

second

) rst

Fiecare nod con tine:


cheia: key noduri: first, second legaturile catre doua

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 42/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Grafuri ciclice
Explorare

Explorarea grafului n cazul nchiderilor: nodurile sunt regenerate la ecare vizitare.


a
rst

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Cautare

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 45/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Spa tiul starilor unei probleme


Denit tiul starilor unei probleme). , ia 23.1 (Spa
Mul timea congura tiilor valide din universul problemei.

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Specicarea unei probleme prin spa tiul starilor


Aplica tie pe Paln

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Cautare n spa tiul starilor

Spa tiul starilor ca graf:


noduri: stari ale starilor muchii (orientate): transformari n stari succesor

Posibile strategii de cautare:


time: completa s la i optimala s adncime: incompleta i suboptimala

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 48/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

time Cautare n la
(2) Lenes ,a
1 2 3 4 5

( define l a z y - b r e a d t h - s e a r c h - g o a l ( lambda ( init expand goal ?) ( stream-filter goal ? ( l a zy - br e a dt h -s e a rc h init expand ) ) ))

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

Paradigme de Programare Andrei Olaru si Mihnea Muraru

Sfrs , itul cursului 5


, at Ce am nvat

ntrziate, abstractizare procedurala, Aplicat , ii ale evaluarii uxuri, cautare n spat , iul starilor.

ntrziere

Abstrac tii

Fluxuri

Cautare 5 : 52/ 52

Paradigme de Programare Andrei Olaru si Mihnea Muraru

You might also like