0% found this document useful (0 votes)
63 views10 pages

BIA - Lab7

BIA - lab7

Uploaded by

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

BIA - Lab7

BIA - lab7

Uploaded by

Elenutza Elena
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF or read online on Scribd
You are on page 1/ 10
LABORATOR 7 7.1. Operatii cu multimi reprezentate sub forms de liste Multimile pot fi reprezentate in LISP (sau in Prolog) sub formi de liste liniare, putandu-se astfel implementa operatiile de incluziune, reuniune, intersectie, diferentd, Ir ci i imea ti arti. i mu. . in cele ce urmeazi nu ne intereseazi ataét tipul elementelor ce compun multimile cat modul de implementare recursivi a operatiilor amintite. Prin definitie, operatiile enumerate mai sus sunt 1° incluziunea multimii A in multimea B: AcB (WV) xeA~x eB Pentru a defini incluziunea in LISP, vom avea nevoie de o functie ajut&toare, functia apart, care s& verifice apartenenta unui element 1a o multime data, deci, apartenenta unui element la o list’. Dup& definirea acestei functii auxiliare, functia care testeazi relatia de incluziune a doui multimi date, functia inclus, va avea doi parametri formali (cele dou% multimi) si va xeturna true (t) daci incluziunea este adevarat& si false (nil) in caz contrar. (comment FUNCTIA DE APARTENENTA) (de apart (e,1) (cond ((null 1) nil) ((= (car 1) e) t) (t (apart e (cdr 1))) ) ) (comment RELATIA DE INCLUZIUNE A DOUA MULTIMI) (de inclus (11,12) (cond ((null 11) t) ((apart (car 11) 12) (inclus (cdr 11) 12)) ) ) Exemplificare: -(inelus ‘(2 3) "(5 2.143 7)) t -(inclus ‘(4 5) ‘(1 23 4)) nil Problema Se cere s& se implementeze functia care verific’ relatia de incluziune dintre dou& multimi reprezentate sub forma de liste (de intregi) in limbajul Prolog. 2° reuniunea a dou% multimi: AUB = (x|x€A sau xB) Pentru a implementa in LISP functia care determin& multimea rezultata in urma reuniunii a dou& multimi, ne vom folosi din nou de functia apart, care este de fapt un predicat care testeaz& apartenenta unui element la o multime. Functia pe care o implement&m este reuniune si'are doi parametri: cele dou& liste 1, si 1, de intrare si va returna tot o list’. vom tine cont si de urm&toarea proprietate a reuniunii, si anume: @UA=A aceasta constituind de fapt conditia de oprire din recursivitate. Functia va fi implementat% astfel: se parcurge lista 1, element cu element, testandu-se dacd acestea apartin sau nu listei 1,; dac& DA, atunci se trece la urmitorul element din 1,7 altfel, acel element din 1, care nu apare si in 1, se va include in lista rezultat si se trece apoi la urm&torul element din 1,. Cand lista 1, a fost integral parcursa, in coada listei rezultat se va adduga lista 1, in intregime, datorita conditiei de oprire din recursiviate impusa. - (de reuniune (11,12) (cond ((null 11) 12) ((apart (car 11) 12) (reuniune (cdr 11) 12)) (t (append (list (car 11)) (reuniune (cdr 11) 12))) ) Astfel: ~(reuniune ‘(3 2 41) "(5 217) (345217) -(reuniune ‘(1) ‘(2)) q 2) =(reuniune ‘(1 3.5) ‘(2 3 4)) (1523 4) Pentru ultimul exemplu, s& vedem cum are loc executia pas cu pas a functiei implementate. (135) U (234) = = (1) + ( (35) U (234) ) = = (2) + ( (5) U (234) ) = = (1) + (5) + (() U (234) ) = ee eee ee = (15234 unde prin simbolul ‘+’ am notat intuitiv functia append iar prin simbolul ’ U ’ am notat apelul recursiv al functiei reuniune. Exist& in LISP functia predefinita union care intoarce reuniunea a dou% sau mai multe multimi reprezentate sub forma de lista. intaxa: (union 1, 1, -. 1)) Exemplu: ~(union ‘(1) ‘(3 2.1) ‘(a 3 1)) (1.3 2a) Probleme: - Se cere s& se implementeze functia reuniune in Prolog. - S& se implementeze in LISP o functie care realizeazi xeuniunea unui num&r variabil de multimi reprezentate sub forma de liste. toate listele de intrare vor conetitut elemente ale unei liste neliniare care va fi astfel unicul parametru al functiei ce se va implementa. ica: 3° intersectia a dou% multimi: ANB = (x|xeA gi-xeB) Se utilizeaz& de asemenea proprietatea intersectiei: ena=e in Prolog, aceasta functie implemetats, impreun& cu functia ajutatoare apart, are urmitoarea forma: domains list = integer* predicates apart (integer , list) intersectie(list, list, list) clauses apart(X,(H}T]) if X-H or apart(x,T). intersectie([],_,[]). intersectie([H]T),L,[H]T1}) if apart(H,L) and intersectie(T,L,T1). intersectie((H]T],L,T1) if not(apart(H,L)) and intersectie(T,L,T1). La fel ca si in cazul reuniunii, in LISP exist& functia predefinits intersection: Sintaxa: (intersection 1, 1, -- 1,) Exemplu: ~(intersection ‘(3 125) ‘(5 a1) ‘(a 12147 5)) a5) Problem’: S88 se implementeze aceasta functie in LISP. 4° diferenta a dou% miltim! A\B = (x|xeA gi xB) Problema: Plecand de 1a proprietatea: - e\A=o s& se implementeze in LISP si Prolog functia care determina diferenta a doui multimi date. In LISP exist& functia predefinita difference: Sintaxa: (difference 1, 1, -. 1,) care intoarce ca rezultat lista! (.-C0, V2) Vg) ee Va 5° diferenta simetric&> RAB = (A\B)U(B\A) sau AAB = (AUB) \ (ANB) Problems: S& se implementeze in LISP si Prolog functia care determin’ diferenta simetric’ a doud multimi date. 6* produs cartezian a dou’ multimi: AxB = ((a,b)|aeA $i beB) Problema: 'S& se implementeze in LISP gi Prolog o functie care calculeaz% produsul cartezian a dows multimi date. Solutie: (LISP) (de apel (e,1) (cond ((null 1) nil) (t (append (list (list e (car 1))) (apel e (cdr 1)))) ° ») (de cart (11,12) (cond ((null 11) nil) (t (append (apel (car 11) 12) (cart (cdr 11) 12))) » Exemplu: =(cart ‘(1 23 4) ‘(a b)) ((2 a) (2b) (2 a) (2b) (3 a) (3b) (4 a) (4 b)) 7° multimea tuturor pirtilor unei multim: Be (ay, Og¢ eo Bq) PCE) = (8, (Oy) 4 (AQ) ye (My Ady ey (Ae oe A): Problems S& se implementeze in LISP o functie care construieste multimea tuturor partilor unei multimi date. i_cu polinoame © reprezentare des int4lnit& gi ugor de folosit in implementarea operatiilor de adunare, inmultire, etc. a polinoamelor este aceea de list inl&ntuit% in care celulele listei reprezint’ cate uh termen al polinomului, termen reprezentat prin dou& elemente caracteristice: e - coeficientul monomului, - - exponent. De exemplu, polinomul P(x) =3x3+2.5x+9 poate fi reprezentat sub form& de list& linear& ca in figura Tele. 3 | 3 p—)2.5) 1 9/0 Fig. 7.1. Polinom de o variabild x si grad 3 Dac& polinomul nu este de o singura variabila, aga cum este el prezentat in exemplul anterior, ci de mai multe variabile, atunci, in functie de numarul de variabile, rangul fiec&rui mono din dezvoltare va fi de fapt un vectori de puteri ale fiecdrei variabile. De exemplu, fie polinomul P de trei variabile, de grad 6: P(x,y,2) =x y*z-3x?y?+5y 2245 Reprezentarea lui printr-o list& inlantuit& este cea din figura aia 1|3|2 tH 3/2)2 oF ysie 1/2}; 5.]}0 oleh Fig. 7.2. Polinon de crad 6 si 3 variabile (1) sau, dacti exponentii celor 3 variable sunt reprezentatti ca o sublist&, atunci reprezentarea polinomului va fi cea din figura Tedd 1 5 7 3 2 0 0 2 2 - 0 a O 2 oO Fig. 7.3. Polinom de grad 6 si 3 variable (IZ) in limbajul Pascal, o astfel de structur& se definegte ca array[1..nvar] of byte; record coef ‘expo : reali 2 tips end; In LISP, polinomul din figura 7.1. poate fi reprezentat ca © list& imbricata ale c&rei elemente sunt liste ce contin doar dou& elenente, coeficientul (intreg) si exponentul: ((3 3) (-2 1) (9 0)). Polinomul din figura 7.2. va fi reprezentat tot ca o list& imbricat&’ dar sublistele monom vor avea atatea elemente cate variabile are polinomul plus unu (coeficientul): (2.3.2.1) (-3 220) (501 2) (5 00 0)) sau, conform reprezent&rii din figura 7-3., polinomul va fi: (2 (3 2.1)) (+3 (2 2 0)) (5 (0 1 2)) (5 (0 0 0))). Totugi, din punct de vedere al nivelelor structurii de list’, aceast’ notatie nu este in totalitate in conformitate cu reprezentarea din figura, doearece, toti coeficientii ar trebui situati pe nivelul 1 al listei iar din reprezentarea in LISP ar rezulta c& acestia se afl pe nivelul 2, dar am preferat totugi gruparea coeficientului gi a sublistei — exponentilor corespunz%tori unui monon intr-o sublist& pentru a evidentia faptul c& se refers la un monom din dezvoltarea polinomului ca sum& de monoame. in acest caz, este importanta ordinea variabilelor (ordinea exponentilor variabilelor) care trebuie si fie aceeasi pentru fiecare monom in parte. - in Prolog vom putea considera coeficientii de tip real iar structura de list& corespunzitoare se va reprezenta astfel: domains _ list = integer* poli = monon* monom = mon(real, list) Astfel, polinomul din figura 7.3. poate fi reprezentat ca mai jos: {mon(1, [3,2,1]) pmon(~3,[2,2,0}) ,mon(5,[0,1,2]) ,mon(5,[0,0,0])]. Folosind aceast& reprezentare, vom putea in continuare implementa operatiile elementare cu polinoame gi ne vom rezuma in cele ce urmeaz& doar la adunarea gi inmultirea a doua polinoame, putandu-se apoi generaliza la n polinoame (o lista de n polinoame) . (1ist_poli = poli*) Va trebui si implementam pe lang cele dou& functii, de adunare gi inmultire a dov% polinoame, o serie de functii ajut&toare printre care: reducerea termenilor asemenea intr-un polinom, eliminarea termenilor cu coeficient egal cu zero, identificarea monoamelor de un anumit rang intr-un polinom, etc. Problem&_propusi: Se cere s& se implementeze in LISP gi in Prolog functiile de insumare, respectiv inmultire a doua polinoame. Solutie (Prolog): domains lstr = real* list = integer* poli = monom* monom = mon(real,list) predicates gasit(poli,list) coef (poli, list,real) coefn(poli,list,1str) cat(poli,poli,poli) elim(poli, list, poli) sum(1str,real) suml(list,list,list) redu0(poli,poli) prodm(monom,poli,poli) prod(poli,poli,poli) redu(poli,poli) sum_p(poli,poli,poli) xedu_poli(poli,poli) sum_poli(poli,poli,poli) prod_poli(poli,poli,poli) clauses sum([],0). sum((H/T],R) if sum(T,R1) and R=WARL. cat({} /L,/L). cat([H}T],L,(H]T1}) if cat(T,L,T1). gasit([mon(_,L1)|T],L) if -Li-L or gasit(T,L). coef ((mon(xX,L)|_],L,X). coef({_|T],L,xX) if coef(T,L,X). eosen (ile cha ae coefn([mon(X,L)}T],L,(X}L1]) if coefn(T,L,L1). coefn({_}T],L,L1) if coefn(T,L,L1). elim({}/_,(})+ elim([mon(_,L)]T],L,T1) if elim(T,L,T1). elim({mon(X,11)|T],L, (mon(Xx,11)}T1]) if elim(T,L,T1). sum_p({J,L,L). sum_p({mon(X,L) |] ,P,(mon(X,L){T1}) if not(gasit(P,L)) and sum_p(T,P,T1). sum_p([mon(X,L)}T].,P,{mon(X1,L)}T1]) if gasit(P,L) and coef(P,L,X2) and X1=X+X2 and elim(P,L,P1) and sum_p(T,P1,T1). sum_poli(P1,P2,P) if sum_p(P1,P2,P3) and redu0(P3,P). xedu0({],[])- redu0([mon(0,_){T],T1) if reduo(T,T1). redu0([mon(X,E) |T],[mon(X,L)|T1]) if X<>0, redu0(T,T1). reda({},[J)- redu([mon(X,L)|T],{mon(X,L){T2]) if not(gasit(T,L)) and redu(T,T1). redu((mon(X,L)|T],{mon(X1,L)|T1]) if gasit(T,L) and coefn(T,L,R) and sum(R,R1) and X1=X+R1 and elim(T,L,TT) and redu(TT,T1). redu_poli(Pl,P) if redu(P1,P2) and redu0(P2,P). suml((],(1/(1)+ suml([H1!T1],(H2|T2],(H]L}) if H=H1+H2, suml(T1,T2,L). prodm(_,{},{])+ prodm(mon(C,L) ,{mon(C1,L1)!T],[mon(C2,L2)}T2)) if c2=cécl, suml(L,L1,L2), prodm(mon(C,L),T,T2). prod({},_,(])- proa([H!/T],L1,R) if prodm(H,L1,R1) and prod(T,L1,R2) and cat(R1,R2,R3) and redu(R3,R). prod poli(P1,P2,P) if prod(P1,P2,P3) and redu0(P3,P). goal sum_poli( (mon(3,[2,1]),mon(-1,[1,2}),mon(2,[1,0])1, {mon(4,[2,0]),mon(-1,[2,1}),mon(~1,(1,2]), mon(1,[0,1]),mon(5, 1X), writef£("\n") ,write(x) ,writef("\n") ; vedu_poli({mon(3,[{2,1]),mon(-2,[0,1]),mon(1,[1,0]), mon(~1,{2,1}),mon(1,[{1,0}) ,mon(0.5,[1,1]), mon(-1,[0,1]),mon(2,[2,1])],¥), write(¥), writef("n"), prod_poli([mon(2,[1,1]),mon(~1,{2,1])1], {mon(1,[0,1]),mon(1,[1,1])],2), write(z), writef("\n"), prod_poli({mon(1,{1]),mon(~1,[01)], {mon(1,[1]),mon(1,[0])},U), write(U). Programul va, afiga ca urmare a specificatiilor din goal urm&toarea iegire: {mon(2,[2,1]),mon(-2,[1,2]),mon(2,[1,0]), mon(4,[2,0]),mon(1,[0,1]),mon(5,[0,0})] {mon(4,[2,1]),mon(~3,[0,1]),mon(2,[1,0]) ,mon(0.5,[1,1])} {mon(2,[1,2]),mon(1,[2-2]}),mon(~1,[3,2])] [mon(1,[2]),mon(-1,[0])} Cele patru rezultate de mai sus au fost obtinute, matematic, astfel: (3x2y -xy? + 2K) + (4x2 2y-xy ey +5) = (1 a 2xty —2xy?+ 2x +492 +y +5 i 3xty -2y +x -x?y+x+0.5xy-y+2x2y= (2 24x2y -3y +2x+0.5xy (axy -x2y ) x (y+xy ) = 2xy? +x2y? — xy? 13] (x-2) x (x41) 2x2 (4) 7.3. Probleme propuse 1" S& se scrie o functie LISP care returneazi al n-lea element dintr-o list& oarecare data. Observatie: in limbajul LISP exist’ o functie predefinita nth care returneaz& al n-lea element dintr-o list&, indiferent dac& acesta este atomic sau nu; Sintaxa: (nth n 1) unde n reprezint& pozitia elementului ce va fi returnat din lista 1 data. Exemplu: ~(nth 3.'(4 5 6 7 8)) 6 -(nth-o_"(1 2 3)) nil ~(nth 4 "(1 2 3)) nil ~(nth 2 -1((2 (2)) (((3) 4) 5) 6)) (((3) 4) 5) 2° S& se implementeze aceeasi functie si in Prolog. 3° Si se implementeze in LISP functia cerut& la problema 1° dar care s& returneze al n-lea atom numeric dintr-o list& imbricata. De exemplu, dact lista data ar fi 1 = ((a (b)) © ((d)) (e (£ (g) h))) gin = 5, atunci regultatul intors va fi e. 4° S& se implementeze in LISP gi Prolog functiile LISP predefinite rplaca si rplcd.

You might also like