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 6
   

 

 

Subiecte

 

 

Liste de asociaţii

 

Se numeşte 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))

 

 

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 căuta asociaţia cu cheia dată şi va returna īntreaga asociaţie (<cheie> <valoare>). Dacă nu gaseşte cheia atunci va returna NIL.

 

Exemple

(assoc 'color brick-a)

(color red)

(assoc 'is-a brick-a)

(is-a brick)

(assoc şize 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ă:

(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 şupported-by brick-a)

(supported-by brick-c)

 

Probleme

 

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 ţemperature '((temperature 100)

(pressure (120 60))

(pulse 72)))

100

(fetch 'complaints '((temperature 100)

(pressure (120 60))

(pulse 72)))

?

 

2. Scrieţi o procedură LIST-KEYS care primeşte o lisă 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.

 

Obs: ī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 ca symbolul "pyramid-d" are proprietatea cu numele "color" ce are valoarea "red".

 

(get 'pyramid-d 'color)

red

 

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

(setf (get 'pyramid-d 'color) 'red)

red

(setf (get 'pyramid-d şupported-by) 'brick-c)

brick-c

 

Putem şterge o proprietate prin combinaţia:

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

 

 

Probleme

 

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

nil.

 

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

 

5. Definiţi procedura stramosi care returnează o listă formată din persoana īmpreună cu toţi strămoşii cunoscuţi, mergānd pe două proprietatăţi: tata şi mama.