Inteligenta Artificiala

Nu esti logat.

Munca individuala laborator 4 - Matrici

Punctaj: 160p

Nr. 1

  1. Se considera predicatul matr care asociaza unui nume de matrice o lista de liste reprezentand acea matrice. De exemplu: matr_nr1(m1, [[10,14,3],[2,1,21],[3,8,10]]).
    matr_nr1(m2, [[a,14,3],[2,1,21],[3,8,10]]).
    matr_nr1(m3, [[2.8,14,3],[2,1,21],[3,8,10]]).
    • Adaugati inca o matrice in baza de cunostinte.
    • Sa se scrie un predicat rest_mat(+NumeMat, +Nr, -MatRez) care primeste ca parametri un nume de matrice de numere naturale si un numar strict pozitiv. Predicatul va calcula in MatRez matricea continand resturile impartirii elementelor matricii de intrare la Nr. Predicatul va esua daca datele de intrare nu sunt corecte. | ?- rest_mat(m1,3,M).
      M = [[1,2,0],[2,1,0],[0,2,1]] ?
      yes
      | ?- rest_mat(m2,3,M).
      no
      | ?- rest_mat(m3,3,M).
      no
      | ?- rest_mat(m1,a,M).
      no
      | ?-
  2. Sa se scrie un predicat care primeste ca parametru o lista, si pe baza acesteia, genereaza o matrice. Predicatul va avea forma gen_matr(+L,+Chr,-Mat). Parmaterul Chr este o litera. Lista va fi data in L si va cuprinde structuri de forma chr(caracter, directie, numar), directia putand avea dor valorile sus si jos. De exemplu, sa presupunem ca pe pozitia i din lista de intrare avem elementul chr(a, sus, 4). Atunci coloana i a matricii va avea primele 4 elemente egale cu a, si restul vor fi egale cu Chr. Numarul de linii este dat de maximul dintre numerele date ca al treilea parametru in structura chr.

    Datele de intrare se vor testa, si in caz ca nu sunt corecte predicatul se va termina cu esec.

    | ?- gen_matr([chr(w, sus, 2), chr(a, jos, 3), chr(b, sus, 1), chr(c, sus, 0), chr(j, jos, 1)], o , M).
    M = [[w,a,b,o,o],[w,a,o,o,o],[o,a,o,o,j]] ?
    yes
    | ?- gen_matr([1,2,3],b,M).
    no
    | ?- gen_matr([chr(w, sus, 2), chr(a, jos, 3), chr(b, sus, 1)],3,M).
    no
    | ?- gen_matr([chr(w, baubau, 2), chr(a, jos, 3), chr(b, sus, 1)],a,M).
    no
    | ?-
  3. Sa se scrie predicatul constr_mat(+L1, +L2, -Mat). L1 este o lista de litere. L2 este o lista de numere naturale. Se vor verifica datele de intrare si predicatul se va termina cu esec daca acestea nu sunt corecte. Consideram Lg1 dimensiunea listei L1, iar Lg2 dimensiunea listei L2. Dimensiunea matricii va fi de Lg1 linii si Lg2 coloane. Pe fiecare coloana C a matricii se va gasi lista L1 rotita cu N pozitii in jos, unde N este elementul C din lista L2. Matricea va fi calculata in variabila Mat. | ?- constr_mat([a,b,c], [1,0,3,11], M).
    M = [[c,a,a,b],[a,b,b,c],[b,c,c,a]] ?
    yes
    | ?- constr_mat([1,a,b],[1,2,3],M).
    no
    | ?- constr_mat([aa,b,c],[1,2,3],M).
    no
    | ?- constr_mat([a,b,c],[1,-2,3,4],M).
    no
  4. Sa se scrie un predicat care primeste ca parametru de intrare un nume de matrice si calculeaza o lista pe baza matricii. Numele de matrice va corespunde unei matrici din baza de cunostinte de mai jos: mat_cl_nr1(m1, [[3,4,3,-7],[2,0,-1,-2],[3,8,1,-2],[1,2,1,-3]]).
    mat_cl_nr1(m2, [[a,1,3],[1,1,1],[0,0,1]]).
    mat_cl_nr1(m3, [[1,2,3],[2,1]]).
    Predicatul va avea forma list_tip_nr(+NumeMat,-L). L va avea ca lungime numarul de coloane al matricii. Pe pozitia I din lista L, corespunzatoare coloanei I vom avea una din valorile:
    • p - daca toate elementele de pe coloana sunt pozitive
    • n - daca toate elementele de pe coloana sunt negative
    • a - daca avem din ambele tipuri: si pozitive si negative, sau daca avem macar un element nul
    Se vor testa datele de intrare. Daca matricea nu are o forma valida sau matricea nu e contine strict din numere, predicatul va esua. | ?- list_tip_nr(m1,L).
    L = [p,a,a,n] ?
    yes
    | ?- list_tip_nr(m2,L).
    no
    | ?- list_tip_nr(m3,L).
    no
  5. Sa se scrie un predicat care primeste ca parametri de intrare doua numere naturale NrL si NrC si calculeaza o matrice cu NrL linii si NrC coloane astfel: elementul de pe linia I si coloana J va avea valoarea 'imp' daca I+J e impar si 'par' daca I+J e par. Consideram liniile si coloanele incepand de la 0. Forma predicatului va fi genereaza_mat(+NrL,+NrC,-M). Daca datele de intrare nu sunt corecte, predicatul esueaza. | ?- genereaza_mat(4,3, M).
    M = [[par,imp,par],[imp,par,imp],[par,imp,par],[imp,par,imp]] ?
    yes
    | ?- genereaza_mat(1,a,M).
    no
    | ?- genereaza_mat(-1,2,M).
    no
    | ?- genereaza_mat(0,7,M).
    M = [] ?
    yes
    | ?- genereaza_mat(2,0,M).
    M = [[],[]] ?
    yes

Nr. 2

  1. Se considera predicatul matr care asociaza unui nume de matrice o lista de liste reprezentand acea matrice. De exemplu: matr(m1, [[agu,gugu,bubi],[dudu,bob,hapciu],[miu,yahoo,ups]]).
    matr(m2, [[12,gugu,bubi],[dudu,bob,hapciu],[miu,yahoo,ups]]).
    • Adaugati inca o matrice in baza de cunostinte.
    • Sa se scrie un predicat initiala_mat(+NumeMat, -MatRez) care primeste ca parametri un nume de matrice de atomi si calculeaza in MatRez matricea continand initialele elementelor din matricea de intrare. Predicatul va esua daca datele de intrare nu sunt corecte. | ?- initiala_mat(m1,M).
      M = [[a,g,b],[d,b,h],[m,y,u]] ?
      yes
      | ?- initiala_mat(m2,M).
      no
      | ?-
  2. Sa se scrie un predicat care primeste ca parametru o lista, si pe baza acesteia, genereaza o matrice. Predicatul va avea forma gen_matr(+L,-Mat). Parmaterul Chr este o litera. Lista va fi data in L si va cuprinde structuri de forma centrat(cuvant, caracter_de_umplere). De exemplu, sa presupunem ca pe pozitia i din lista de intrare avem elementul centrat(abcd, z). Atunci coloana i a matricii va avea cuvantul abcd centrat pe ea, cate o litera pe fiecare pozitie a matricii, umpland spatiile ramase din coloana cu caracterul de umplere. Daca s-a calculat ca numarul de elemente pe coloana sa fie 6, atunci coloana va contine elementele: z, a, b, c, d, z. Numarul de linii este dat de lungimea maxima a cuvintelor date in structura centrat. Daca dorim sa centram un cuvant cu numar par de litere pe un numar impar de linii sau un cuvant cu un numar impar de litere pe un numar par de linii, numarul de spatii de umplut, pentru centrare va fi mai mic sus decat jos. De exemplu: centram 3 litere pe 8 spatii: vom lasa sus 2 spatii (in care vom pune caracterul de umplere, si jos 3

    Datele de intrare se vor testa (lista de structuri de forma centrat(atom, litera mica), si in caz ca nu sunt corecte predicatul se va termina cu esec.

    | ?- gen_matr([centrat(baubau, y), centrat(gugu, q), centrat(b, z), centrat(miau,w), centrat(ham,q)], M).
    M = [[b,q,z,w,q],[a,g,z,m,h],[u,u,b,i,a],[b,g,z,a,m],[a,u,z,u,q],[u,q,z,w,q]] ?
    yes
    | ?- gen_matr([1,2,3],M).
    no
    | ?- gen_matr([centrat(17, y), centrat(gugu, q), centrat(b, z)],M).
    no
    | ?- gen_matr([centrat(abc, def), centrat(gugu, q), centrat(b, z)],M).
    no
    | ?-
  3. Sa se scrie predicatul constr_mat(+L1, +L2, -Mat). Atat L1 cat si L2 sunt liste de numere naturale. Se vor verifica datele de intrare si predicatul se va termina cu esec daca acestea nu sunt corecte. Predicatul va construi o matrice in Mat, aceasta matrice avand numarul de linii egal cu lungimea lui L1 si numarul de coloane egal cu lungimea lui L2. Elementul de pe linia I si coloana J din Mat va fi:
    • Suma dintre elementul de pe pozitia I din L1, si elementul de pe pozitia J din L2 in cazul in care coloana (J-ul) este para.
    • Diferenta dintre elementul de pe pozitia I din L1, si elementul de pe pozitia J din L2 in cazul in care coloana (J-ul) este impara.
    Numerotarea coloanelor incepe de la 0. Matricea va fi calculata in variabila Mat. | ?- constr_mat([2,7,1], [1,0,2,5], M).
    M = [[3,2,4,-3],[8,7,9,2],[2,1,3,-4]] ?
    yes
    | ?- constr_mat([1,a,b],[1,2,3],M).
    no
    | ?- constr_mat([1,4,5],[a,2,3],M).
    no
  4. Sa se scrie un predicat care primeste ca parametru de intrare un nume de matrice si calculeaza o lista pe baza matricii. Numele de matrice va corespunde unei matrici din baza de cunostinte de mai jos: matrice(m1, [[2,4,7,-1],[7,0,5,4],[10,8,1,2],[12,2,1,-3]]).
    matrice(m2, [[a,1,3],[1,1,1],[0,0,1]]).
    matrice(m3, [[1,2,3],[2,1]]).
    L va avea ca lungime numarul de coloane al matricii. Pe pozitia I din lista L, corespunzatoare coloanei I vom avea una din valorile:
    • c - daca elementele de pe coloana sunt in ordine crescatoare
    • d - daca elementele de pe coloana sunt in ordine descrescatoare
    • n - daca elementele de pe coloana nu sunt nici in ordine crescatoare, nici descrescatoare.
    Atentie, comparatia nu e stricta, se accepta vecini pe coloana de valori egale. Se vor testa datele de intrare. Daca matricea nu are o forma valida sau matricea nu contine strict numere, predicatul va esua. | ?- list_tip_nr(m1,L).
    L = [c,n,d,n] ?
    yes
    | ?- list_tip_nr(m2,L).
    no
    | ?- list_tip_nr(m3,L).
    no
  5. Sa se scrie un predicat care primeste ca parametri de intrare doua numere naturale NrL si NrC si calculeaza o matrice cu NrL linii si NrC coloane astfel: elementul de pe linia I si coloana J va avea valoarea l daca I>=J si c in caz contrar. Consideram liniile si coloanele incepand de la 0. Forma predicatului va fi genereaza_mat(+NrL,+NrC,-M). Daca datele de intrare nu sunt corecte, predicatul esueaza. | ?- genereaza_mat(4,3, M).
    M = [[l,c,c],[l,l,c],[l,l,l],[l,l,l]] ?
    yes
    | ?- genereaza_mat(1,a,M).
    no
    | ?- genereaza_mat(-1,2,M).
    no
    | ?- genereaza_mat(0,7,M).
    M = [] ?
    yes
    | ?- genereaza_mat(2,0,M).
    M = [[],[]] ?
    yes