0% found this document useful (0 votes)
160 views75 pages

Curs Lisp Part 1 Master

This document provides information about an advanced logic and functional programming course taught by Viorel Negru at West University of Timisoara. It includes two sections that list the topics to be covered in the course, such as advanced Lisp techniques, functional abstraction, logical programming basics, and constraint satisfaction problems. It also provides bibliographies at the end to support the course material. The document is written in Romanian and contains formatting for headers, contents, and bibliographies.

Uploaded by

Schmoll Stefan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
160 views75 pages

Curs Lisp Part 1 Master

This document provides information about an advanced logic and functional programming course taught by Viorel Negru at West University of Timisoara. It includes two sections that list the topics to be covered in the course, such as advanced Lisp techniques, functional abstraction, logical programming basics, and constraint satisfaction problems. It also provides bibliographies at the end to support the course material. The document is written in Romanian and contains formatting for headers, contents, and bibliographies.

Uploaded by

Schmoll Stefan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 75

PLFAdv ...

2017 / 2018

Programare logică şi funcţională avansată(PLFAv)

V. Negru
Universitatea de Vest din Timişoara
Departamentul de Informatică
e-mail: [email protected]

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Conţinut curs - I

• Noţiuni de bază de programare funcţională şi logică (2 ore)

• Tehnici avansate ı̂n Lisp (macrouri) (4 ore)

• Închideri lexicale şi abstractrizare date (4 ore)

• Continuare. Aplicaţii (4 ore)

• Noţiuni de bază de programare logică (2 ore)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Conţinut curs - II

• Probleme de satisfacere a constrângerilor (CSP). Limbaje de


modelare a problemelor şi de specificare a constrân gerilor. (4
ore)

• Căutarea unei soluţii pe domenii finite (generate&test, stan-


dard backtracking, forward checking, lookahead, partial looka-
head). Soluţii optimale (forme de căutare branch and bound)
(4 ore)

• Programare logică cu constrângeri (4 ore)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Bibliografie

3I

• B. Buchberger, G. Collins, R. Loos - Computer algebra and


Symbolic Computation, Springer Verlag, 1983 N. C. Heinze, J.
Jaffar, C. Michailov, P. J. Stuckey,

• R. H. C. Yap - The CLP(R) Programmers Manual, version


1.2, Dept. of Computer Science, Monash University, 1992.

• P. Van Hentenryck - Constraint Satisfaction in Logic Pro-


gramming, M.I.T. 1989

• T. Muller, K. Popov,C. Schulte, J. Wurtz - Constraint Pro-


gramming in Oz, DFKI Oz Documentation Series, 1995

• C. Muscalagiu - Introducere in programarea logica si limba-


jele de programare logica, Ed. Univ. ”A.I.Cuza” Iasi, 1996

• I. Bratko - PROLOG. Programming for Artificial Intelli-


gence, Addison Wesley, third edition, 2001

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Bibliografie

3 II

• St. Trausanu-Matu - Programare in LISP. Inteligenta artifi-


ciala si web semantic, Ed. POLIROM, 2004

• P. Graham - ANSI Common Lisp, Prentice Hall, 1996

• P. Graham - On Lisp. Advanced techniques for Common


Lisp, Prentice Hall, 1994.

• D. Friedman, M. Wand, C. Hayes - Essentials of Program-


ming Languages, second edition, MIT, 2001.

• Grillmeyer - Exploring Computer Science with Scheme, Springer,


1997.

• B. Harvey, M. Wright - Simply Scheme. Introducing Com-


puter Science, second edition, MIT, 1999.

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Bibliografie

3 III

• H. Abelson, G.J. Sussman, J. Sussman - Structure and Inter-


pretation of Computer Programs, Second edition, MIT, 1996.

• C. Queinnec - Les Langages Lisp, InterEditions, 1994.

• http://pauillac.inria.fr/ diaz/gnu-prolog/

• http://www.prologia.fr/

• http://web.info.uvt.ro/ idramnesc/

• http://web.info.uvt.ro/c̃izbasa/lisp/

• http://web.info.uvt.ro/c̃izbasa/prolog/

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Caracterizare Lisp

3 Standard: peste 700 de funcţii

• uniformitatea (programe, date - expresii simbolice)

• extensibilitatea (limbaj de programare programabil))

• flexibil (dezvoltare stiluri diferite de programare))

• abstratizare; recursivitate

• programare funcţională

• structuri dinamice de date; alocare dinamica a memoriei

• interpretor / compilator

• programare bottom up (software reutilizabil; prototipare rap-


ida).

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Exemple

3 Funcţie ce ı̂ntoarce o funcţie

(defun adunan (n) #’ (lambda (n) (+ x n)))

3 Factorial din n, funcţie recursiva

(defun !(n) (if (zerop n) 1 (* n (! (1- n)))))

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Lambda calcul

3 Definirea funcţiilor

f(x,y)=x^2+y-2 este reprezentată prin:

(f (x, y) x^2+x-2)

unde x şi y sunt parametrii funcţiei,


iar x^2+y-2 este corpul funcţiei

3 Expresii condiţionale

3 Funcţii recursive

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Structuri dinamice de date

3 Liste

• pointeri (adrese) - reprezentare implicită

• operaţii cu liste

• car, cdr, ...

• gestiune automată a memoriei

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Interpretorul Lisp

3 Interfaţă (front-end) interactivă numită top-level

• prompter Lisp specific versiunii Common Lisp utilizate (>,


:, * etc)

3 Ciclu de bază: read-eval-print (top-level loop), format


din trei etape sau stări:

• read: citeşte o expresie simbolică;

• eval: evaluează expresia simbolică introdusă;

• print: afişează rezultatul obţinut ı̂n urma evaluării expre-


siei.

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Atomii

• Numerici (numere)

• Simbolici (simboluri)

3 Numerele - se evaluează la ele ı̂nsele

>16 >1.25
16 1.25

3 Simboluri

• Fie suma −→ 16); locul-nasterii −→ ARAD):

>suma >locul-nasterii
16 arad

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Simboluri

• Încercarea de evaluare a unui simbol ce nu a fost legat la o


valoare produce eroare:

>a
error: unbound variable - a

3 Un şir de caractere se evaluează la el ı̂nsăşi:

>"Sir de caractere"
"Sir de caractere"

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Liste

• O listă constă din zero sau mai multe elemente (atomi sau
liste), separate prin spaţii şi cuprinse ı̂ntre paranteze rotunde.

• Exemple:

(), (a b c), (a (b (c))),


(+ 1 2 3), (aceasta este o lista)

• Constantele t - adevărat (true) şi nil - fals (false); nil -


reprezinta şi lista vida: ()

>t >nil >()


t nil nil

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Comentariile ı̂n Lisp sunt de forma:

;<text-oarecare>

unde ; este un macrocaracter.

• Funcţiile ı̂n Lisp se scriu indentate, ı̂n general ţinând cont de


paranteze:

;;; Calculul factorialului


;;;
(defun fact (n)
;;conditia de oprire
(if (zerop n)
1 ; 1 <-- (fact 0)
;;apelul recursiv
(* n (fact (1- n)))
)
)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Expresii simbolice. Listele şi atomii formează expresiile sim-


bolice sau s-expresiile ı̂n Lisp.

3 O definiţie (recursivă) a expresiilor simbolice este următoarea:

• Atomii sunt expresii simbolice;

• O listă este o construcţie de forma () sau (e1, e2, . . . , en),


unde n ≥ 1 şi e1, e2, . . . , en sunt expresii simbolice;

• O pereche cu punct este o construcţie de forma (e1 . e2),


unde e1 şi e2 sunt expresii simbolice;

• Listele şi perechile cu punct sunt expresii simbolice.

• Exemple:

1, abc (), (a . b), ((a) (b c (d)) e),


"ab1", ("a" 2 b)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Funcţii - obiecte, entităţi Lisp

• Apelul unei funcţii este reprezentat de o listă ı̂n care primul


element reprezintă funcţia, iar celelalte elemente argumentele
funcţiei.

• Exemplu:

>(+ 1 2 3) >(sqrt 4)
6 2
>(* (+ 2 3) 10)
50

• Formă - o expresie simbolică ce poate fi evaluată

• evaluarea unei liste care nu este o formă va produce eroare:

>(a 1 2)
error: unbound function - a

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Evaluarea. Evaluarea implicită are loc ı̂n cadrul ciclu-


lui read-eval-print, ı̂n faza eval. Funcţia de evaluare
acţionează astfel:

• dacă expresia este atom, ı̂ntoarce valoarea sa;

• dacă expresia este o listă:

◦ dacă primul element din listă reprezintă o funcţie: 1) regăseşte


această funcţie; 2) evaluează restul elementelor (argumentele
funcţiei) din listă aplicând aceleaşi reguli la fiecare din ele; 3)
aplică funcţia la argumente şi ı̂ntoarce rezultatul.

◦ daca primul element reprezintă o formă specială, aplică un


tratament specific asupra argumentelor sale şi asupra formei
speciale;

◦ dacă primul element reprezintă un macro, aplică un trata-


ment specific macrourilor.

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Stoparea evaluării

• Funcţia (quote <arg>), unde arg este o s-expr

• (quote <arg>) ≡ ’<arg>; unde ’ - macrocaracter

>(quote a) >(quote (a b c)) >’a


a (a b c) a

3 Funcţia eval

>(eval ’(+ 1 2)) >(car ’(+ 1 2))


3 +

• Fie y −→ x, x −→ 10:

>(eval y) ;y (ca argument)


;este evaluat la x, iar x la 10
10

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Legarea varibilelor

• Datele cu care operăm sunt expresii simbolice (atomi, liste)

• Datele ocupă locaţii de memorie

• Forma de reprezentare şi conţinutul locaţiei de memorie de-


pind de tipul datelor

• Asocierea unei variabile la o dată se numeşte legare

• Locaţia de memorie conţine amprenta tipului datei, tip ce


se atribuie variabilei ı̂n momentul legării variabilei la valoarea
din locaţia de memorie

• Atribuirea tipului in timpul execuţiei (evaluarii)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 setq, set, psetq, pset

• Setq este formă specială şi are forma generală:

(setq <var1 > <val1 > ... <varn > <valn >)

Exemple:

>(setq x 1 y ’(a b c)) >(setq x 1 y (+ x 2))


(a b c) 3
>x >x
1 1
>y >y
(a b c) 3

• Set este funcţie şi are forma generală:

(set <var1 > <val1 > ... <varn > <valn >)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 setq, set, psetq, pset (cont.)

>(set ’x 1 ’y 2) >(setq y ’x)


2 >(setq x ’a)
>x >(set y 2)
1 >y
>y x
2 >x
2

• Legare secvenţială, legare ı̂n paralel

>(setq x 10) >(setq x 10)


10 10
>(setq x 1 y (+ x 2)) >(psetq x 1 y (+ x 2))
3 12
>x >x
1 1
>y >y
3 12

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Operaţii cu liste

• Elementele listei: atomi, liste

• Prelucrare: nivel superficial / adâncime

Structura internă a listei (a b c): (1) Descrierea arborescenta;


(2) Descrierea simplificată

a b c

a (2)

(1)
c

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Operaţii cu liste

Structura internă a listei ((a (b c)) d ((e f) g) h), descrierea pe


nivele

d h

a g

b c e f

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Operaţii cu liste

• Funcţiile car, cdr şi cons

(car <lista>)

Exemple de utilizare:

>(car ’(a b c)) >(car ’a)


a error: bad argument type - a
>(car ’(1 . 2)) >(first ’(a b c))
1 a
>(car ’((a (b c)) d ((e f) g) h))
(a (b c))

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Operaţii cu liste

• Funcţiile car, cdr şi cons

(cdr <lista>)

Exemple de utilizare:

>(cdr ’(a b c)) >(cdr ’a)


(b c) error: bad argument type - a
>(cdr ’(1 (2 . 3))) >(rest ’(a b c))
((2 . 3)) (b c)
>(dar ’((a (b c)) d ((e f) g) h))
(d ((e f) g) h)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Operaţii cu liste

3 Operaţii cu liste

• Funcţiile car, cdr şi cons

(cons <el> <lista>)

Structura unei celule cons


celula cons

car cdr

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Operaţii cu liste

• Funcţiile car, cdr şi cons

Exemple de utilizare:

>(cons ’a ’(b c)) >(cons nil nil)


(a b c) nil
>(cons ’(a) ’(b c)) >(cons 1 2)
((a) b c) (1 . 2)
>(cons 1 nil) >(cons ’(a b) ’c)
(1) ((a b) . c)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Funcţiile car, cdr şi cons

Funcţiile car şi cdr pot fi compuse:

>(car (car (cdr ’(a ( b c) d))))


b

>(caadr ’(a (b c) d))


b

>(setq l ’(a b c))


(a b c)
>(cons (car l) (cdr l))
(a b c)

Relaţia dintre car, cdr şi cons


car a

(a b c) cons (a b c)

cdr (b c)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Alte funcţii. append, list, reverse, last şi length

(append <lista1 > <lista2 > . . . <listan >)

Exemple de utilizare:

>(append ’(a) ’(b c))


(a b c)
>(append ’((a) b) ’(c) ’(d (e f)))
((a) b c d (e f))
>(append ’a ’(b c))
error: bad argument type - a
>(append ’((a)) ’(b c) ’d)
((a) b c . d)
>(append)
nil

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Alte funcţii. append, list, reverse, last şi length

(list <sexpr1 > <sexpr2 > . . . <sexprn >)

Exemple de utilizare:

>(list 1 2 3)
(1 2 3)
>(list ’(a b) ’c ’((d e) f))
((a b) c ((d e) f))
>(list 1 ’(2 . 3))
(1 (2 . 3))
>(list nil nil)
(nil nil)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Alte funcţii. append, list, reverse, last şi length

Comparaţie ı̂ntre cons, append şi list:

>(cons ’(a) ’(b c))


((a) b c)
>(append ’(a) ’(b c))
(a b c)
>(list ’(a) ’(b c))
((a) (b c))

Forma generală a funcţiei last este:

(last <lista>)

>(last ’(a b c d))


(d)
>(last ’(a b . c))
(b . c)
>(last ’(a))
(a)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Elemente de bază

3 Alte funcţii. append, list, reverse, last şi length

Forma generală a funcţiei reverse:

(reverse <lista>)

>(reverse ’(1 2 3 4 5)
(5 4 3 2 1)
>(reverse ’(a (b c d) e))
(e (b c d) a)

Forma generală a funcţiei length:

(length <lista>)

>(length ’(a b c))


3
>(length ’((a b (c)) (d e)))
2
>(length ())
0

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Definirea funcţilor

3 Funcţii sistem / utilizator

Definirea unei funcţii:

(defun <nume-func> <lista-param>


<expr-1> <expr-2> ... <expr-n>)

unde:

• <nume-func> este primul argument şi reprezintă numele


funcţiei definite de defun;

• <lista-param> este al doilea argument al lui defun, are


forma (<par-1> <par-2> ... <par-m>) şi reprezintă lista
cu parametri pentru funcţia definită;

• <expr-i>, i = 1, . . . , n sunt forme ce alcătuiesc corpul


funcţiei definite.

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Definirea funcţiilor

3 Exemple de utilizare:

>(defun patrat (x) ; patratul unui număr


(* x x))
patrat

>(defun calcul (x y z) ; calculează val. unei expr.


(+ x (* y z))
calcul

3 Apelul unei funcţii

(<nume-func> <arg-1> <arg-2> ... <arg-n>)

>(patrat 2) >(calcul 2 3 4)
4 14
>(setq y 3) >(setq x 3 y 2 z 4)
3 4
>(patrat y) >(calcul x y z)
9 11

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Definirea funcţiilor

3 Evaluarea

• Se identifică funcţia;

• Se evaluează argumentele;

• Parametrii formali sunt legaţi la argumentele evaluate. Dacă


ı̂nainte de apel parametrii au fost legaţi, valorile acestora se
salvează, urmând a se restaura după revenirea din funcţie; Un
parametru nelegat ı̂nainte de apelul funcţiei, redevine nelegat
după revenirea din funcţie.

• se evaluează corpul funcţiei;

• valoarea ı̂ntoarsă este dată de valoarea ultimei expresii sim-


bolice din corpul funcţiei.
a−1 a−2 ... a−m argumente
evaluare
v−1 v−2 ... v−m argumente evaluate

legare
p−1 p−2 ... p−m parametri

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Definirea funcţiilor

3 Variabile legate, variabile libere

>(setq x 1 y 2) >(setq x 1 y 2)
>(defun f1 (x) >(defun f2 (x)
(+ x y)) (setq x 10)
>(f1 3) (+ x y)
5 >(f2 x)
>x 12
1 >x
>y 1
2

>(setq x 1 y 2) >(setq x 1 y 2)
>(defun f3 (x) >(defun f4 (x)
(setq x 10 y 20) (setq x 10)
(+ x y)) (+ (symbol-value ’x) y)
>(f3 x) >(f4 x)
30 3
>y >x
20 1

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Expresii

3 Expresii artimetice, relaţionale, logice

3 Expresii condiţionale

3 Predicate Lisp

3 Funcţii de ramificare (if, cond, case)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Expresii

• Expresii aritmetice

>(setq x 4)
>(* 2 (+ 3 (sqrt x)))
>6

• Expresii relaţionale

>(setq x 10)
>(>= x 2)
t
>(string= "a" "bcd")
nil

• Expresii logice

>(setq x 10 y 5)
>(and (> x 5) (< y 10))
t

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Testul de egalitate

3 Se cunoaşte tipul obiectelor

=, char=, string=, /=, string/=

3 Nu se cunoaşte tipul obiectelor

• Identitate structurală

>(setq x a b c))
>(setq y (cdr x))
>(setq z b c))
>(eq y (cdr x))
t
>(eq y z)
nil

• Izomorfism structural

>(equal y z)
t

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Expresii condiţionale

3 Expresii simbolice ce returnează t sau nil

• Extensie la nil sau nonnil (diferit de nil)

• if, cond, case, when, unless, do, do*, ...

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Predicate lisp

3 Funcţii ce returnează t sau nil

• numberp, symbolp, atom, consp, listp

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Funcţii de ramificare

• if

>(setq x 10)
>(if (> x 15) 1 2)
2
>(if (

• cond

(cond <clauza-1>
<clauza-2>
...
<clauza-n>)
unde <clauza-i>::=(<ec> <e> <e> ... <e>)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Cond

• Exemple

>(defun det-tip (e)


(cond ((numberp e) (cons e este numar)))
((symbolp e) (cons e este simbol)))
((lisp e) (cons e este lista)))
(t (cons e (tip necunoscut)))))

>;;; (and <ob1> <ob2>)


>(cond (<ob1> <ob2>))
>;;; (or <ob1> <ob2>)
>(cond (<ob1>)
(<ob2>))

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Conclusions

3•

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate

3 Un obiect este recursiv daca este definit funcţie de el ı̂nsuşi.

• definim un număr infinit de obiecte printr-o declaraţie finită

• functii recursive, proceduri recursive, definiţii recursive de


date, calcul recursiv.

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate

3 Exemple

• GNU:
GNU = Gnu is Not Unix

• numerele naturale:
0 este număr natural;
succesorul unui număr natural este un număr natural.

• arborii binari:
o este un arbore binar (arborele vid);
dacă t1 şi t2 sunt arbori binari atunci şi
o

t1 t2

este un arbore binar.

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate

3 Definiţie bazată pe inducţie structurală (structura progra-


mului trebuie să reflecte structura datelor) - definim tipul de
date listă-de-numere

lista vidă este o listă-de-numere;


dacă l este o listă-de-numere şi n este un număr, atunci
perechea (n . l) este o listă-de-numere.

În notatţia BNF avem următoarele reguli:

<listă-de-numere>::=()
<listă-de-numere>::=(<număr> . <listă-de-numere>)

sau utilizând simbolul bară verticală din BNF:

<listă-de-numere>::=() | (<număr> . <listă-de-numere>)

sau utilizând asteriscul (Kleen star):

<listă-de-numere>::=({<număr>}*)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate

3 Exemple

• factorialul unui număr:




 n ∗ (n − 1)! dacă n > 0
n! = 
 1 dacă n = 0

• numarul de elemente (pe nivel superficial) dintr-o listă:




 1 + nr-elem(l \ primul-elem) dacă l ̸= nil
nr-elem(l) = 
 0 dacă l = nil

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Funcţii recursive

3 Caracterizare

• abstractizare, corectitudine

• pointeri → date recursive

• reducere efecte laterale

• lizibilitate

• iterativ ↔ recursiv

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Funcţii recursive

3 O funcţie ce se autoapelează este o funcţie recursivă

• funcţii direct recursive (f apelează f )

• funcţii indirect recursive (f apelează g1, g1 apelează g2, . . . ,


gk apelează f )

• funcţii mutual recursive (k = 1)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Funcţii recursive

3 Calculul factorialului

• factorialul unui număr:




 1 dacă n = 0
fact(n) = 
 n ∗ fact(n − 1) dacă n > 0

(defun fact (n)


(cond ((zerop n) 1) ; condiţia de terminare
(t (* n (fact (1- n)))) )) ; apelul recursiv

sau

(defun fact (n)


(if (zerop n)
1 ; condiţia de terminare
(* n (fact (1- n))) )) ; apelul recursiv

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Calculul factorialului

3 Arborele inversat (>(fact 3)):

n=3 6

n=2 2

n=1 1

n=0 1

(* 3 (fact 2)) ;produs suspendat


(2 * (fact 1)) ;produs suspendat
(* 1 (fact 0)) ;produs suspendat
1

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Trasarea funcţiilor (recursive)

3 Funcţii de depanare (trasare, evaluare pas cu pas, definire


puncte de intrerupere etc)

Rezultatul trasării funcţiei fact:

>(trace fact) ; activare trasare


(FACT)
>(fact 3)
0: (FACT 3) ; -->
1: (FACT 2) ; -->
2: (FACT 1) ; -->
3: (FACT 0) ; -->
3: returned 1 ; <--
2: returned 1 ; <--
1: returned 2 ; <--
0: returned 6 ; <--
6
>(untrace fact) ; dezactivare trasare
nil

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate

3 Corectitudinea unui algoritm

• funcţionează corect ı̂n toate cazurile

• demonstraţie prin inducţie

3 Conceperea unui algoritm recursiv

• definirea problemei prin descompunerea ı̂ntr-un numar finit


de probeme tot mai mici (clauză / clauze recursive)

• gasirea modului de rezolvare a celei mai mici versiuni a pro-


blemei printr-un numar finit de operaţii (condiţie / condiţii de
terminare)

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Funcţii recursive

3 Reguli de scriere a funcţiilor recursive ı̂n Lisp

• if, cond

• clauzele recursive vor fi precedate de clauzele / condiţiile de


terminare

• folosirea greşită a condiţiilor de terminare conduce la ciclări


la infinit / depăşirea memoriei disponibile

Exemplu:

(defun our-member (el l)


(cond ((equal (carl l)) el)
(t (our-member (cdr l))) ))

Obs.: trebuie inserată la ı̂nceput ı̂n cond clauza ((endp l)


nil).

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate ı̂n Lisp

3 Recursivitate simpla,

• la fiecare apel se crează o copie a variabilelor locale

• parcurgere pe nivel superficial ı̂n cazul listelor (parcurgere


doar a subarborelui drept)

3 Recursivitate arborescentă,

• la fiecare apel se crează mai multe copii ale variabilelor locale

3 Recursivitate dublă

• se crează două copii ale variabilelor locale

• parcurgere ı̂n profunzime ı̂n cazul listelor (parcurgere atât a


subarborelui stâng, cât şi a subarborelui drept))

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate simplă

3 lungimea unei liste (pe nivelul superficial)



 0 dacă l = nil
our length(l) = 
 1 + our length((cdrl)) altfel

(defun our_length (l)


(if (endp l) 0
(+ 1 (our_lenght (cdr l)))) )

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate dublă

3 Determinarea numerelor lui Fibonacci








1 dacă n = 1
f ib(n) = 

1 dacă n = 1


 f ib(n − 1) ∗ f ib(n − 2) dacă n > 1

Funcţia Lisp corespunzătoare este o funcţie dublu recursivă:

(defun fib (n)


(cond ((= n 0) 1)
((= n 1) 1)
(t (+ (fib (- n 1)) (fib (- n 2)))) ))

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate dublă

3 În urma apelului >(fib 4) rezultatul este 5, arborele in-


versat fiind:
4 5

3
2 2
3

2 1 1
1 1 1 0
2

1 0 1
1

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Trasarea funcţiei fib

>(trace fib)
(FIB)
>(fib 4)
0: (FIB 4)
1: (FIB 3)
2: (FIB 2)
3: (FIB 1)
3: returned 1
3: (FIB 0)
3: returned 1
2: returned 2
2: (FIB 1)
2: returned 1
1: returned 3
1: (FIB 2)
2: (FIB 1)
2: returned 1
2: (FIB 0)
2: returned 1
1: returned 2
0: returned 5
5

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate simplă şi dublă

3 Atomizarea unei liste

(defun atomizare (l)


(cond ((endp l) nil)
; recursivitate simplă
((atom (car l)) (cons (car l)
(atomizare (cdr l))))
; recursivitate dublă
(t (append (atomizare (car l))
(atomizare (cdr l)))) ))

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate simplă şi dublă

3 În urma apelului >(atomizare ((a b) c) d)) rezultatul


ı̂ntors este (a b c d). Arborele inversat corespunzător este:
(((a b) c) d) (a b c d)

((a b) c) (d)
(a b c) (d)

(a b)
(c) nil nil
(a b) (c)

(b) (b) nil nil

nil nil

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Funcţii final recursive

3 Caz particular de recursivitate (tail recursion / tail-end re-


cursion / recursivitate la capăt / recursivitate finală)

• O funcţie este final-recursivă dacă valoarea obţinută pe ul-


timul nivel de recursivitate rămâne neschimbată până la revenirea
pe nivelul de sus.

• apelurile recursive nu sunt argumente pentru alte funcţii şi


nu sunt utilizate ca şi teste (apelul recursiv este ultima operaţie
ce apare ı̂ntr-o funcţie).

• la o funcţie ce nu este final recursivă se poate observa că


apelul recursiv este conţinut ı̂ntr-un apel de funcţie (+, −,
cons, append etc).

• O funcţie final-recursivă se bucură de proprietatea că poate


fi tradusă automat ı̂ntr-o funcţie iterativă.

• nefinal recursiv → final recursiv: tehnica variabilelor colec-


toare

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Funcţii final recursive

3 Funcţia fact:

(defun fact (n)


(fact-aux n 1)) ; rez = 1
(defun fact-aux (n rez) ; funcţie auxiliară
(if (zerop n) rez ; rezultatul final = rez
(fact-aux (1- n)
(* n rez))) )) ; rez = n*rez

> (trace fact fact-aux)


(fact-aux fact)
> (fact 3)
Entering: FACT, Argument list: (3)
Entering: FACT-AUX, Argument list: (3 1)
Entering: FACT-AUX, Argument list: (2 3)
Entering: FACT-AUX, Argument list: (1 6)
Entering: FACT-AUX, Argument list: (0 6)
Exiting: FACT-AUX, Value: 6
Exiting: FACT-AUX, Value: 6
Exiting: FACT-AUX, Value: 6
Exiting: FACT-AUX, Value: 6
Exiting: FACT, Value: 6 6

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Funcţii final recursive

3 Arborele inversat

n=3 6
rez=1
1

n=2 6
rez=1
2

n=1 6
rez=2
3

n=0 6
rez=6
4

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Funcţii final recursive

3 Varianta final-recursivă pentru determinarea celui de-al n-


lea număr din şirul lui Fibonacci este:

(defun fib1 (n)


(cond ((< n 2) 1)
(t (fib1-aux
1 ; f1 - penultimul număr calculat
1 ; f2 - ultimul număr calculat
2 ; i - indexul pentru numărul
; curent de calculat
n)) ))

(defun fib1-aux (f1 f2 i n)


(cond ((> i n) f2)
(t (fib1-aux f2 ; f2 -> f1
(+ f1 f2) ; (+ f1 f2) -> f2
(1+ i) ; (1+ i) -> i
n)) ))

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate

3 Comparaţie dublu ↔ simplu recursiv

• Cazul nefinal recursiv: complexitatea este exponenţială (apelul


>(fib 100) necesită mai mult de 1020 apeluri de funcţie;

• cazul final recursiv: complexitatea este polinomială (>(fib1


100) ı̂ntoarce valoarea ≈ 5.73 ∗ 1020, valoare ce se obţine după
circa 100 de apeluri de funcţie).

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate

3•

3 Recursivitate compusă

• În cazul ı̂n care ı̂n cadrul argumentelor unei funcţii recursive
există apeluri recursive spunem că avem recursivitate com-
pusă.

• Exemplu: funcţia lui Ackermann

A<I, 0>=I+1
A<0,J>=A<1,J-1>
A<i,j>=A<A<I-1,J>,J-1>

Valorile si numărul operaţiilor cresc foarte repede: A<0,1>=2,


A<1,2>=5, A<2,3>=29, A<3,4>=265536, . . ..

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate

3 Recursivitate monotona / nemomotonă

• Recursivitatea monotonă (recursivitate structurală) este


recursivitatea ı̂n care modificarările asupra argumentelor din
apelurile recursive se fac tot timpul ı̂n aceeaşi direcţie.

• Recursivitatea nemonotonă este cea ı̂n care modificările


asupra argumentelor sunt nemonotone (nu tot timpulı̂n aceeaşi
direcţie).

• De exemplu, funcţia recursivă ce implementează metoda lui


Newton pentru găsirea zerourilor unei funcţii este nenonotonă.

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate nemomotonă

• Metoda lui Newton pentru găsirea unei soluţii pentru f (x) =


0 se bazează pe formula iterativă urmatoare:

f (xk )
xk+1 = xk −
Df (xk )

În continuare este prezentat programul Lisp pentru f (x) =


x3 − 1:

(defun f (x)
(- (* x x x) 1) )
(defun df (x)
(* 3 x x) )
(defun newx (x)
(- x (/ (f x) (df x))) )
(defun newton (x)
(cond ((< (abs (f x)) 0.00001) x)
(t (newton (newx x))) ))

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate nemonotonă

Trasarea funcţiei newton (cu argumentul funcţiei ce nu se


modifică ı̂n acelaşi sens):

>(newton -1.0)
0: (NEWTON -1.0)
1: (NEWTON -0.3333333)
2: (NEWTON 2.7777781)
3: (NEWTON 1.895052)
4: (NEWTON 1.3561869)
5: (NEWTON 1.0853586)
6: (NEWTON 1.0065371)
7: (NEWTON 1.0000424)
8: (NEWTON 1.0)
8: returned 1.0
7: returned 1.0
6: returned 1.0
5: returned 1.0
4: returned 1.0
3: returned 1.0
2: returned 1.0
1: returned 1.0
0: returned 1.0
1.0

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate

3 Parcurgerea şi construire liste

• Parcurgerea pe nivel superficial: se crează o copie a unei liste


(copierea doar a nivelului superficial)

(defun our-copy-list (l)


(if (atom l) l
(cons (car l)
(our-copy-list (cdr l)))))

• Parcurgerea ı̂n adâncime: se crează o copie a arborelui binar


(copiere a listei pe toate nivelurile).

(defun our-copy-tree (l)


(if (atom l) l
(cons (our-copy-tree (car l))
(our-copy-tree (cdr l)))))

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate

3 Parcurgere şi calcul

• Sabloane de funcţii de calcul şi / sau parcurgere

(defun <calcul> (n)


(if <cond-oprire> ; test-zero
<număr-neutru> ; ^
ın raport cu oper
(<oper> n (calcul (1- n)))))

Exemple: suma primelor n numere naturale/ factorialul / m


la puterea n

(defun <calcul> (lista)


(if <cond-oprire> ; test-sfarşit listă
<număr-neutru> ; ^
ın raport cu oper
(<oper> <element-curent> (calcul <rest-listă>))))

Exemple: Suma / produsul elementelor unei liste; construirea


unei liste

Viorel Negru UVT


PLFAdv ... 2017 / 2018

Recursivitate

3 Probleme

• Operatii cu liste (pe nivel superficial şi ı̂n adâncime)

• Operaţii cu mulţimi

• Operaţii cu vectori (rari)

• Operaţii cu matrice (rare)

• Operaţii cu polinoame

• Operaţii cu expresii generalizate

• Operaţii asupra arborilor binari

• etc.

Viorel Negru UVT

You might also like