Sunteți pe pagina 1din 4

Programare Logica Laboratorul 3

Recursivitate
Isabela Dramnesc

Intreb
ari din curs
Ce sunt variabilele anonime? Cand le folosim?
Ce ntelegeti prin unificare? Cum se produce unificarea?
Ce sunt structurile? Cum reprezentam:
c u r s ( datep ( nume ( a r d e l e a n ) , prenume ( i o n e l ) ) ,
d a t e c ( marti , c u r s n ( p l ) , s a l a ( a11 ) ) ) .
b i b l i o t e c a ( u n i v e r s i t a t e ( deVest ) ,
c a r t e ( p o e z i i , a u t o r ( mihai , eminescu ) ) ) .
De ce avem nevoie pentru a afla solutii pentru ntrebarile:
1. Cine are curs de pl (Programare Logica) marti n sala 102?
2. Ce c
arti g
asim la biblioteca universitatii din cluj?
Cum reprezent
am si cum interogam n Prolog:
1. 3X 2 + (7N/Z 2 ).
2. X 10 2X 4

Concepte
Trace
Domeniu inductiv
Recursivitate
Proceduri recursive
Conditie limit
a (de oprire)
Apel recursiv
Operatii recursive pe liste
Mapare recursiv
a
Comparare recursiva
Imbinare recursiv
a
1

Trace

Introduceti urm
atoarea baz
a de date:
vizitat ( ionel
v i z i t a t ( maria
v i z i t a t ( ioana
v i z i t a t ( ioana

, spania ) .
, spania ) .
, italia ).
, cehia ) .

calator ( ionel ).
c a l a t o r ( ioana ) .
calator ( victoria ).
c a l a t o r i e (X,Y): c a l a t o r (X) , v i z i t a t (X,Y ) .
Pentru fiecare din urm
atoarele interogari urmariti ce se ntampla cu ajutorul
comenzii trace :
? c a l a t o r i e ( i o n e l ,X ) .
? c a l a t o r i e ( maria ,X ) .
? c a l a t o r i e (N, s p a n i a ) .
? c a l a t o r i e (C, c e h i a ) .
? c a l a t o r i e (X,Y ) .

Inductie/Recursie

4.1

Domeniu inductiv

Este un domeniu compus din obiecte compuse care se pot descompune ntr-un
num
ar finit de obiecte mai simple. Se continua procedeul pana se ajunge la
cele mai simple obiecte.
Exemplu de domeniu inductiv:
[]
.(h, t)

4.2

/ l i s t a
/ l i s t a
t= t a i l
Coada

v i d a ; /
g e n e r i c a , unde h=head ( c a p u l ) ,
( coada ) l i s t e i .
l i s t e i t r e b u i e sa f i e o l i s t a . /

Proceduri recursive

O procedur
a recursiv
a const
a n:
Conditiile la limit
a (se trateaza cazul cand calculul se opreste, pe cele mai
simple obiecte).
Apelul recursiv se face doar pe argumente mai simple, n cazul nostru
apelul recursiv se face pe coada listei.
Exemplu: Predicatul care determina daca un anumit termen este lista sau
nu:

1)
e s t e l i s t a ( [ ] ) . / c o n d i t i a l a l i m i t a /
e s t e l i s t a ( [ H| T): e s t e l i s t a (T ) .
/ a p e l r e c u r s i v /
/ Cate s o l u t i i o b t i n p e n t r u i n t e r o g a r e a : /
? e s t e l i s t a (A ) .
Ordinea declar
arii clauzelor este foarte importanta:
Atentie la cazuri de genul:
2)
e s t e l i s t a ( [ H| T): e s t e l i s t a (T ) .
este lista ([]).
? e s t e l i s t a (X ) .
3)
p a r i n t e (X,Y): c o p i l (Y,X ) .
c o p i l (X,Y): p a r i n t e (Y,X ) .
4)
p e r s o a n a (X): p e r s o a n a (Y) , t a t a (Y,X ) .
persoana ( ion ) .
tata ( gabriel , ion ) .
?p e r s o a n a (X ) .

4.3

Exercitii:

5) Pentru exercitiul Scrieti un predicat schimba primele 2/2 (binar) care accept
a o list
a si genereaz
a o lista similara, numai cu primele doua elemente
schimbate (din tem
a) interogati n Prolog:
? schimba ( [ 1 , 2 , 3 , 4 ] ,X ) .
? schimba (X,Y) , schimba (Y,X ) .
Ce observati? Folositi comanda trace pentru a vedea ce se ntampla la ultima
interogare.
6) Predicatul pentru a vedea daca un element este membru al listei. Exemplu:
membru (X , [ X, ] ) .
membru (X , [ |Y] ) : membru (X,Y ) .
?membru ( 3 , [ 1 , 2 , 3 ] ) .
7) Exemplu pentru un predicat care elimina un element dintr-o lista.
e l i m i n a r e (X , [ X| T ] , T ) .
e l i m i n a r e (X , [ Y| T1 ] , [ Y| T2 ] ) : e l i m i n a r e (X, T1 , T2 ) .
Testati in Prolog toate posibilitatile!
8) Scrieti un predicat care calculeaza n! Stim ca 0! = 1.

9) Scrieti un predicat care sa calculeze cmmdc a doua numere. Se foloseste


definitia recursiv
a a lui Euclid: Fie a si b doua numere ntregi pozitive. Daca
b=0, atunci cmmdc(a,b)=a; altfel cmmdc(a,b)=cmmdc(b,r), unde r este restul
mp
artirii lui a la b.

Mapare recursiv
a

Mapare: fiind date 2 structuri similare sa se schimbe prima n a doua dupa niste
reguli date.
Exemplu: you are a computer se mapeaza n i am not a computer, do
you speak french se mapeaz
a n i do not speak german.
10)
change ( you , i ) .
change ( are , [ am, not ] ) .
change ( f r e n c h , german ) .
change ( do , no ) .
change (X,X ) .
alter ( [ ] , [ ] ) .
a l t e r ( [ H| T ] , [ X|Y] ) : change (H,X) , a l t e r (T,Y ) .
? a l t e r ( [ you , are , a , computer ] ,W) .
? a l t e r ( [ i , do , l i k e , you ] ,W) .

Imbinarea structurilor (Concatenare)

11) Se dau dou


a liste A si B, scrieti un predicat care sa returneze o lisa care
contine elementele listei A urmate de elementele listei B. Exemplu: pentru
A=[a,b,c], B=[7,8,9], lista returnata va fi C=[a,b,c,7,8,9].
Testati si urm
atoarele interogari:
? c o n c a t e n a r e ( [ 1 , 2 , 3 ] , [ s , d , 3 , 4 ] ,X ) .
? c o n c a t e n a r e (X, [ 1 , 2 , 3 ] , [ 1 , 2 , s , d , 3 , 4 ] ) .
? c o n c a t e n a r e (X, [ 1 , 2 , 3 ] , [ d , f , g , s s s s , 1 , 2 , 3 ] ) .
? c o n c a t e n a r e (X, Y , [ d , f , g , s s s s , 1 , 2 , 3 ] ) .

Tema:

Tema 3.
Termen de realizare: laboratorul urmator.