Você está na página 1de 5

%ex.1**************************************************************** % Represente em Prolog a informao sobre as pessoas representadas na % rvore genealgica esposa(maria,pedro). esposa(gertrudes, paulo). esposa(paula, joo). esposa(josefina,carlos).

marido(X,Y):-esposa(Y,X). progenitor(maria, joo). progenitor(maria, ana). progenitor(maria, manuel). progenitor(maria, josefina). progenitor(pedro,joo). progenitor(pedro, ana). progenitor(pedro, manuel). progenitor(pedro, josefina). progenitor(gertrudes, carlos). progenitor(paulo, carlos). progenitor(paula, bruno). progenitor(joo, bruno). progenitor(josefina, jos). progenitor(josefina, carlota). progenitor(carlos, jos). progenitor(carlos, carlota). sexo(pedro ,masculino). sexo(paulo ,masculino). sexo(joo ,masculino). sexo(manuel ,masculino). sexo(carlos ,masculino). sexo(bruno ,masculino). sexo(jos ,masculino). sexo(maria ,feminino). sexo(gertrudes ,feminino). sexo(paula ,feminino). sexo(ana ,feminino). sexo(josefina ,feminino). sexo(carlota ,feminino). %ex.2**************************************************************** % Utilize a representao definida no exerccio anterior para definir % predicados que permitam caracterizar as seguintes relaes: av(A,B):-progenitor(A,C), progenitor(C,B), sexo(A,feminino). av(A,B):-progenitor(A,C), progenitor(C,B), sexo(A,masculino). tio(A,B):-irmo(A,C), progenitor(C,B). tia(A,B):-irm(A,C), progenitor(C,B).

irmo(A,B):-sexo(A,masculino), progenitor(C,A), progenitor(C,B), A\==B. irm(A,B):-sexo(A, feminino), progenitor(C,A), progenitor(C,B), A\==B. primo(A,B):-progenitor(C,A), tio(C,B). primo(A,B):-progenitor(C,B), tio(C,A). antepassado(A,B):-progenitor(A,B). antepassado(A,B):-progenitor(C,B), antepassado(A,C).

%ex.3**************************************************************** % Defina interrogaes(e predicados auxiliares) que permitam responder % s seguintes questes: %3.a %Quem so os progenitores de

Jos?

q3a(L):-findall(X,progenitor(X,jos),L). %3.b %O joo tem cunhados? conjuge(X,Y):-esposa(X,Y). conjuge(X,Y):-marido(X,Y). cunhado(A,B):-conjuge(A,C), irmo(B,C). cunhado(A,B):-conjuge(A,C), irm(B,C). cunhado(A,B):-irmo(A,C), conjuge(C,B). cunhado(A,B):-irm(A,C), conjuge(C,B). q3b(L):- findall(X, cunhado(joo,X),LR),list_to_set(LR,L). %3.c %Quantos filhos tem Pedro? q3c(N):-findall(X,progenitor(pedro,X),L),length(L,N). %ex.4**************************************************************** % Imagine que se pretende associar a cada pessoa a informao sobre a

%sua data e cidade de nascimento. %4.a %Estenda a representao anterior de modo a incluir tambm estas %informaes. cidade(pedro ,lisboa). cidade(paulo ,almada). cidade(joo ,lisboa). cidade(manuel ,porto). cidade(carlos ,almada). cidade(bruno ,lisboa). cidade(jos ,porto). cidade(maria ,lisboa). cidade(gertrudes ,almada). cidade(paula ,almada). cidade(ana ,lisboa). cidade(josefina ,porto). cidade(carlota ,lisboa). data_nasc(pedro ,data(4,8,1960)). data_nasc(paulo ,data(6,12,1945)). data_nasc(joo ,data(7,9,1990)). data_nasc(manuel ,data(23,1,1995)). data_nasc(carlos ,data(31,4,1990)). data_nasc(bruno ,data(24,7,2010)). data_nasc(jos ,data(3,11,2008)). data_nasc(maria ,data(7,12,1963)). data_nasc(gertrudes ,data(2,1,1956)). data_nasc(paula ,data(20,7,1989)). data_nasc(ana ,data(9,2,1999)). data_nasc(josefina ,data(28,10,1992)). data_nasc(carlota ,data(1,6,2013)). %4.b %Defina interrogaes(e predicados auxiliares) que permitam obter: %4.b.a %Quantas pessoas nasceram numa determinada cidade. q4a(C,L):-findall(X,cidade(X,C),L). %4.b.b % Quantos dos filhos de uma dada pessoa podem votar. q4b(Y,N):-findall(X,(progenitor(Y,X),data_nasc(X,data(_,_,A)),A<1995),L),length( L,N). %4.b.c %Quantos dos descendentes nasceram numa determinada cidade. q4c(P,C,L):-findall(X,(antepassado(P,X), cidade(X,C)),L).

%ex.5**************************************************************** %Traduza em Prolog as seguintes afirmaes: %5.a %Quem tem uma criana feliz feliz(L):- findall(X,progenitor(X,_),LR),list_to_set(LR,L).

%5.b % Para todo o X, se X tem uma criana que tem uma irm~, ento X tem duas % crianas. tem_irmo(X):-irmo(X,_). tem_irmo(X):-irm(X,_). tem_duas_crianas(L):- findall(X,(progenitor(X,Y), tem_irmo(Y)),LR),list_to_set(LR, L).

%ex.6**************************************************************** %Construa um programa Prolog que: %6.a %Verifica se uma lista vazia. lista_vazia([]). %6.b %Verifica se uma lista no vazia lista_nao_vazia(X):-not(lista_vazia(X)). %6.c %Verifica se uma lista unitria. lista_unitaria([_|Y]):- lista_vazia(Y). %6.d %Verifica se uma lista tem dois ou mais elementos. polilista(X):-lista_nao_vazia(X),not(lista_unitaria(X)). %6.e %Permite obter o primeiro elemento de uma lista. primeiro(X,[X|_]). %6.f %Permite obter o segundo elemento de uma lista. segundo(Y,[_|[Y|_]]). %6.g %Permite obter a lista sem o primeiro elemento (resto da lista). resto_lista(X,[_|X]).

%ex.7**************************************************************** %Construa um programa Prolog que: %7.a %Devolva o ltimo elemento de uma lista. ultimo(X,[X|[]]). ultimo(X,[_|R]):-ultimo(X,R). %7.b %Verifique se um elemento pertence a uma lista. pertence(X, [X|_]). pertence(X,[_|R]):-pertence(X,R). %7.c %Apague um dado elemento de uma lista, caso exista, seno devolve a lista intacta.

apaga(_,[],[]). apaga(X,[X|R],R). apaga(X,[Y|R],[Y|C]):- X\==Y, apaga(X,R,C). %7.d %Conte o nmero de elementos de uma lista. numero_elementos(0,[]). numero_elementos(N,[_|R]):- numero_elementos(N1,R), N is 1 + N1. %7.e %Devolva um nmero par de uma lista de nmeros. par(X,[X|_]):- X mod 2=:=0,!. par(X,[_|R]):-par(X,R),!. %7.f %Devolva todos os nmeros pares de uma lista de nmeros. pares(X,[X|_]):- X mod 2=:=0. pares(X,[_|R]):-pares(X,R). all_pares(L,Y):- findall(X,pares(X,Y),LR),list_to_set(LR,L). %7.g %Devolva um nmero que satisfaa uma dada condio.

Você também pode gostar