membro( X , [ X | _ ] ). membro( X , [ _ | Ys ] ) :- membro( X, Ys ). % implementar concat/3 tal que ?- concat( [a,b],[c,d], Xs) dá como resposta % Xs = [a,b,c,d]. concat( [], Ys, Ys ). concat( [X|Xs], Ys, [X|Zs] ) :- concat( Xs, Ys, Zs ). % prefixo( As, Bs) : a lista As é um prefixo da lista Bs prefixo( [], _ ). % A lista vazia é prefixo de qqer lista prefixo( [X|Xs], [X|Ys] ) :- prefixo( Xs, Ys ) . pref( Xs, Ys ) :- concat( Xs, _, Ys). sufixo( Xs, Xs ). sufixo( Xs, [_|Ys] ) :- sufixo( Xs, Ys ). % exercício: fazer sufixo usando append/3 ou concat/3 % sublista( Xs, Ys): Xs é obtido de Ys "jogando fora" um prefixo e um sufixo de sublista1( Xs, Ys ) :- prefixo( Zs, Ys ), sufixo( Xs, Zs ). sublista2( Xs, Ys ) :- sufixo( Zs, Ys ), prefixo( Xs, Zs ). % fazer sublista utilizando append/3 ou concat/3 inverte1( [], [] ). inverte1( [X|Xs], Ys ) :- append( Y1s, [X], Ys ), inverte( Xs, Y1s ). inverte( Xs, Ys ) :- inverte( Xs, [], Ys ). inverte( [], Auxs, Auxs ). inverte( [X|Xs], Auxs, Ys ) :- inverte( Xs, [X|Auxs], Ys ). %?- inverte([a,b,c], Ys). %?- inverte([a,b,c], [], Ys). %?- inverte([b,c], [a], Ys). %?- inverte([c], [b,a], Ys). %?- inverte([], [c,b,a], Ys). Ys = [c,b,a] % tamanho( Xs, N) : N é o tamanho da lista tamanho( [], 0 ). tamanho( [ _ | Xs ], N ) :- tamanho( Xs, M ), N is M+1. contem_inteiro( [ X | _ ] ) :- integer( X ). contem_inteiro( [ _ | Xs ] ) :- contem_inteiro( Xs ). % Exercícios: % 1- lista_de_inteiros( Xs ), sucede para Xs = [1,2,3], falha para Xs=[a,2,3], [X,2,3], [], Ys % 2- lista_de_vogais( Xs ). % 3- n_elemento(N, Xs, X): X é o n-ésimo elemento de Xs "(Xs[N] = X)" % 4- fatorial( N, F ) : F = N!