Inteligenta Artificiala

Nu esti logat.

Munca individuala laborator 3 - Liste

Punctaj: 200p

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
    | ?-