Cflp

Laborator

Facultatea de Automatica si Calculatoare 

Departamentul de Calculatoare

 

Home Lucrarea 1 Lucrarea 2 Lucrarea 3 Lucrarea 4 Lucrarea 5 Proiect
  Lucrarea 6 Lucrarea 7 Lucrarea 8 Lucrarea 9 Lucrarea 10  

 

      Lucrarea 4
 

 

 

 

 

 

Subiecte

 

 

 

 

   

Probleme

 

1. Implementaţi următoarele operaţii cu mulţimi: uniune, intersecţie, diferenţă, test de egalitate.

 

2. Implementaţi un program LISP care primeşte o expresie logică pe care o transformă, folosind legile lui de Morgan, īntr-o expresie logică folosind doar operatorul NAND.

 

 

Primitivele MAPCAR şi APPLY

 

Un mod cāteodetă mai elegant de a realiza iteraţiile este de a folosi primitivele MAPCAR şi APPLY.

 

MAPCAR se foloseşte atunci cānd dorim să aplicăm o procedura la fiecare element al unei liste. MAPCAR va returna lista rezultatelor.

Sintaxa:

(mapcar <nume procedura>

<lista de argumente>)

 

 

Exemplu:

Evaluānd expresia:

(mapcar 'oddp'(1 2 3))

obţinem

(t nil t)

 

Aici mapcar produce execuţia iterativa a predicatului oddp pe fiecare element al listei. Rezultatele sunt colectate īntr-o listă.

 

APPLY aplică o procedură unei liste de argumente (nu fiecăruia īn parte cum face MAPCAR).

Sintaxa:

(apply <nume procedura>

<lista argumente>)

 

Exemplu:

Dacă avem o listă de numere

(setq l '(4 7 2))

şi dorim să adunăm numerele din listă, ar fi greşit sa evaluăm

(+ l)

pentru ca + aşteptă argumente care sunt numere dar aici primeşte o listă de numere. De fapt am īncercat să evaluăm mai sus

(+ '(4 7 2))

ceea ce evidend e greşit. Ceea ce am dori ar fi

(+ 4 7 2)

Tocmai acest lucru īl face APPLY

(apply '+ l)

va returna 13.

 

Folosind MAPCAR şi APPLY īmpreună putem rezolva mult mai elegant probleme complex recursive.

 

Exemplu:

O implementare mai eficientă a procedurii COUNT-ATOMS (numără atomii dintr-o listă generalizată):

(defun count-atoms (l)

(cond ((null l) 0)

((atom l) 1)

(t (apply '+ (mapcar 'count-atoms l))))))

 

Aici recursivitatea nu se face doar pe două direcţii odată (car şi cdr, adică primul fiu şi frate drept), ci pe toţi fii simultan. Se face astfel o parcugere in lăt'ime a arborelui generalizat.

Următoarea procedură returnează adīncimea unui arbore generalizat.

 

(defun depth (l)

(cond ((null l) 1)

((atom l) 0)

(t (+ 1 (apply 'max (mapcar 'depth l))))))

 

 

MAPCAN

 

Primitiva MAPCAN se comportă ca şi MAPCAR combinat cu APPEND.

(MAPCAN <nume procedura> <lista argumente>)) ==

== (APPLY 'APPEND (MAPCAR <nume procedura> <lista argumente>))

 

 

Iteraţii folosind DO

 

DO are sintaxa:

(DO ((<param 1> <valoare initala 1> <actualizare 1>)

(<param 2> <valoare initala 2> <actualizare 2>)

...

(<param n> <valoare initala n> <actualizare n>))

(<test sfarsit> <rezultat>)

(<corpul lui do>))

 

DO face şi legarea parametrilor.

 

Exemplu:

Ridicare la putere īntreagă.

(defun expt (m n)

(do ((result 1) ; legare şi atribuire result

(exponent n)) ; legare şi atr. exponent

((zerop exponent) result) ; test şi return

(setq result (* m result)) ; corp

(setq exponent (- exponent 1)))) ; corp