You are on page 1of 3

%numere simetrice pana la N

nrSimetrice(0):-write(0),tab(2).
nrSimetrice(N):-simetric(N),N1 is N-1,nrSimetrice(N1),write(N),tab(2).
nrSimetrice(N):-N1 is N-1, nrSimetrice(N1).
%verificare simetrie
simetric(N):-imparte(N,L1),invers(L1,L2), L1=L2.
%impartirea unui numar in elementele unei liste(in ordine inversa)
imparte(0,[]):-!.
imparte(N,[N2|L]):-N1 is floor(N/10), N2 is N mod 10, imparte(N1,L).
%inversarea unei liste
invers(L, Linv):- inv(L, [], Linv).
inv([], L, L).
inv([X|Rest], Temp, L) :- inv(Rest, [X|Temp], L).

?-nrSimetrice(20).
0 1 2 3 4 5 6 7 8 9 11

%reuniunea a doua multimi


reuniune([],L,L).
reuniune([X|R1],L2,[X|R3]):-not(member(X,L2)),reuniune(R1,L2,R3).
reuniune([_X|R1],L2,L3):-reuniune(R1,L2,L3).

?-reuniune([1,2,3],[3,4,5],Reuniune).
Reuniune=[1,2,3,4,5].

%intersectia a doua multimi


intersectie([],_,[]).
intersectie([X|R1],L2,[X|R3]):-member(X,L2),intersectie(R1,L2,R3).
intersectie([_X|R1],L2,L3):-intersectie(R1,L2,L3).

?-intersectie([1,2,3],[3,4,5],Intersectie).
Intersectie=[3].

%diferenta a doua multimi


diferenta([],_,[]).
diferenta([X|R1],L2,[X|R3]):-not(member(X,L2)),diferenta(R1,L2,R3).
diferenta([_X|R1],L2,L3):-diferenta(R1,L2,L3).

?-diferenta([1,2,3],[3,4,5],Diferenta).
Diferenta=[1,2]

%Este o lista ordonata crescator?


ordonata([]).
ordonata([_]).
ordonata([X,Y|Rest]):-X=<Y, ordonata([Y|Rest]).

?-ordonata([1,7,9]).
True
?-ordonata([1,8,4]).
False
-

%Are o lista elemente consecutive?


consec([]).
consec([_]).
consec([X,Y|Rest]):-Y1 is Y-1, X=Y1, consec([Y|Rest]).

?-consec([1,2,3]).
True
?-consec([1,7,9]).
False

%stergerea unui element aflat pe pozitia i


stergPozI([_X|Rest],1,Rest).
stergPozI([X|Rest],I,[X|Rest1]):-I1 is I-1, stergPozI(Rest,I1,Rest1).

?-stergPozI([1,2,3,4,5],2,L).
L=[1,3,4,5].

%stergerea unui element aflat inaintea unui element


stergInainteElement([],_,[]).
stergInainteElement([X],_,[X]).
stergInainteElement([X|R1],X,[X|R1]).
stergInainteElement([_X,Y|R1],Y,[Y|R1]).
stergInainteElement([X,Y|R1],Z,[X|R2]):-stergInainteElement([Y|R1],Z,R2).

?-stergInainteElement([1,2,3],2,L).
L=[2,3]
?-stergInainteElement([1,2,3],1,L).
L=[1,2,3]

%stergerea unui element aflat dupa un element


stergDupaElement([],_,[]).
stergDupaElement([X],_,[X]).
stergDupaElement([X,_Y|R1],X,[X|R1]).
stergDupaElement([X,Y|R1],Z,[X|R2]):-stergDupaElement([Y|R1],Z,R2).

?-stergDupaElement([1,2,3],2,L).
L=[1,2]
?-stergDupaElement([1,2,3],3,L).
L=[1,2,3]

%adaugarea unui element dupa pozitia i


adaugaDupaPozI([P|Rest],X,1,[P,X|Rest]).
adaugaDupaPozI([P|Rest],X,I,[P|Rest1]):-I1 is I-1, adaugaDupaPozI(Rest,X,I1,Rest1).

?-adaugaDupaPozI([1,2,3,4],7,3,L).
L=[1,2,3,7,4]

-
%adaugarea unui element pe pozitia i
adaugaPePozI([P|Rest],X,1,[X,P|Rest]).
adaugaPePozI([P|Rest],X,I,[P|Rest1]):-I1 is I-1, adaugaPePozI(Rest,X,I1,Rest1).

?-adaugaPePozI([1,2,3,4],7,3,L).
L=[1,2,7,3,4]

%adaugarea unui element dupa elementul X


adaugaDupaElement([X],X,Y,[X,Y]).
adaugaDupaElement([X|R1],X,Y,[X,Y|R1]).
adaugaDupaElement([X,Y|R1],Z,W,[X|R2]):-adaugaDupaElement([Y|R1],Z,W,R2).

?-adaugaDupaElement([1,2,3,4],3,7,L).
L=[1,2,3,7,4]

%adaugarea unui element inaintea elementului X


adaugaInainteElement([X],X,Y,[Y,X]).
adaugaInainteElement([X|R1],X,Y,[Y,X|R1]).
adaugaInainteElement([X,Y|R1],Z,W,[X|R2]):-adaugaInainteElement([Y|R1],Z,W,R2).

?-adaugaInainteElement([1,2,3,4],3,7,L).
L=[1,2,7,3,4]

You might also like