Cflp

Laborator

 

Facultatea de Automatica şi Calculatoare

Departamentul de Calculatoare


 
  Lucrarea 8 Lucrarea 9 Lucrarea 10 Lucrarea 11 Lucrarea 12 Lucrarea 13 Proiect Orar


  Lucrarea 7
 

Subiecte

    

Liste de asociaţii

Se numeste listă de asociaţii o listă formată din subliste de forma (<cheie> <valoare>).
Următoarea expresie crează o listă de asociaţii ce descrie proprietăţile unui anume obiect:

(setq brick-a '((color red)
                (supported-by brick-b)
                (is-a brick)))
((color red) (supported-by brick-b) (is-a brick))

ASSOC

Primitiva ASSOC returnează valoarea unei chei dintr-o listă de asociaţii.
ASSOC primeşte două argumente: o cheie şi o listă de asociaţii. ASSOC va cauta asociaţia cu cheia dată şi va returna īntreaga asociatie (<cheie> <valoare>). Dacă nu găseşte cheia atunci va returna NIL.

ASSOC

(assoc 'color brick-a)
(color red)
(assoc 'is-a brick-a)
(is-a brick)
(assoc 'size brick-a)
nil

O listă de asociaţii poate conţine două elemente cu aceeaşi cheie, dar ASSOC va returna doar prima asociaţie validă găsită:

ASSOC

(setq brick-a '((supported-by brick-c)
                (color red)
                (supported-by brick-b)
                (is-a brick)))
((supported-by brick-c) (color red) (supported-by brick-b) (is-a brick))
(assoc 'supported-by brick-a)
(supported-by brick-c)

Problema 1

Scrieţi o procedură FETCH care primeşte o cheie şi o listă de asociaţii, iar dacă găseşte cheia va returna doar valoarea ei. Dacă nu o găseşte va returna un semn de īntrebare.

(fetch 'temperature '((temperature 100)
                     (pressure (120 60))
                     (pulse 72)))
100
(fetch 'complaints '((temperature 100)
                     (pressure (120 60))
                     (pulse 72)))
?

Problema 2

Scrieţi o procedură LIST-KEYS care primeşte o listă de asociaţii şi returnează o listă cu toate cheile din ea.

Proprietăţi

Un simbol poate avea proprietăţi. Proprietăţile au nume şi valoare.
Observaţie: īn LISP cuvāntul valoare poate avea trei īnţelesuri:

  • vorbim despre valoarea returnată la evaluarea unei forme
  • vorbim despre valoarea unei proprietăţi a unui simbol
  • şi vorbim despre valoarea unui simbol

Primitiva GET

Pentru a returna valoarea unei proprietăţi folosim GET, care primeşte numele unui simbol şi numele unei proprietăţi. Să presupunem că simbolul pyramid-d are proprietatea cu numele color ce are valoarea red.

GET

(get 'pyramid-d 'color)
red

Cu ajutorul lui SETF putem da valori unei proprietăţi.

SETF

(setf (get 'pyramid-d 'color) 'red)
red
(setf (get 'pyramid-d 'supported-by) 'brick-c)
brick-c

Putem şterge o proprietate prin combinaţia:

(setf (get <simbol> <proprietate>) nil)

Problema 3

Presupunānd că avem simboluri ce au proprietatea parinte. Definiţi procedura bunic ce primeşte un simbol şi returnează bunicul din partea tatălui dacă este cunoscut, alftel nil.

Problema 4

Definiţi procedura adam care primeşte un simbol şi returnează cel mai īndepărtat strămoş pe linie paternă.

Problema 5

Definiţi procedura stramosi care returnează o listă formată din persoana împreuna cu toţi strămoşii cunoscuţi, mergând pe două proprietatăti: tata şi mama.

Matrici

Matricile se construiesc în LISP cu funcţia MAKE-ARRAY. Trebuie să specificăm numărul indicilor şi domeniul fiecăruia.

MAKE-ARRAY

Exemplul următor construieşte o matrice cu două dimensiuni:

(SETQ M (MAKE-ARRAY '(64 64)))

Fiecare indice poate lua valori între 0 şi 63. Matricea returnată de MAKE-ARRAY am legat-o ca valoare a simbolului M pentru a o putea folosi în continuare.
Odată construită o matrice putem atribui valori diferitelor locaţii.

AREF

Exemplul următor dă valoarea 88 locaţiei din matrice corespunzătoare indicilor 31 şi 27:

(SETF (AREF M 31 27) 88)

În acest context AREF doar identifică o poziţie în matrice, al cărei conţinut este modificat de către SETF. Putem folosi doar AREF pentru a obţine valoarea unei locaţii.

(AREF M 31 27)
88

Īn LISP locaţiile unei matrici pot conţine nu doar numere ci expresii arbitrare. Două locaţii diferite ale unei matrici pot conţine expresii de tipuri diferite. Funcţia ARRAY-DIMENSION returnează domeniul unui indice.

ARRAY-DIMENSION

(ARRAY-DIMENSION M 0)
64
(ARRAY-DIMENSION M 1)
64

Ambii indici ai matricii M au valori naturale mai mici ca 64.

Funcţia ARRAY-DIMENSIONS returnează domeniile tuturor indicilor într-o listă.

ARRAY-DIMENSION

(ARRAY-DIMENSIONS M)
(64 64)

Problema 6

Scrieţi o procedură PRINT-ARRAY care afişează o matrice de două dimensiuni primită ca argument. Fiecare rând al matricii va fi afişat pe o linie nouă. Folosiţi ARRAY-DIMENSION pentru a afla domeniul indicilor.

Problema 7

O altă modalitate de a reprezenta o matrice este ca lista de liste, fiecare sublistă corespunzând unei dimensiuni. Scrieţi o procedură care transformă o matrice reprezentată ca lista de liste într-o matrice standard LISP. Presupuneţi ca toate sublistele au dimensiuni egale.

Probleme

Problema 1. Fetch

Problema 2. List-keys

Problema 3. Bunic

Problema 4. Adam

Problema 5. Stămoşi

Problema 6. Print-array

Problema 7. Transformare din listă în matrice