Sunteți pe pagina 1din 3

Programare Logica Laboratorul 4

Acumulatori, Liste deschise si liste cu diferente


Isabela Dramnesc

Intreb
ari din curs
Ce ntelegeti prin domeniu inductiv? Cum definim o lista?
Cum definim recursia n Prolog? Dati 2 exemple!
Scrieti predicatul pentru concatenarea a doua liste concatenare(+L1, +L2, ?Rez)
Scrieti predicatul pentru calculul factorialului unui numar f actorial(+N, ?F )

Concepte
Operatii pe liste
Acumulatori
Diferenta dintre programe cu acumulatori si fara
Liste deschise si liste cu diferente

Acumulatori

Se descompune lista p
an
a se ajunge la conditia limita, atunci se obtine solutia
care este retinut
a n acumulator, apoi are loc procesul invers descompunerii
listei, iar rezultatul este solutia care a fost retinuta n acumulator.
1) Inversa listei:
a) f
ar
a acumulatori:
inversa ( [ ] , [ ] ) .
i n v e r s a ( [ H|T ] ,X): i n v e r s a (T, T1 ) , c o n c a t e n a r e ( T1 , [ H] ,X ) .
Explicati ce se nt
ampl
a la interogarea (utilizati trace)
?- inversa([1,2,3],X).
b) cu acumulatori:
i n v e r s a 2 (L ,R): i n v e r s a A c c (L , [ ] , R ) .
/ i n v o c a r e a v a r i a n t e i cu a c u m u l a t o r i /
i n v e r s a A c c ( [ ] , R,R ) .
/ c o n d i t i e l a l i m i t a /
i n v e r s a A c c ( [ H|T ] , A,R):
i n v e r s a A c c (T , [ H|A] ,R ) .
/ a p e l r e c u r s i v cu a c u m u l a t o r i /

Incercati un trace de inversaAcc([1,2,3],[],R).


S
i un trace de inversa2([1,2,3],X). Comparati costurile pentru inversa si pentru inversa2.
2) Predicatul care calculeaza termenul n din sirul Fibonacci: 1,1,2,3,5,8,13,21,...,
n care f (n) = f (n 1) + f (n 2) pentru n > 2.
(a) varianta f
ar
a acumulator:
fibonacci (1 ,1).
fibonacci (2 ,1).
f i b o n a c c i (N, F): N>2,N1 i s N1,N2 i s N2,
f i b o n a c c i (N1 , F1 ) , f i b o n a c c i (N2 , F2 ) ,
F i s F1+F2 .
(b) varianta cu acumulator:
/ F=f (M) . F1=f (M2) , F2=f (M1). /
f i b o n a c (N, F): f i b ( 2 ,N, 1 , 1 , F ) .
f i b (M, N, , F2 , F2): M >= N.
f i b (M, N, F1 , F2 , F): M < N, M1 i s M+1,
F1plusF2 i s F1+F2 ,
f i b (M1, N, F2 , F1plusF2 , F ) .
Utilizati trace pentru a vedea diferenta dintre cele doua programe (fara acumulator si cu acumulator).
3) Exemplu de predicat care returneaza lungimea unei liste:
lungime ( [ ] , 0 ) .
lungime ( [ H|T ] ,N): lungime (T, N1 ) ,N i s 1+N1 .
Modificati predicatul astfel ncat sa foloseasca acumulatori.
4) Modificati predicatul care calculeaza n! astfel ncat sa foloseasca acumulatori.
5) Utilizati urm
atoarele predicate pentru a vedea timpul de executie n
varianta cu acumulator si f
ar
pentru inversa unei liste, pentru factorial, pentru
lungimea unei liste, pentru fibonacci:
c u r r e n t t i m e ( Timestamp ) : g e t t i m e ( Current ) ,
s t a m p d a t e t i m e ( Current , Date , l o c a l ) ,
d a t e t i m e v a l u e ( time , Date , Timestamp ) .
t i m e e l a p s e d ( time (H1 , M1, S1 ) ,
time (H2 , M2, S2 ) ,
Seconds ) : Seconds i s 3600 (H2 H1) + 60 (M2 M1) + ( S2 S1 ) .
De exemplu pentru factorial:
? c u r r e n t t i m e (T1 ) , f a c t o r i a l ( 5 0 0 0 0 , X) ,
c u r r e n t t i m e (T2 ) , t i m e e l a p s e d ( T1 , T2 , T ) .
? c u r r e n t t i m e (T1 ) , f a c t A c c ( 5 0 0 0 0 , X) ,
c u r r e n t t i m e (T2 ) , t i m e e l a p s e d ( T1 , T2 , T ) .
Unde factorial=predicatul fara acumulatori, iar factAcc=predicatul cu acumulatori.

Liste deschise si liste cu diferente

a) Exemplu de list
a deschis
a:
6)
? L = [ 1 , 2 , 3 |X] ,X=[ t , g , h ] .

/ gaura d i n l i s t a L s e umple
i n t r un s i n g u r pas cu X /

L = [1 , 2 , 3 , t , g , h] ,
X=[ t , g , h ]
? L2=[ s , d , a | T ] , T=[ cap | T2 ] .

/ gaura s e p o a t e umple s i cu
o l i s t a d e s c h i s a /

L2 = [ s , d , a , cap | T2 ] ,
T=[ cap | T2 ]
7)
c o n c a t l i s t d e s c h i s e ( L1 , G, L2): G=L2 .
? X=[a , b , c |G] , c o n c a t l i s t d e s c h i s e (X, G, [ d , e , f ] ) .
X = [a, b, c , d, e , f ]
b) Liste cu diferente se reprezinta ca diferenta dintre lista deschisa si gaura
sa
Exemplu: [1, 2, 3|G] G
8) Introduceti regula:
c o n c a t e n a r e D e s c h i s e (LDG, L2): G=L2 .
Incercati pentru:
? X=[m, n , p |G]G, c o n c a t e n a r e D e s c h i s e (X, [ 1 , 2 , 3 ] ) .
Scrieti regula astfel nc
at s
a se obtina X = [m, n, p, 1, 2, 3].
9)Predicatul concatenare/3:
c o n c a t e n a r e 3 (LD1G1 , LD2G2 , LD1G2): G1=LD2 .
? X=[a , f |G]G, c o n c a t e n a r e 3 (X , [ p , l | G2]G2 , Raspuns ) .
? X=[a , f |G]G, c o n c a t e n a r e 3 (X , [ p , l | G2]G2 , Raspuns [ ] ) .
10) Testati si pentru predicatul concatenare33.
c o n c a t e n a r e 3 3 (LD1G1 , G1G2 , LD1G2): G1=LD2 .
? X=[a , f |G]G, c o n c a t e n a r e 3 3 (X , [ p , l | G2]G2 , Raspuns ) .
? X=[a , f |G]G, c o n c a t e n a r e 3 3 (X , [ p , l | G2]G2 , Raspuns [ ] ) .

Tema:

Terminati toate problemele care au mai ramas nerezolvate din Tema 3.


Termen de realizare: laboratorul urmator.