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
|