Inteligenta Artificiala

Nu esti logat.

Munca individuala laborator 6 - Operatori si predicate dinamice.

Punctaj: 140p

Nr. 1


  1. Folosind bagof sau findall sa se scrie un predicat care parcurge o lista si, daca un element e numar par, il pune in lista rezultat, iar daca nu, afiseaza pe ecran 'am eliminat elementul x' unde pe x il inlocuiti in mesaj cu elementul corespunzator. Scrieti predicatul in 3 moduri, folosind cele 3 tipuri de if invatate (elim_list1(+L,-Lrez),elim_list2(+L,-Lrez),elim_list3(+L,-Lrez)).
  2. Se dau faptele: p(nr(1,2),[X]):-X>0. %1
    p(nr(1,2,3),7). %2
    p(a(1,2),[a,b,c]). %3
    p(7,[]). %4
    p(nr(X,Y),1). %5
    p(15,[1,2,[3]]). %6

    Se poate face un (singur) apel retractall care sa stearga doar faptele: 1,2,5? Dar un singur apel retractall care sa stearga doar 1,3,6? Verificti rezultatul stergerii cu listing(p).

  3. Folosind un predicat dinamic lista, sa se implementeze urmatoarele:
    • Un predicat add__elem_lista fara parametri care citeste un element de la tastatura si-l adauga in lista din memorie (daca lista nu exista, o creeaza).
    • Un predicat afis_lista fara parametri care afiseaza lista din memorie sau da no daca aceasta nu e inca creata.
    • Un predicat clear_lista fara parametri care sterge toate elementele din lista (da no, daca lista nu exista in memorie).
    • Un predicat remove_lista fara parametri care sterge lista in sine din memorie (da no, daca lista nu exista in memorie).
    • Un predicat sterge_elem_lista fara parametri care citeste de la tastatura un element de sters di lista. (da no, daca lista nu exista in memorie, dar yes chiar daca nu a sters elementul din lista).
  4. Avem faptele de forma: %rez(operand, operator, operand, loc_rezultat). rez(3,+,7,_).
    rez(5,+,8,_).
    rez(1,-,7,_).
    rez(3,+,4,_).
    rez(3,-,5,_).
    rez(4,×,8,_).
    rez(2,/,2,_).
    Sa se scrie un predicat care ordoneaza faptele de mai sus crescator in functie de rezultat, completand si al 4-lea parametru cu rezultatul, la rescriere.
  5. Predicat care primeste un atom, si cu ajutorul unui predicat dinamic numara caate aparatii a avut fiecare carcater in cadrul sau.
  6. Sa se scrie un operator unar, il denumiti cum doriti, care testeaza daca o lista are numar par de elemente.
  7. Sa se scrie un operator numit ### si un operator este (pe post de operator care primeste structuri continand operatorul ### si face calculul) astfel: Z este L1 ### L2. va avea urmatorul comportament:
    • Daca lista L1 nu se termina cu un atom, sau lista L2 nu incepe cu un atom apelul esueaza.
    • Daca apelul nu a esuta mai sus atunci rezultatul din Z va fi o lista rezultata prin concatenarea lui L1 la L2, insa ultimul element din L1 se va concatena de asemenea cu primul element din L2 (N1+N2-1 elemente, unde N1 si N2 sunt lungimile lui L1, respectiv L2). De exemplu Z este [a,1,b] ### [c,x,17], va pune in Z lista [a,1,bc,x,17].
    • Sa se implementeze si asociativitatea la dreapta, calculandu-se astfel si rezultate cu mai multi operatori ### insiruiti, de exemplu: Z este [a,1,b] ### [c,x,17,a] ### [z,t(1),8].

    Nr. 2

    1. Folosind bagof sau findall sa se scrie un predicat care parcurge o lista si, daca un element e atom, il pune in lista rezultat, iar daca nu, afiseaza pe ecran 'am sters elementul X' unde pe X il inlocuiti in mesaj cu elementul corespunzator. Scrieti predicatul in 3 moduri, folosind cele 3 tipuri de if invatate (elim_list1(+L,-Lrez),elim_list2(+L,-Lrez),elim_list3(+L,-Lrez)).
    2. Se dau faptele: p(1,2,3). %1
      p(2+3,[1,2]). %2
      p(a+b+c,[a,b,c]). %3
      p(2+2,[]). %4
      p(nr(X,Y),1). %5
      p(X+Y,[1,2,[X]]):- Y is X+1. %6 p(1-2,[1,2]]):- Y is X+1. %7

      Se poate face un (singur) apel retractall care sa stearga toate faptele p? Dar un singur apel retractall care sa stearga doar 2,3,6? Verificati rezultatul stergerii cu listing(p).

    3. Folosind un predicat dinamic lista/2, cu fapte de forma lista(nume_lista,continut_lista) (de exemplu: lista(a,[1,2,3])), sa se implementeze urmatoarele:
      • Un predicat add_elem_lista(+NumeLista) care citeste un element de la tastatura si-l adauga in lista din memorie (daca lista nu exista, o creeaza).
      • Un predicat afis_lista(+NumeLista) care afiseaza lista din memorie sau da no daca aceasta nu e inca creata.
      • Un predicat clear_lista(+NumeLista) care sterge toate elementele din lista data (da no, daca lista nu exista in memorie).
      • Un predicat remove_lista(+NumeLista) care sterge lista in sine din memorie (da no, daca lista nu exista in memorie).
      • Un predicat sterge_elem_lista(+NumeLista) care citeste de la tastatura un element de sters din lista. (da no, daca lista nu exista in memorie, dar yes chiar daca nu a sters elementul din lista).
    4. Avem faptele de forma: %rez(operand, operator, operand, loc_rezultat). rez(3,<,7,_).
      rez(5,==,8,_).
      rez(1,>,7,_).
      rez(3,<,4,_).
      rez(3,>=,5,_).
      rez(4,<,8,_).
      rez(2,==,2,_).
      Sa se scrie un predicat care ordoneaza faptele de mai sus crescator in functie de operator (parametrul 2), completand si al 4-lea parametru cu rezultatul (adevarat, sau fals: de exemplu rez(3,<,7,adevarat)) la rescriere.
    5. Predicat care primeste un numar mare, si cu ajutorul unui predicat dinamic numara cate aparatii a avut fiecare cifra in cadrul sau.
    6. Sa se scrie un operator unar, il denumiti cum doriti, care testeaza daca intr-o majoritatea elemntelor sunt numere pozitive (lista contine mai multe numere pozitive decat lungimea_listei/2).
    7. Sa se scrie un operator numit *** si un operator este (pe post de operator care primeste structuri continand operatorul *** si face calculul) astfel: Z este L1 *** L2. va avea urmatorul comportament:
      • Daca listele L1 si L2 nu au acelasi numar de elemente apelul esueaza.
      • Daca apelul nu a esuta mai sus atunci rezultatul din Z va fi o lista rezultata prin inmultirea fiecarui element din L1 cu corespondentul din L2. De in lista rezultat pe pozitia i vom avea rezultatul elementului de pe pozitia i din L1 cu elementul de pe pozitia i din L2. Daca elementele de inmultit sunt ambele numere, rezultatul va fi inmultirea obisnuita dintre numere. Daca unul e numar natural si celalalt atom rezultatul va fi un atom in care se repeta de N ori atomul initial, unde N era numarul de inmultit. In orice alt caz de inmultire, apelul esueaza. De exemplu Z este [4,2,b] *** [2,a,3]. Atunci in Z vom avea: [8, aa, bbb].
      • Sa se implementeze si asociativitatea la dreapta, calculandu-se astfel si rezultate cu mai multi operatori ### insiruiti, de exemplu: Z este [a,1,3] ### [7,x,17] ### [1,1,2].