Sisteme Expert

Nu esti logat.

Munca individuala laborator 3 - Liste

Punctaj: 220p

Nr. 1

  1. Rezolvati subpunctele de mai jos. Rezolvarile se vor scrie intr-un fisier txt.
    1. Se considera urmatoarea baza de cunostinte:
      lista_nr1([1.0,3,X,1]).
      lista_nr1([1,3,2,1]).
      lista_nr1([a,1,2,b]).
      lista_nr1([1,2,3]).
      lista_nr1([]).
      lista_nr1([1.0,2.0,3,2]).
      lista_nr1([1,2+3,3,1]).
      Sa se completeze urmatoarea interogare compusa | ?- lista_nr1(L),L = ... astfel incat sa obtina pe rand (ca solutii) in L listele de 4 elemente, unde elementele sunt toate numere.
    2. Precizati daca forma de scriere a listei de mai jos e valida, si daca da, dati un exemplu de lista care sa se unifice cu aceasta:
      [A,B|[C,[C]]]
    3. Cate elemente au listele urmatoare: L1=[1+2,[2,3]|[2,3]], L2=[], L3=[[1,2],[X]], L4=[L1|L2], L5=[L2|L1] ?
    4. Folosind o parte din urmatoarele expresii logice (teste) si operatorii logici (si ",", sau ";", not "\+"), completati definitia predicatului p(+T, -X) astfle incat la apelul p(term([a,b,1,2,3]),X) in X rezultatul sa fie [4,5]. Atentie, nu e obligatoriu sa folositi toate expresiile, si puteti folosi o expresie de mai multe ori. Numele de variabile din cadrul expresiilor logice pot fi inlocuite cu numele de variabile de care aveti nevoie (inclusiv variabila anonima, daca e cazul). In afara de numele de variabile nu mai puteti schimba nimic. A=..[B|C], A=[B], A=[B|C], A=[B|[C,D]], A is B+2, A is B-1, A=B+2, L=[A+2, B+2].
  2. Se considera scrise deja urmatoarele fapte: ras_malefic(vrajitoare, ['mua-ha-ha', 'ba-hah-ha', 'wuahahaha']).
    ras_malefic(fantoma, ['buhuhuhu-uuuu','wuhuhu', 'haaaaaaaa']).
    ras_malefic(vampir, ['chiri-chiri-chiri-chiri', 'hir-hir']).
    ras_malefic(timid, ['hi-hi-hi-uhm-hi?','heh']).
    ras_malefic(capcaun, ['u-hu-hu-huh','groh-hroh-hoo','wuhuhu']).
    ras_malefic(balaur, ['groh-hroh-hoo','wuahahaha','wuhuhu','heh']).

    Completati baza de cunostinte, folosind liste, pentru urmatoarele afirmatii:

    • Ion se teme de vrajitoare si vampiri.
    • Alin se teme de timizi, balauri si capacauni.
    • Natalia se teme de fantome.

    Sa se scrie un predicat care da perechile de monstruleti care au un tip de ras comun. Daca au mai multe rasete comune nu se considera gresit daca o solutie apare de mai multe ori. | ?- pereche_monstruleti(M1,M2).
    M1 = vrajitoare,
    M2 = balaur ? ;
    M1 = fantoma,
    M2 = capcaun ? ;
    M1 = fantoma,
    M2 = balaur ? ;
    M1 = timid,
    M2 = balaur ? ;
    M1 = capcaun,
    M2 = fantoma ? ;
    M1 = capcaun,
    M2 = balaur ? ;
    M1 = capcaun,
    M2 = balaur ? ;
    M1 = balaur,
    M2 = vrajitoare ? ;
    M1 = balaur,
    M2 = fantoma ? ;
    M1 = balaur,
    M2 = timid ? ;
    M1 = balaur,
    M2 = capcaun ? ;
    M1 = balaur,
    M2 = capcaun ? ;
    no
    | ?-

    Sa se scrie un predicat care primeste ca parametru un tip de raset si un nume de copil si se termina cu succes daca acel copil se teme de acel raset (copiii se tem de rasul respectiv daca e specific unei anumite entitati de care se tem). | ?- se_teme('Ion','hir-hir').
    yes
    | ?- se_teme('Ion','heh').
    no
    | ?-

  3. Sa se scrie un predicat care primeste ca parametru o lista (care contine atomi, numere si variabile) si calculeaza media aritmetica a numerelor din lista. In cazul in care lista nu contine niciun numar, predicatul se termina cu esec. | ?- med_list([a,2,X,b,3,7,bubu,4],M).
    M = 4.0 ?
    yes
    | ?- med_list([a,b,X],M).
    no
    | ?-
  4. Se considera o lista care cuprinde diversi termeni, sa se scrie un predicat care calculeaza lista de termeni compusi de forma lg(atom, lungime), continand doar lungimile atomilor din prima lista, care incep cu o litera mica. Daca lista nu e formata doar din atomi, predicatul esueaza. Forma predicatului va fi calc_list_lg(+L,-Lrez).

    Exemple:

    | ?- calc_list_lg([abc, dudu, '+ceva', a, miaunescu, '', beeee],L).
    L = [lg(abc,3),lg(dudu,4),lg(a,1),lg(miaunescu,9),lg(beeee,5)] ?
    yes
    | ?- calc_list_lg([abc, 11, a, beeee],L).
    no
    | ?-
  5. Sa se scrie un predicat care primeste ca parametri de intrare 2 liste si calculeaza o a treia lista: sum_nr_lst(+L1,+L2-L). Listele pot contine numere, atomi sau variabile. Listele se parcurg in paralel. In cazul in care ambele liste au ajuns cu parcurgerea la cate un numar, in lista rezultat se adauga suma elementelor. In cazul in care o lista ajunge cu parcurgerea la ceva ce nu e numar, sare peste acel element, si nu se adauga nimic in lista rezultat (atentie, nu ambele liste sar peste elemente, ci doar lista care a ajuns la un element nenumeric, cealalta ramanand cu parcurgerea la acelasi element).

    Predicatul termina de calculat lista rezultat, cand se termina de parcurs una dintre cele doua liste.

    Exemplu:

    | ?- sum_nr_lst([10,a,7,z,X,1,q,q,q],[2,2,b,c,10,3],Lrez).
    Lrez = [12,9,11] ?
    yes
    | ?-
  6. Se considera o lista care are ca elemente numere si liste de numere. Sa se scrie un predicat care face suma tuturor numerelor din lista ( si a celor care apar ca elemente directe, dar si a celor din elementele-lista. Predicatul va avea forma sum_num_lista(+L,-Rez).

    Daca lista data ca parametru de intrare contine si alt tip de elemente in afara de numere si liste, predicatul va esua.

    Exemplu:

    | ?- sum_num_lista([1,2,[2,3,4],4,[1,2]],S).
    S = 19 ?
    yes
    | ?-
  7. Sa se scrie un predicat verif_list(+L,+Nr) care primeste o lista de numere si verifica faptul ca distanta (modulul diferentei) intre fiecare doua numere vecine este mai mare decat Nr. | ?- verif_list([2,5,1,10,3],2).
    yes
    | ?- verif_list([2,1,1,10,3],2).
    no
    | ?-
  8. Sa se scrie un predicat care genereaza lista numerelor de 3 cifre, cu proprietatea ca respectivele cifre sunt consecutive (si in ordine crescatoare de la cifra cea mai semnificativa la cea mai nesemnificativa) | ?- genNumere3Cons(L).
    L = [123,234,345,456,567,678,789] ?
    yes
    | ?-
  9. Se da o lista de termeni compusi, de forma term(nr1, ... ,nr_k). Intr-un termen compus de tip term, pot fi oricate numere. Sa se scrie un predicat sum_term(+L,-Sum), care parcurge lista si calculeaza o lista cu suma elementelor din fiecare termen compus. Predicatul va esua daca lista de intrare nu este corecta. | ?- sum_term([term(1,2),term(10,20,10), term(7)],S).
    S = [3,40,7] ?
    yes
    | ?- sum_term([term(1,2),a(10,20,10), term(7)],S).
    no
    | ?- sum_term([term(1,2,abcd),term(10,20,10), term(7)],S).
    no
    | ?-

Nr. 2

  1. Rezolvati subpunctele:
    1. Se considera urmatoarea baza de cunostinte: lista_nr2([a,b,1,A,3,A,d,f,A,x]).
      lista_nr2([t,z,B,A,h]).
      lista_nr2([a,b,c,A]).
      Sa se completeze interogarea compusa de mai jos, astfel incat sa aiba ca solutii toate listele in care apare exact o variabila (de exemplu apare doar A, nu si B), dar acea variabila poate sa apara pe multiple pozitii in lista, asa cum se poate vedea in exemplu: | ?- lista_nr2(L),....
      L = [a,b,1,_A,3,_A,d,f,_A,x] ? ;
      L = [a,b,c,_A] ?
      yes | ?-
      Indicatie: rezolvarea poate folosi si un operator ! (cut), insa nu e obligatoriu (poate gasiti o alta rezolvare decat cea la care m-am gandit eu).
    2. Precizati daca forma de scriere a listei de mai jos e valida, si daca da, dati un exemplu de lista care sa se unifice cu aceasta:
      [[A,B]|[T|[]]]
    3. Cate elemente au listele urmatoare: L1=[[]|[]], L2=[[],[]], L3=[1,2,[X]], L4=[L1|L2], L5=[L2|L1] ?
    4. Folosind o parte din urmatoarele expresii logice (teste) si operatorii logici (si ",", sau ";", not "\+"), completati definitia predicatului p(+T, -X) astfle incat la apelul p(term([a,[1],[2],[3]],X) in X rezultatul sa fie a(4). Atentie, nu e obligatoriu sa folositi toate expresiile, si puteti folosi o expresie de mai multe ori. Numele de variabile din cadrul expresiilor logice pot fi inlocuite cu numele de variabile de care aveti nevoie (inclusiv variabila anonima, daca e cazul). In afara de numele de variabile nu mai puteti schimba nimic. A=..[B|C], A=[B], A=[B|C], A=[B|[C,D]], A is B+1, A=B+1, L=[A+1].
  2. Se considera scrise deja urmatoarele fapte: canta('Ion',[vioara, pian, chitara]).
    canta('Bobulet',[pian, triunghi, nai]).
    canta('Marcu',[toba]).
    canta('Nae',[fluier,tractor]).
    canta('Lili',[toba, fluier]).

    Completati baza de cunostinte, folosind liste, pentru urmatoarele afirmatii:

    • Pentru cantecul Geometria Clinchetitoare e nevoie de triunghi si toba.
    • Pentru cantecul Trei Oi Ragusite e nevoie de vioara, nai si tractor.
    • Pentru cantecul Cantec de Enervat Vecinii e nevoie de pian, toba, chitara.

    Sa se scrie un predicat care primeste numele a doi copii si calculeaza lista instrumentelor la care acestia pot canta (insrtrumentele nu trebuie sa se repete in lista). | ?- canta_instr('Ion','Bobulet',L).
    L = [nai,triunghi,chitara,pian,vioara] ?
    yes
    | ?-

    Sa se scrie un predicat care primeste un nume de cantec si calculeaza lista cu copii care pot sa cante acel cantec. Atentie, un copil nu poate canta la doua instrumente in acelasi timp. Nu se considera gresit daca apar liste cu aceleasi nume, dar puse in ordine diferita (un astfel de rezultat poate fi obtinut daca doi copii canta la doua instrumente comune si isi pot schimba locurile intre ei) | ?- cine_canta('Cantec de Enervat Vecinii',L).
    L = ['Ion','Marcu','Bobulet'] ? ;
    L = ['Ion','Lili','Bobulet'] ? ;
    L = ['Ion','Lili','Marcu'] ? ;
    no
    | ?- cine_canta('Trei Oi Ragusite',L).
    L = ['Nae','Bobulet','Ion'] ? ;
    no
    | ?-

  3. Sa se scrie un predicat de forma urmatoare nr_cuv(+L,+Lit1,+Lit2,-NrL1,-NrL2) unde L este o lista de cuvinte (atomi) iar Lit1 si Lit2 sunt doua litere date. Predicatul va calcula in NrL1 cate cuvinte din lista au prima litera egala cu Lit1, iar in NrL2 cate cuvinte din lista au a doua litera egala cu Lit2. Atentie la cuvintele cu o singura litera. In cazul in care lista contine si altceva decat atomi, predicatul se termina cu esec. | ?- nr_cuv([b,acd,abd,bbb,a,gg],a,b,Na,Nb).
    Na = 3,
    Nb = 2 ?
    yes
    | ?- nr_cuv([b,acd,abd,14,bbb,a,gg],a,b,Na,Nb).
    no
    | ?-
  4. Se considera o lista care cuprinde diversi termeni, sa se scrie un predicat care calculeaza lista de termeni compusi de forma nr_voc(atom, nr_v), continand numarul de vocale ale atomilor din prima lista, care sunt formati exclusiv din litere mici. Vocalele sunt a,e,i,o,u. Daca lista nu e formata doar din atomi, predicatul esueaza. Forma predicatului va fi calc_nr_voc(+L,-Lrez).

    Exemple:

    | ?- calc_nr_voc([abce, a1a, aea,x, i,bcd, 'a+a'],L).
    L = [nr_voc(abce,2),nr_voc(aea,3),nr_voc(x,0),nr_voc(i,1),nr_voc(bcd,0)] ?
    yes
    | ?- calc_nr_voc([abce, 105, a1a, aea,x, i,bcd, 'a+a'],L).
    no
    | ?-
  5. Sa se scrie un predicat care primeste ca parametri de intrare 2 liste si calculeaza o a treia lista: concat_atomi(+L1,+L2,-L). Listele pot contine numere, atomi sau variabile. Listele se parcurg in paralel. In cazul in care ambele liste au ajuns cu parcurgerea la cate un atom, in lista rezultat se adauga concatenarea elementelor. In cazul in care o lista ajunge cu parcurgerea la ceva ce nu e atom, sare peste acel element, si nu se adauga nimic in lista rezultat (atentie, nu ambele liste sar peste elemente, ci doar lista care a ajuns la un element care nu este atom, cealalta ramanand cu parcurgerea la acelasi element). Predicatul termina de calculat lista rezultat, cand se termina de parcurs una dintre cele doua liste.

    | ?- concat_atomi_lst([2,ab,X,def,miau,14],[xyz,8,+++,haha,A, tutu, 20],L).
    L = [abxyz,'def+++',miauhaha] ?
    yes
    | ?-
  6. Se considera o lista care are ca elemente atomi si liste de atomi. Sa se scrie un predicat care gaseste cel mai mare caracter (cu codul ASCII cel mai mare) cu care incep atomii respectivi (se va cauta initiala maxima luand in considerare atat atomii care apar ca elemente simple cat si atomii care apartin listelor. Predicatul va avea forma max_lit_list(+L,-Rez).

    Daca lista data ca parametru de intrare contine si alt tip de elemente in afara de atomi si liste, predicatul va esua.

    Exemplu:

    | ?- max_lit_list([gugu,[abc,rrr,def],[bubu,aha],ha,[pqr, h, tv, a]],Max).
    Max = t ?
    yes
    | ?- max_lit_list([gugu,12,[abc,rrr,def],[bubu,aha],ha,[pqr, h, tv, a]],Max).
    no
    | ?-
  7. Se considera o lista cu elemente variate care contin datele pentru mai multi elevi. Elementele sunt ordonate astfel: [prenume1, nume1, clasa1, prenume2, nume2, clasa2, etc.] Sa se scrie un predicat, afis_date_elevi(+L) care parcurge lista si afiseaza pe ecran, informatii despre toti elevii. Atentie daca lista nu e in format corect (atom, atom, numar atom, atom, numar, etc.), predicatul esueaza.

    | ?- afis_date_elevi(['Ion','Popescu',5,'Ana','Ionescu',3,'Dorin','Georgescu',4,'Costel','Pop',4]).
    Ion Popescu e in clasa a-5-a.
    Ana Ionescu e in clasa a-3-a.
    Dorin Georgescu e in clasa a-4-a.
    Costel Pop e in clasa a-4-a.
    yes
    | ?- afis_date_elevi([1000, 'Ion','Popescu',5,'Ana','Ionescu',3,'Dorin','Georgescu',4,'Costel','Pop',4]).
    no
    | ?-
  8. Sa se scrie un predicat care genereaza o lista cu toate numerele de trei cifre cu proprietatea ca prima cifra e egala cu ultima, iar cifra din mijloc e mai mare sau egala cu suma celor doua. Atentie, e nevoie sa setati printdepth-ul la o dimensiune mai mare decat cea default. | ?- genNrSim(L). L = [121,131,141,151,161,171,181,191,242,252,262,272,282,292,363,373,383,393,484,494] ?
    yes
    | ?-
  9. Se da o lista de termeni compusi, de forma atm(atom1, atom2,..., atom_k). Intr-un termen compus de tip term, pot fi oricati atomi.

    Sa se scrie un predicat nr_atm_term(+Chr,+L,-Nr),care parcurge lista si afla de cate ori apare caracterul Chr in total, in atomii din fiecare termen. Lista rezultat va avea ca elemente numarul de aparitii ale lui Chr pentru fiecare termen compus in parte, din prima lista. Predicatul va esua daca lista de intrare nu este corecta.

    | ?- nr_atm_term(b,[atm(abd,bubu,ha), atm(xyz),atm(bebe,bau), atm(aabb,dudu,lulu,x)],L).
    L = [3,0,3,2] ?
    yes
    | ?- nr_atm_term(b,[altceva(abd,bubu,ha), atm(xyz),atm(bebe,bau), atm(aabb,dudu,lulu,x)],L).
    no
    | ?-

Nr. 3

  1. Rezolvati subpunctele:
    1. Se considera urmatoarea baza de cunostinte: lista_nr3([a,b]).
      lista_nr3([a,b,b]).
      lista_nr3([1,1]).
      lista_nr3([a,X]).
      lista_nr3([t(x),t(x)]).
      lista_nr3([bzz,bzz,bzz]).
      Sa se completeze interogarea compusa de mai jos, astfel incat sa aiba ca solutii toate listele avand 2 sau 3 elemente, si toate elementele sa fie egale intre ele, asa cum se poate vedea in exemplu: | ?- lista_nr3(L),....
      L = [1,1] ? ;
      L = [a,a] ? ;
      L = [t(x),t(x)] ? ;
      L = [bzz,bzz,bzz] ? ;
      no
      | ?-
    2. Precizati daca forma de scriere a listei de mai jos e valida, si daca da, dati un exemplu de lista care sa se unifice cu aceasta:
      [A|[A,B,A|T]]
    3. Cate elemente au listele urmatoare: L1=[[],[]|[]], L2=[[]], L3=[[L2]], L4=[L2|L2], L5=[L2,L1] ?
    4. Folosind o parte din urmatoarele expresii logice (teste) si operatorii logici (si ",", sau ";", not "\+"), completati definitia predicatului p(+T, -X) astfle incat la apelul p([1,[2,3],4],X) in X rezultatul sa fie [4,[5]]. Atentie, nu e obligatoriu sa folositi toate expresiile, si puteti folosi o expresie de mai multe ori. Numele de variabile din cadrul expresiilor logice pot fi inlocuite cu numele de variabile de care aveti nevoie (inclusiv variabila anonima, daca e cazul). In afara de numele de variabile nu mai puteti schimba nimic. A=..[B|C], A=[B], A=[B|C], A=[B|[C,D]], A is B+1, A=B+1, L=[A+1].
  2. Intr-un oras erau cateva tanti care aveau multe multe pisici. Mai jos aveti niste fapte care indica pentru fiecare tanti ce rase de pisici au prin casa. crazy_cat_lady('Agripina',[bobtail, persana, sphynx]).
    crazy_cat_lady('Maritza',['Maine Coon',birmaneza,bobtail]).
    crazy_cat_lady('Aglaia',[birmaneza,siameza, angora, persana]).
    crazy_cat_lady('Albertina',[angora, bobtail ,siameza, sphynx, persana]).
    crazy_cat_lady('Zenobia',[abisiana, angora, persana, sphynx]).
    crazy_cat_lady('Adelaida',[bobtail, sphynx]).
    crazy_cat_lady('Clementina',[bobtail, sphynx]).

    Completati baza de cunostinte, folosind liste, scriind cate un fapt pentru fiecare din urmatoarele afirmatii (aceste afirmatii nu sunt de natura stiintifica, generala; de exemplu o pisica siameza poate sa zgarie rau si alte tipuri de pisici decat cele din lista):

    • O pisica siameza zgarie rau pisicile de tip persana, abisiana si Main Coon
    • O pisica Main Coon zgarie rau pisicile persane si abisiene.
    • O pisica abisiana zgarie rau doar pisicile siameze.
    • O pisica persana e prea lenesa sa mai zgarie pe cineva.

    Sa se scrie un predicat care primeste numele a doua tanti si returneaza yes daca prima tanti o admira pe a doua. Asta se intampla numai daca a doua are toate tipurile de pisici pe cere le are prima, si inca cel putin un tip in plus. | ?- admira('Adelaida','Albertina').
    yes
    | ?- admira('Adelaida','Zenobia').
    no
    | ?- admira('Adelaida','Clementina').
    no
    | ?-

    Sa se scrie un predicat care primeste un nume de tanti si verifica daca la ea prin casa iese cu zgreptaneala. Zgreptaneala se intampla doar daca exista cel putin doua pisici cu proprietatea ca una are dorinta de a o zgaria rau pe cealalta. Tipurile de pisici care nu au fost indicate ca dorind sa zgarie pe cineva, sunt pisici cuminti care se inteleg cu orice pisica. | ?- zgreptaneala('Agripina').
    no
    | ?- zgreptaneala('Zenobia').
    no
    | ?- zgreptaneala('Albertina').
    yes
    | ?-

  3. Sa se scrie un predicat cu doi parametri. Primul parametru va fi o lista data, L, iar in al doilea parametru, o variabila calculata, Semn, care va putea avea doar una dintre valorile '>','<','=': eval_sum_par_impar(+L,-Semn) Predicatul va calcula suma numerelor pare si suma numerelor impare din lista, si in functie de asta, daca suma numerelor pare e mai mare decat cea a numerelor impare, in Semn se va calcula simbolul '>', daca e mai mica, in semn vom avea '<' si daca e egala Semn va fi '='. | ?- eval_sum_par_impar([1,21,ab,10,3,w,5],Semn).
    no
    | ?- eval_sum_par_impar([1,20,5, 3.123],Semn).
    Semn = > ?
    yes
    | ?- eval_sum_par_impar([101,20,5, 3.123],Semn).
    Semn = < ?
    yes
    | ?- eval_sum_par_impar([3.123, 5,5,10],Semn).
    Semn = = ?
    yes
    | ?-
  4. Se considera o lista care cuprinde diversi termeni, sa se scrie un predicat care calculeaza lista de termeni compusi de forma mijloc(atom, chr_mij), continand caracterul din mijloc al atomilor din prima lista, care au lungime impara. Daca lista nu e formata doar din atomi, predicatul esueaza. Forma predicatului va fi calc_mij(+L,-Lrez).

    Exemple:

    | ?- calc_mij([aba, wwww, gugu, cipic, a],L).
    L = [mijloc(aba,b),mijloc(cipic,p),mijloc(a,a)] ?
    yes
    | ?- calc_mij([aba, 12, wwww, gugu, cipic],L).
    no
    | ?-
  5. Sa se scrie un predicat care primeste ca parametri de intrare 2 liste si calculeaza o a treia lista: multiplicare(+L1,+L2,-L). Listele pot contine numere, atomi sau variabile. Listele se parcurg in paralel. In cazul in care in prima lista s-a ajuns cu parcurgerea la un numar natural N si in cealalta la un atom, in lista rezultat se adauga atomul multiplicat de N ori (de exemplu daca N e 3 si atomul e ab, se adauga in lista rezultat ababab). In cazul in care prima lista ajunge cu parcurgerea la ceva ce nu e numar intreg, sau a 2-a ajunge la ceva ce nu e atom, se sare peste acel element, si nu se adauga nimic in lista rezultat (atentie, nu ambele liste sar peste elemente, ci numai prima lista atunci cand a ajuns la ceva ce nu e numar natural, sau a doua daca a ajuns la un element care nu este atom, cealalta lista ramanand cu parcurgerea la acelasi element). Predicatul termina de calculat lista rezultat, cand se termina de parcurs una dintre cele doua liste.

    | ?- multiplicare([2,bubu,1,3,4,0,a,2],[qw,ceva,lu,103,zu,ha,tu],L).
    L = [qwqw,ceva,lululu,zuzuzuzu,'',tutu] ?
    yes
    | ?-
  6. Se considera o lista care are ca elemente atomi si liste de atomi. Sa se scrie un predicat care gaseste cea mai mare lungime de atom (se va cauta lungimea maxima luand in considerare atat atomii care apar ca elemente simple cat si atomii care apartin listelor. Predicatul va avea forma max_lg_atom(+L,-Rez).

    Daca lista data ca parametru de intrare contine si alt tip de elemente in afara de atomi si liste, predicatul va esua.

    Exemplu:

    | ?- max_lg_atom([abc,[zuzu,abcde,a],yuyu,[ha,'',bubu],mov],X).
    X = 5 ?
    yes
    | ?-
  7. Sa se scrie un predicat verif_par_list(+L) care primeste o lista de numere si verifica faptul ca fiecare doua numere au paritati diferite. | ?- verif_par_list([2,5,4,1,10,3]).
    yes
    | ?- verif_par_list([2,1,1,10,3]).
    no
    | ?-

  8. Sa se scrie un predicat care genereaza o lista cu toate numerele de trei cifre cu proprietatea ca prima cifra e egala cu ultima, iar cifra din mijloc e un multiplu al primeia, mai mare strict decat cifra respectiva. Atentie, e posibil nevoie sa setati printdepth-ul la o dimensiune mai mare decat cea default. | ?- genNrMult(L).
    L = [121,131,141,151,161,171,181,191,242,262,282,363,393,484] ?
    yes
    | ?-
  9. Se da o lista de termeni compusi, de forma atm(atom1, atom2,..., atom_k). Intr-un termen compus de tip term, pot fi oricati atomi.

    Sa se scrie un predicat nr_cons_term(+L,-Nr),care parcurge lista si afla cate consoane exista in total, in atomii din fiecare termen. Lista rezultat va avea ca elemente numarul total de consoane din parametrii fiecarui termen compus in parte, din prima lista. Predicatul va esua daca lista de intrare nu este corecta.

    | ?- nr_cons_term(b,[atm(abd,bubu,ha), atm(aei),atm(xyz,huhu), atm(aabb,a,e,x)],L).
    L = [5,0,5,3] ?
    yes
    | ?- nr_cons_term(b,[altceva(abd,bubu,ha), atm(xyz),atm(bebe,bau), atm(aabb,dudu,lulu,x)],L).
    no
    | ?-

Nr. 4

  1. Rezolvati subpunctele:
    1. Se considera urmatoarea baza de cunostinte: lista_nr4([[],[],[]]).
      lista_nr4([[2,3],[2],[0]]).
      lista_nr4([[c],[b],[a]]).
      lista_nr4([[c],[[bau]],[a]]).
      lista_nr4([[b],[a],[a],[a]]).
      lista_nr4([1,2,3]).
      lista_nr4([1,2,3,4]).
      lista_nr4([[100],[zzz],[_X]]).
      Sa se completeze interogarea compusa de mai jos, astfel incat sa aiba ca solutii toate listele listele care contin exact 3 elemente, fiecare fiind o lista cu un element, asa cum se poate vedea in exemplu: | ?- lista_nr4(L),....
      L = [[c],[b],[a]] ? ;
      L = [[c],[[bau]],[a]] ? ;
      L = [[100],[zzz],[_A]] ? ;
      no
    2. Precizati daca forma de scriere a listei de mai jos e valida, si daca da, dati un exemplu de lista care sa se unifice cu aceasta:
      [A,A,[B|A]]
    3. Cate elemente au listele urmatoare: L1=[[[]]], L2=[1,2|[1,2]], L3=[], L4=[L1,L2], L5=[L3|L3] ?
    4. Folosind o parte din urmatoarele expresii logice (teste) si operatorii logici (si ",", sau ";", not "\+"), completati definitia predicatului p(+T, -X) astfel incat la apelul p([1,2,a(1),b(2)],X) in X rezultatul sa fie [a,b]. Atentie, nu e obligatoriu sa folositi toate expresiile, si puteti folosi o expresie de mai multe ori. Numele de variabile din cadrul expresiilor logice pot fi inlocuite cu numele de variabile de care aveti nevoie (inclusiv variabila anonima, daca e cazul). In afara de numele de variabile nu mai puteti schimba nimic. A=..[B|C], A=[B], A=[B|C], A=[B|[C,D]], A is B+1, B=[A+1], A=B.
  2. Se dau faptele de mai jos, de forma vrajitoare(nume, lista_obiecte) cu sensul ca vrajitoarea cu numele din primul parametru poate transforma un omulet pe care e suparata intr-unul din obiectele din al doilea parametru. vrajitoare('Abra Cadri-Bella',[bacterie, soricel, paianjen]).
    vrajitoare('Maturici',[broasca, papuc, papagal, soricel, gandac]).
    vrajitoare('Vrajulica',[broasca, gandac, soricel, paianjen]).
    vrajitoare('Zgriptzurim',[paianjen, soricel, broasca, gandac]).
    vrajitoare('Hochi-Pochi',[iepure, 'nava cosmica', broasca]).
    vrajitoare('Baba Clontzishoara',[paianjen, bacterie, soricel]).

    Completati baza de cunostinte, folosind liste, scriind cate un fapt pentru fiecare din urmatoarele afirmatii.

    • In camera camera1 se gasesc urmatoarele obiecte/vietuitoare: broasca, iepure, broasca, broasca, bacterie. Atentie, daca exista doua obiecte de acelasi fel in camera, or sa le corespunda doua elemente in lista, nu doar unul singur.
    • In camera camera2 se gasesc: paianjen, soricel, soricel, paianjen.
    • In camera camera3 se gasesc: papuc, papagal, soricel.
    • In camera camera4 nu se gaseste nimic.

    Sa se scrie un predicat care primeste numele a doua vrajitoare si returneaza yes daca respectivele vraitoare sunt echivalente. Doua vrajitoare sunt echivalente numai daca sunt egale multimile obiectelor/vietuitoarelor in care aceastea ii pot transforma pe omuletii pe care sunt ele suparate. | ?- echivalente('Abra Cadri-Bella','Baba Clontzishoara').
    yes
    | ?- echivalente('Abra Cadri-Bella','Maturici').
    no
    | ?- echivalente('Zgriptzurim','Vrajulica').
    yes
    | ?-

    Sa se scrie un predicat care primeste un nume de camera si calculeaza ce vrajitoare ar putea fi responsabila de transformarea celor din incapere in obiectele/vietuitoarele aflate in acea camera. O vrajitoare poate fi solutie pentru acel predicat, numai daca toate obiectele din camera sunt printre cele in care ii poate transforma ea pe omuletii pe care e suparata. | ?- responsabila('Hochi-Pochi',camera1).
    no
    | ?- responsabila('Hochi-Pochi',camera4).
    yes
    | ?- responsabila('Abra Cadri-Bella',camera1).
    no
    | ?- responsabila('Abra Cadri-Bella',camera2).
    yes
    | ?-

  3. Sa se scrie un predicat de forma urmatoare nr_lit_mM(+L,-Nr1,-Nr2) unde L este o lista de cuvinte (atomi), data. Predicatul va calcula in Nr1 cate cuvinte din lista incep cu litera mare, iar in Nr2 cate cuvinte din lista incep cu litera mica. Atentie unii atomi nu incep cu litera, de exemplu '+abc', deci nu vor intra in niciuna din cele doua categorii. In cazul in care lista contine si altceva decat atomi, predicatul se termina cu esec. | ?- nr_lit_mM([abc,gugu,'+a','Ana','aha','XYZ'],N1,N2).
    N1 = 2,
    N2 = 3 ?
    yes
    | ?- nr_lit_mM([abc,1000,gugu,'+a','Ana','aha','XYZ'],N1,N2).
    no
    | ?-
  4. Se considera o lista care cuprinde diversi termeni, sa se scrie un predicat care calculeaza lista de termeni compusi de forma mijloc(atom, chr_mij), continand caracterul din mijloc al atomilor din prima lista, care au lungime impara. Daca lista nu e formata doar din atomi, predicatul esueaza. Forma predicatului va fi calc_mij(+L,-Lrez).

    Exemple:

    | ?- calc_mij([aba, wwww, gugu, cipic, a],L).
    L = [mijloc(aba,b),mijloc(cipic,p),mijloc(a,a)] ?
    yes
    | ?- calc_mij([aba, 12, wwww, gugu, cipic],L).
    no
    | ?-
  5. Sa se scrie un predicat care primeste ca parametri de intrare 2 liste si calculeaza o a treia lista: compar_nr_list(+L1,+L2-L). Listele pot contine numere, atomi sau variabile. Listele se parcurg in paralel. In cazul in care ambele liste au ajuns cu parcurgerea la cate un numar, in lista rezultat se adauga simbolul '<' in cazul in care numarul din prima lista e mai mic decat cel din a doua, '>' daca este mai mare, sau egal daca numerele sunt egale. In cazul in care o lista ajunge cu parcurgerea la ceva ce nu e numar, sare peste acel element, si nu se adauga nimic in lista rezultat (atentie, nu ambele liste sar peste elemente, ci doar lista care a ajuns la un element nenumeric, cealalta ramanand cu parcurgerea la acelasi element).

    Predicatul termina de calculat lista rezultat, cand se termina de parcurs una dintre cele doua liste.

    Exemplu:

    | ?- compar_nr_list([2,bc,ceva,-3,8,1,a],[q,4,5,aha,8,bau,0],L).
    L = [<,<,=,>] ?
    yes
    | ?- compar_nr_list([2,bc,ceva,-3,8,1,a,100,1000],[q,4,5,aha,8,bau,0],L).
    L = [<,<,=,>] ?
    yes
    | ?-
  6. Se considera o lista care are ca elemente atomi si liste de atomi. Sa se scrie un predicat care calculeaza numarul total de litere (mari si mici) din toti atomii (se vor lua in considerare atat atomii care apar ca elemente simple cat si atomii care apartin listelor. Predicatul va avea forma numar_litere(+L,-Rez).

    Daca lista data ca parametru de intrare contine si alt tip de elemente in afara de atomi si liste, predicatul va esua.

    Exemplu:

    | ?- numar_litere([a123,[bc,d,'124'],'Ab',[],[q,aBC],'##'],N).
    N = 10 ?
    yes
    | ?- numar_litere([a123,1000,[bc,d,'124'],'Ab',[],[q,aBC],'##'],N).
    no
    | ?-
  7. Sa se scrie un predicat, intre_var(+L,-Nr) care primeste o lista, L, de termeni generali, si numara cate elemente instantiate (numere, atomi, elemente compuse) se afla intre doua elemente neinstantiate (variabile). | ?- intre_var([A,B,12,C,abc,D,E,F,b,G,h,h,I,z],N).
    N = 3 ?
    yes
    | ?-

  8. Se considera urmatoarele fapte: operand1(10).
    operand1(3).
    operand1(5).
    operand1(0).
    operand2(4).
    operand2(3).
    operand2(7).
    operand2(1).
    semn(+).
    semn(-).
    rezultat(7).
    rezultat(9).
    rezultat(8).
    Sa se scrie un prediccat fara parametri, afis_oper care afiseaza pe ecran toate combinatiile de forma operator1 semn operator2 = rezultat corecte din punct de vedere matematic. De exemplu: | ?- afis_oper.
    10-3=7
    10-1=9
    3+4=7
    5+4=9
    5+3=8
    0+7=7
    yes
  9. Sa se scrie un predicat genSir(+LitMax, -L), care genereaza o lista cu toate cuvintele de 2 litere, cu proprietatea ca prima litera are codul ASCII mai mic cu o unitate decat a doua litera, iar prima litera nu trebuie sa depaseasca LitMax (dat ca parametru). Atentie, e posibil sa fie nevoie sa setati printdepth-ul la o dimensiune mai mare decat cea default, pentru a afisa lista. | ?- genNrMult(h,L).
    L = [ab,bc,cd,de,ef,fg,gh] ?
    yes
    | ?-
  10. Se da o lista de termeni compusi, de forma nr(nr1, nr2,..., nr_k), cu nr1, nr2,..., nr_k numere naturale. Intr-un termen compus de tip nr, pot fi oricate numere.

    Sa se scrie un predicat nr_mmic_cif(+Cif,+L,-Lrez),care parcurge lista si afla cate cifre mai mici (strict) decat Cif exista in total, in numerele din fiecare termen. Lista rezultat va avea ca elemente numarul total de cifre (cu proprietatea enuntata mai devreme) din parametrii fiecarui termen compus in parte, din prima lista. Predicatul va esua daca lista de intrare nu este corecta.

    | ?- nr_mmic_cif(4,[nr(10,781,3), nr(2,9), nr(100,987,155), nr(4565,47)],L).
    L = [4,1,4,0] ?
    yes
    | ?- nr_mmic_cif(4,[altceva(30,40), nr(2,9), nr(100,987,155), nr(4565,47)],L).
    no
    | ?- nr_mmic_cif(4,[nr(30.23,40), nr(2,9), nr(100,987,155), nr(4565,47)],L).
    no
    | ?-

Nr. 5

  1. Rezolvati subpunctele:
    1. Se considera urmatoarea baza de cunostinte: atom_nr_a(chiulululu).
      atom_nr_a(bubu).
      atom_nr_a(chiulescu).
      atom_nr_a(abc).
      atom_nr_a(chi).
      atom_nr_a(chiul).
      Sa se completeze interogarea compusa de mai jos, astfel incat sa aiba ca solutii toti atomii care incep cu literele c,h,i,u,l in aceasta ordine, asa cum se poate vedea in exemplu: | ?- atom_nr_a(At),....
      At = chiulululu ? ;
      At = chiulescu ? ;
      At = chiul ? ;
      no
      | ?-
    2. Precizati daca forma de scriere a listei de mai jos e valida, si daca da, dati un exemplu de lista care sa se unifice cu aceasta:
      [[P,A]|[AA|A]]
    3. Cate elemente au listele urmatoare: L1=[], L2=[L1|[L1|L1]], L3=[L2], L4=[L1,L1|[L1]], L5=[L2|L4] ?
    4. Folosind o parte din urmatoarele expresii logice (teste) si operatorii logici (si ",", sau ";", not "\+"), completati definitia predicatului p(+T, -X) astfle incat la apelul p([a,100,b,200],X) in X rezultatul sa fie [a(101),b(201)]]. Atentie, nu e obligatoriu sa folositi toate expresiile, si puteti folosi o expresie de mai multe ori. Numele de variabile din cadrul expresiilor logice pot fi inlocuite cu numele de variabile de care aveti nevoie (inclusiv variabila anonima, daca e cazul). In afara de numele de variabile nu mai puteti schimba nimic. A=..B, A=[B,C], A=[B,C|D], A=[B|[C,D]], A is B+1, A=B+1, L=[A+1].
  2. Niste studenti au de dat teste la diverse materii Mai jos aveti niste fapte care indica pentru fiecare student la ce materii are de dat test. loc_chiulire('Ion',['pe scara', 'pe acoperis', 'in parc']).
    loc_chiulire('Alina',['in parc','pe acoperis','pe hol']).
    loc_chiulire('Mihai', ['pe scara', 'intr-o sala libera', 'pe alta planeta']).
    loc_chiulire('Ana',['pe acoperis','pe hol','pe scara']).
    loc_chiulire('Dorel',['pe hol','pe scara','pe acoperis']).

    Completati baza de cunostinte, folosind liste, scriind cate un fapt pentru fiecare din urmatoarele afirmatii:

    • Ion chiuleste la TW, BD.
    • Alina chiuleste la Sisteme Expert, TW, Retele.
    • Mihai chiuleste la BD, Retele, Grafica.
    • Ana chiuleste la Grafica, Retele, TW.
    • Dorel nu chiuleste la nimic.

    Sa se scrie un predicat care primeste numele a doi studenti si returneaza yes daca au aceleasi locuri de chiulire (atentie pot fi in ordine diferita in liste). | ?- camarazi('Ana','Dorel').
    yes
    | ?- camarazi('Mihai','Dorel').
    no

    Sa se scrie un predicat care primeste un nume de materie si un loc si calculeaza studentii care chiulesc la acea materie in acel loc | ?- chiul_loc('TW','in parc', Elev).
    Elev = 'Ion' ? ;
    Elev = 'Ana' ? ;
    no
    | ?-

  3. Se da baza de cunostinte:
    numar_absente(gogu,3).
    numar_absente(bobuletz,8).
    numar_absente(anishoara,2).
    numar_absente(iliutza,5).
    numar_absente(bogdanel,7).
    numar_absente(lilishor,4).
    numar_absente(danel,3).
    numar_absente(ionel,10).
    numar_absente(dorel,14).
    Sa se scrie un predicat care calculeaza media absentelor copiilor din lista. Numarul de absente se ia din baza de cunostinte. Daca un nume nu se afla in baza de cunostinte, atunci se considera ca are 0 absente. Daca in lista nu sunt doar atomi, atunci predicatul esueaza. medie_absente(+L,-Nr) | ?- medie_absente([ionel, iliutza, gogu, andrei, anishoara, mihai, dorel],M).
    M = 4.857142857142857 ?
    yes
    | ?- medie_absente([ionel, 14, gogu, andrei, anishoara, mihai, dorel],M).
    no
  4. Se considera urmatoarele fapte:

    scor(c,10).
    scor(h,5).
    scor(i,1).
    scor(u,4).
    scor(l,3).
    Se da o lista care cuprinde diversi atomi, sa se scrie un predicat care calculeaza lista de termeni compusi de forma scor(atom, scor), continand suma scorurilor pentru fiecare caracter al cuvantului. Scorul pentru caractere e luat din baza de cunostinte. Pentru carcaterele netrecute in baza de cunostinte, scorul se considera 0. Daca lista nu e formata doar din atomi, predicatul esueaza. Forma predicatului va fi calc_scor(+L,-Lrez).

    Exemple:

    | ?- calc_scor([hic, hh, papuc, b, xyz],L).
    L = [scor(hic,16), scor(hh,10),scor(papuc,14),scor(b,0), scor(xyz,0)] ?
    yes
    | ?- calc_scor([hic, 7, hh, papuc, b],L).
    no
    | ?-
  5. Se dau faptele :

    nume_complet(ion,chiulescu).
    nume_complet(dan,absenteanu).
    nume_complet(tache,restantache).
    nume_complet(matei,absentovici).
    nume_complet(tania,neprezenteanu).
    Sa se scrie un predicat care primeste ca parametri de intrare 2 liste si calculeaza o a treia lista: nume_prenume(+L1,+L2,-L). Listele pot contine numere, atomi sau variabile. Listele se parcurg in paralel. In cazul in care in prima lista s-a ajuns cu parcurgerea la un atom-prenume si in cealalta la un atom-nume, in lista rezultat se adauga atomul format din prenume, concatenat cu spatiu, concatenat cu nume (de exemplu daca in prima lista s-a gasit ion si in a doua chiulescu, atunci se adauga in lista rezultat 'ion chiulescu'). In cazul in care prima lista ajunge cu parcurgerea la ceva ce nu e prenume, sau a 2-a ajunge la ceva ce nu e nume, se sare peste acel element, si nu se adauga nimic in lista rezultat (atentie, nu ambele liste sar peste elemente, ci numai prima lista atunci cand a ajuns la ceva ce nu e prenume, sau a doua daca a ajuns la un element care nu este nume, cealalta lista ramanand cu parcurgerea la acelasi element). Predicatul termina de calculat lista rezultat, cand se termina de parcurs una dintre cele doua liste.

    | ?- nume_prenume([2,bubu,1,3,4,0,a,2],[qw,ceva,lu,103,zu,ha,tu],L).
    L = ['dan absenteanu','tania neprezenteanu','ion chiulescu'] ?
    yes
    | ?-
  6. Se considera o lista care are ca elemente litere si liste de litere. Sa se scrie un predicat care primeste un atom (notat Cuv) si o astfel de lista si calculeaza, parcurgand lista, un numar Nr in felul urmator:

    • pentru fiecare element-litera al listei se incrementeaza Nr cu 1, daca litera apartine cuvantului Cuv
    • pentru fiecare lista in care toate litere apartin cuvantului Cuv se incrementeaza Nr cu 1. Daca exista macar o litera in elemtul lista care sa nu apartina cuvantului, Nr ramane neschimbat pentru acel element.
    Predicatul va avea forma cauta_nr_litera(+Cuv,+L,-Rez).

    Daca lista data ca parametru de intrare contine si alt tip de elemente in afara de litere si liste de litere, predicatul va esua.

    Exemplu:

    | ?- cauta_nr_litera(chiul, [a,b,c,[b,c,z],h,[c,i,h,l],l,[],c],X).
    X = 5 ?
    yes
    | ?- cauta_nr_litera(chiul, [bau,b,c,[b,d,z],h,[c,i,h,l],l,[],c],X).
    | ?- cauta_nr_litera(chiul, [a,200,c,[b,d,z],h,[c,i,h,l],l,[],c],X).
    no
    | ?-
  7. Se dau faptele:

    numar_absente(gogu,mate,3).
    numar_absente(gogu,info,4).
    numar_absente(bobuletz,italiana,8).
    numar_absente(anishoara,engleza,2).
    numar_absente(iliutza,sport,5).
    numar_absente(bogdanel, engleza,7).
    numar_absente(bogdanel, sport,5).
    numar_absente(lilishor,mate,4).
    numar_absente(lilishor,info, 14).
    numar_absente(danel,franceza, 3).
    numar_absente(ionel, mate,7).
    numar_absente(ionel,engleza,14).
    numar_absente(dorel, info,14).
    Sa se scrie un predicat verif_absente_list(+L) care primeste o lista de copii si verifica faptul ca fiecare doi copii vecini in lista au acelasi numar(nenul) de absente la minim o materie existenta. | ?- verif_absente_list([gogu, lilishor, dorel, ionel, bogdanel, iliutza]).
    yes
    | ?- verif_absente_list([gogu, bobuletz, dorel, ionel, bogdanel, iliutza]).
    no
    | ?-
  8. Se considera faptele: nume('Ion').
    nume('Bob').
    nume('Gogu').
    nume('Andu').
    nume('Dorel').
    nume('Oana').

    test('Sist Exp').
    test('Retele').

    %nr_absente(nume,materie,nr)
    nr_absente('Ion','TWeb',5).
    nr_absente('Ion','Sist Exp',1).
    nr_absente('Bob','Sist Exp',3).
    nr_absente('Bob','Retele',9).
    nr_absente('Bob','TWeb',7).
    nr_absente('Gogu','Sist Exp',2).
    nr_absente('Gogu','Retele',5).
    nr_absente('Gogu','TWeb',1).
    nr_absente('Andu','TWeb',7).
    nr_absente('Andu','Retele',2).
    nr_absente('Dorel','Sist Exp',8).
    nr_absente('Dorel','Retele',6).
    Sa se scrie un predicat cu un parametru, cine_chiuleste(+Materie), care afiseaza pentru toti copiii (definiti cu ajutorul predicatului nume) daca vor chiuli sau nu la acea materie, asa cum se vede in exemplul de mai jos. Copiii chiulesc doar daca:
    • fie la acea materie se da test (vezi predicatul test) si au si absente la acea materie (predicatul nr_absente arata absentele doar in cazul in care numarul lor e diferit de 0; daca un copil nu are absente la o materie, pur si simplu nu a fost scris un fapt de tip nr_absente care sa asocieze numele lui cu numarul de absente
    • fie au mai mult de 5 absente
    Exemplu: | ?- cine_chiuleste('TWeb').
    Ion nu chiuleste la TWeb
    Bob chiuleste la TWeb
    Gogu nu chiuleste la TWeb
    Andu chiuleste la TWeb
    Dorel nu chiuleste la TWeb
    Oana nu chiuleste la TWeb
    yes
    | ?- cine_chiuleste('Retele').
    Ion nu chiuleste la Retele
    Bob chiuleste la Retele
    Gogu chiuleste la Retele
    Andu chiuleste la Retele
    Dorel chiuleste la Retele
    Oana nu chiuleste la Retele
    yes
    | ?-
  9. Sa se scrie un predicat (recursiv) care genereaza o lista cu toate subsirurile unui atom, in ordinea crescatoare a lungimii, care pornesc de la inceputul cuvantului . Atentie, e posibil nevoie sa setati printdepth-ul la o dimensiune mai mare decat cea default. | ?- genSubs(chiulit, L).
    L = [c, ch, chi, chiu, chiul, chiuli, chiulit] ?
    yes
    | ?-