1. Sa se scrie scrie un predicat predicat care intoarce intoarce lungimea unei liste de simboluri. domains list=symbol* predicates lungime(list,integer) clauses lungime([],0). lungime([_|],!oada)"#lungime( lungime([_|] ,!oada)"#lungime(,$),!oada ,$),!oada=$%1. =$%1. &. Sa se scrie scrie un predicat predicat care intoarce intoarce suma elementelor elementelor dintr#o dintr#o lista. domains lista=integer* predicates suma(lista,integer) clauses suma([],0). suma(['|],S)"#suma(,S),S='%S . . Sa se scrie un predicat care care determina determina toate aparitiile unui element intr#o lista. domains element=integer lista=element* predicates nraparitie(element,lista,integer) clauses nraparitie(_,[],0)"#. nraparitie(,[|],+)"#, nraparitie(,[ |],+)"#, nraparitie(, nraparitie(,,+p),+=+ ,+p),+=+p%1. p%1. nraparitie(,[_|],+)"# nraparitie(,,+). . Sa se scrie scrie un predicat predicat care pune cap la cap cap doua liste.
domains element=integer lista=element* predicates unire(lista,lista,lista) clauses unire([],-ista,-ista). unire(['|],-ista&,['|e/ultat]) unire(['| ],-ista&,['|e/ultat])"#unire(, "#unire(,-ista&,e/ultat). -ista&,e/ultat).
. Sa se scrie un predicat care testea/a daca o lista este multime.
domains element=integer lista=element* predicates lungime(lista,element) set(lista,lista) multime(lista) membru(element,lista) clauses lungime([],0). lungime([_|],-)"#lungime(,&),-=&%1. membru(,[|_]). membru(,[_|])"#membru(,). set([],[]). set(['|],['|ut])"#not(membru(',)),set(,ut). set(['|],ut)"#membru(',),set(,ut). multime(-ista)"#set(-ista,-1),lungime(-ista,-ung1),lungime(-1,-ung1). 2. Sa se scrie un predicat care trans3orma o lista intr#o multime. domains element=integer lista=element* predicates lungime(lista,element) set(lista,lista) membru(element,lista) clauses lungime([],0). lungime([_|],-)"#lungime(,&),-=&%1. membru(,[|_]). membru(,[_|])"#membru(,). set([],[]). set(['|],['|ut])"#not(membru(',)),set(,ut). set(['|],ut)"#membru(',),set(,ut). 4. Sa se scrie un predicat care intoarce reuniunea a doua multimi. domains element=integer lista=element* predicates unire(lista,lista,lista) membru(element,lista) clauses membru(,[|_]). membru(,[_|])"#membru(,). unire([],$,$). unire([$|],5,6)"#membru($,5),,unire(,5,6). unire([$|],5,[$|6])"#unire(,5,6).
7. Sa se scrie un predicat care intoarce intersectia a doua multimi. domains element=integer lista=element* predicates intersectie(lista,lista,lista) membru(element,lista) clauses membru(,[|_]). membru(,[_|])"#membru(,). intersectie([],_,[]). intersectie([$|],5,[$|6])"#membru($,5),,intersectie(,5,6). intersectie([_|],5,6)"#intersectie(,5,6). 8. Sa se scrie un predicat care intoarce di3erenta a doua multimi. domains element=integer lista=element* predicates membru(element,lista) di3(lista,lista,lista) clauses membru(,[|_]). membru(,[_|])"# membru(,). di3([],_,[])"#. di3(['|],9,!)"#membru(',9),,di3(,9,!). di3(['|],9,['|&])"#di3(,9,&).
10. Sa se scrie un predicat care testea/a egalitatea a doua multimi, 3ara sa se 3aca apel la di3erenta a doua multimi. domains element=integer lista=element* predicates membru(element,lista) egalitate(lista,lista) clauses membru(,[|_]). membru(,[_|])"#membru(,). egalitate(['|],['&|&])"#'='&:membru(',&),egalitate(,&). 11. Sa se scrie un predicat care sterge toate aparitiile unui atom dintr#o lista.
domains element=integer lista=element* predicates sterge(element,lista,lista) clauses
sterge(_,[],[]). sterge(+tom,[+tom|],r)"#sterge(+tom,,r). sterge(+tom,['|],['|&])"#not('=+tom), sterge(+tom,,&). 1&. Sa se scrie un predicat care se ;a satis3ace daca o lista are numar par de elemente si ;a esua in ca/ contrar, 3ara sa se numere elementele listei.
domains element=integer lista=element* predicates nrpar_elem(lista) clauses nrpar_elem([_,_]). nrpar_elem([_,_|est])"#nrpar_elem(est).
1. Sa se scrie un predicat care substituie intr#o lista un element prin altul. domains element=integer lista=element* predicates inlocuire(element,element,lista,lista) clauses inlocuire(_,_,[],[]). inlocuire(+tom,lement,[+tom|1],[lement|&])"#inlocuire(+tom,lement,1,&). inlocuire(+tom,lement,['|1],['|&])"#not('=+tom), inlocuire(+tom,lement,1,&).
1.
domains element=integer lista=element* predicates in;ersea/a(lista,lista) adauga(lista,lista,lista) clauses adauga([],,). adauga(['|],,['|$])"#adauga(,,$). in;ersea/a([$],[$]). in;ersea/a(['|],)"#in;ersea/a(,$),adauga($,['],).
1. Sa se intercale/e un element pe po/itia a n#a a unei liste. domains list=integer* predicates insereaza(list,integer,integer,list)/* lucru(list, integer, integer, list) clauses insereaza(L, Poz, Elem, Lrez):lucru(L, Poz, Elem, Lrez). lucru([], 0, Elem, [Elem]):-!. lucru(L, Poz, Elem, Lrez):Poz = 0, Lrez = [Elem|L]. lucru([H|T], Poz, Elem, Lrez):N = Poz-1, lucru(T, N, Elem, Lnou), Lrez = [H|Lnou],!.
integer1-pozitia*/
12. Sa se elimine elementul de pe po/itia a n#a a unei liste liniare.
domains element=integer lista=element* predicates sterge(element,lista,element,lista) clauses sterge($,[$|1],1,1). sterge($,['|1],,['|&])"#>1,1=#1,sterge($,1,1,&).
14.
clauses sterge(_,[],[]). sterge(E,[H|T],[H|T1])!H"#E,$,sterge(E,T,T1). sterge(E,[_|T],T1)!sterge(E,T,T1). nr_apar(_,[],%). nr_apar(E,[E|H],&)!nr_apar(E,H,&1),&=&1'1,$. nr_apar(E,[_|H],&)!nr_apar(E,H,&). get_perechi([],[]). get_perechi([E],[[E,1]]). get_perechi([H|T],[[H,&]|])!nr_apar(H,[H|T],&), sterge(H,[H|T],), get_perechi(, ).
17.
1,1=#1,select($,1,1).
18. Defniti predicatele de egalitate si mai mic pentru numere scrise in reprezentate pe
liste. Domains el=integer lista=el* predicates lung(lista,el) compara(lista,lista,integer) tip(lista,lista) clauses lung([],0). lung([_|T],)!"lung(T,rez),=rez#$. compara([],[],0). compara($,%,rez)!"lung($,&),lung(%,'),&',,rez=$. compara([$|_],[%|_],rez)!" $%,,rez=$. compara([$|T$],[%|T%],rez)!"$=%,compara(T$,T%,rez). tip($,%)!"compara($,%,$),rite(+rimul sir este mai mare.+),nl. tip($,%)!"compara($,%,0),rite(+-gale+),nl. tip($,%)!"compara($,%,"$),rite(+l doilea sir este mai mare.+),nl. %0.Defniti un predicat care intoarce cel mai mare di/izor comun al numerelor dintr"o lista. Domains list=integer* predicates cmmdc(integer,integer,integer)/* cmmdc(a,b,rez)*/ cmmdcList(list,integer) clauses
cmmdc(A, B, Rez):- A = B, Rez = B,! cmmdc(A, B, Rez):- B"A, # = B-A, cmmdc(#, A, Rez)! cmmdc(A, B, Rez):- A"B, # = A-B, cmmdc(#, B, Rez)! cmmdcList($%&,%):-! cmmdcList($%'$%&&,Rezult):- cmmdc(%',%,Rez), cmmdcList($Rez &,Rezult)!
%$. Defniti un predicat care determina predecesorul unui numar reprezentat cira cu cira intr"o lista. De e1! [$ 2 3 4 0 0] ""5 [$ 2 3 6 2 2]. domains el = integer list = el* predicates adaug7(el,list,list) 8(i,i,o) in/ers(list,list) 8(i,o) sum(list,integer,list) 8(i,i,o) predecesor(list,list) 8(i,o) tipar(list) clauses adaug7(-,[],[-]). adaug7(-,[|T],[|])!"adaug7(-,T,). in/ers([],[]). in/ers([|T],)!"in/ers(T,$), adaug7(,$,). predecesor(,7)!" in/ers(,9), sum(9,"$,), in/ers(,7), rite(+=+), tipar(7), rite(+]+). sum([],Tr,[])!". sum([|T],Tr,[7|$])!"=0, 7=2, Tr$="$, sum(T,Tr$,$). sum([|T],Tr,[7|$])!":50, 7=#Tr, Tr$=0, sum(T,Tr$,$). tipar([]). tipar([|T])!" rite(), rite(+,+), tipar(T).
%%. Defniti un predicat care determina succesorul unui numar reprezentat cira cu cira intr"o lista. De e1! [$ 2 3 6 2 2] ""5 [$ 2 3 4 0 0]
domains el = integer list = el* predicates adaug7(el,list,list) 8(i,i,o) in/ers(list,list) 8(i,o) sum(list,integer,list) 8(i,i,o) succesor(list,list) 8(i,o) tipar(list) clauses adaug7(-,[],[-]). adaug7(-,[|T],[|])!"adaug7(-,T,). in/ers([],[]). in/ers([|T],)!"in/ers(T,$), adaug7(,$,). succesor(,7)!" in/ers(,9), sum(9,$,), in/ers(,7), rite(+=+), tipar(7), rite(+]+). sum([],Tr,[Tr])!"Tr:50,. sum([],Tr,[])!". sum([|T],Tr,[7|$])!" 7$=#Tr, 7=7$ mod $0, Tr$=7$ di/ $0, sum(T,Tr$,$). tipar([]). tipar([|T])!"rite(), rite(+,+), tipar(T).
";, cmmdc(<, ;, ez). cmmdcist([],)!". cmmdcist([$|[%|T]],ezult)!" cmmdc($,%,ez), cmmdcist([ez|T],ezult).
%3. 7a se scrie o unctie care descompune o lista de numere intr"o lista de orma [ lista" de"numere"pare lista"de"numere"impare] (deci lista cu doua elemente care sunt liste de intregi), si /a intoarce si numarul elementelor pare si impare.
Domains list=integer* list%=list* predicates separ(list,list%) clauses separ([],[[],[]]). separ([|T],[[|&],']) !" mod % = 0, , separ(T,[&,']). separ([|T],[&,[|']]) !" separ(T, [&,']).
%>. 7a se scrie un predicat care, primind o lista, intoarce multimea tuturor perec?ilor din lista. De e1, cu [a @ c d] /a produce [[a @] [a c] [a d] [@ c] [@ d] [c d]].
Domains lista=integer* listad=lista* predicates perec?e(integer,lista,listad) mem@er(integer,lista) gasesc(lista,listad) princ(lista,listad) concat$(listad,listad,listad) clauses 8gasesc([],)!". 8 gasesc([$|$],[[$|$]|_])!" . 8 gasesc([$|$],[_|])!"gasesc([$|$],). gasesc([$,%],[[$,%]|_])!". gasesc([$,%],[[%,$]|_])!". gasesc([$,%],[_|])!"gasesc([$,%],). mem@er(-,[-|_])!". mem@er(-,[_|T])!"mem@er(-,T). ), princ(,3), concat$(>,3,%).
%6. Defniti un predicat care, dintr"o lista de atomi, produce o lista de perec?i (atom n), unde atom apare in lista initiala de n ori. De e1! numar([ ; ; < ], &) /a produce & = [[ >] [; %] [< $]].
Domains lista=integer* perec?i=lista* predicates sterge(integer,lista,lista) nr_apar(integer,lista,integer) get_perec?i(lista,perec?i) clauses sterge(_,[],[]). sterge(-,[|T],[|T$])!":5-,,sterge(-,T,T$). sterge(-,[_|T],T$)!"sterge(-,T,T$). nr_apar(_,[],0). nr_apar(-,[-|],B)!"nr_apar(-,,B$),B=B$#$,. nr_apar(-,[_|],B)!"nr_apar(-,,B). get_perec?i([],[]). get_perec?i([-],[[-,$]]). get_perec?i([|T],[[,B]|])!"nr_apar(,[|T],B), sterge(,[|T],), get_perec?i(,).
&2. e3 initi pr edicatele de egalitate si rnai rnic pentru nurner e scrise in r e pre/entate pe liste.
domains el=integer lista=el* predicates lung(lista,el) compara(lista,lista,integer) tip(lista,lista) clauses lung([],0). lung([_|],-)"#lung(,re/),-=re/%1. compara([],[],0). compara(-1,-&,re/)"#lung(-1,$),lung(-&,5),$A5,,re/=#1. compara(-1,-&,re/)"#lung(-1,$),lung(-&,5),$>5,,re/=1. compara(['1|_],['&|_],re/)"#'1A'&,,re/=#1. compara(['1|_],['&|_],re/)"#'1>'&,,re/=1. compara(['1|1],['&|&],re/)"#'1='&,compara(1,&,re/).
&4.
ist = el* predicates lengt?(list,integer) /ero(integer,list,list) ma@im(integer,integer,integer) adun(list,list,list,integer) suma(list,list,list) clauses lengt?([],0)"#. lengt?(['|],)"#lengt?(,1), =1%1. ma@im(+,9,+)"#+>=9,. ma@im(+,9,9)"#9>+,. /ero(0,$,$)"#. /ero(,$,[0|$1])"#1=#1, /ero(1,$,$1). adun([],[],[],0)"#. adun([+|-1],[9|-&],[!i3ra|-],r)"# adun(-1,-&,-,r&), !i3ra=(+%9%r&)mod 10, r=(+%9%r&)di; 10. suma(+,9,e/)" # lengt?(+,-+), lengt?(9,-9), ma@im(-+,-9,-Ba@), !1=-Ba@#-+, !&=-Ba@#-9, /ero(!1,+,++), /ero(!&,9,99), adun(++,99,e/,0).
&7.
domains list=integer* predicates cmmdc(integer,integer,integer cmmdc-ist(list,integer) clauses cmmdc(+, 9, e/)"+ = 9, e/ = 9,. cmmdc(+, 9, e/)"9>+, ! = 9#+, cmmdc(!, +, e/). cmmdc(+, 9, e/)"+>9, ! = +#9, cmmdc(!, 9, e/). cmmdc-ist(['],')"#. cmmdc-ist(['1|['&|]],e/ult)"cmmdc('1,'&,e/), cmmdc-ist([e/|],e/ult).