% (1) % Este funciona tambem para numeros inteiros % negativos, e falha ao ser resatisfeito quadrado(N,S) :- N >= 0, soma_impares(N,S). quadrado(N,S) :- N =< 0, M is - N, soma_impares(M,S). soma_impares(0,0) :- !. soma_impares(N,S) :- N1 is N - 1, soma_impares(N1,S1), S is S1 + 2*N -1. % (2) last_([X],X). last_([_|T],L) :- last_(T,L). % (3) butlast([_],[]). butlast([H|T],[H|R]) :- butlast(T,R). % (4) append_([],L,L). append_([H|T],L,[H|R]) :- append_(T,L,R). % (5) reverse_(L,R) :- revacc_(L,[],R). revacc_([],L,L). revacc_([H|T],L,R) :- revacc_(T,[H|L],R). % (6) member_(A,[A|_]). member_(A,[_|T]) :- member_(A,T). % (7) acres(A,[],[A]). acres(A,[A|T],[A|T]) :- !. acres(A,[H|T],[H|R]) :- acres(A,T,R). % (8) uniao([],A,A). uniao([H|T],A,U) :- uniao(T,A,X), acres(H,X,U). % (9) inter([],_,[]). inter([H|T],A,[H|I]) :- select(H,A,R), !, inter(T,R,I). inter([_|T],A,I) :- inter(T,A,I). % (10) set_difference([],_,[]). set_difference([H|T],S,R) :- member(H,S), !, set_difference(T,S,R). set_difference([H|T],S,[H|R]) :- set_difference(T,S,R).