1. Crie os programas abaixo, rode no ambiente Prolog e analise o comportamento dos programas. Para a
maioria dos programas execute o trace.
?- valorPedagio(carro,X).
?- valorPedagio(X,5).
?- valorPedagio(X,Y).
(c) Exemplo da famı́lia.
mulher(maria).
homem(joao).
mulher(joana).
homem(carlos).
pai(joao,joana).
pai(joao,carlos).
mae(maria,joana).
mae(maria,carlos).
pais(X,Y) :- mae(X,Y).
pais(X,Y) :- pai(X,Y).
avo(X,Z) :- pais(X,Y), pais(Y,Z), homen(X).
irmaos(X,Y) :- mae(M,X), mae(M,Y), pai(P,X), pai(P,Y).
(d) Recursividade.
fatorial(0,1).
fatorial(N,X):-
N1 is N - 1,
fatorial(N1,Y),
X is N * Y.
(e) Listas.
lista([]).
lista([X|Xs]):- lista(Xs).
membro(X,[X|Xs]).
membro(X,[Y|Xs]):- membro(X,Xs).
2. Dado a base de dados com medidas do imóvel e regra para calcular a área individual de cada peça do
imóvel:
1
medida(sala,5,3).
medida(quarto1,3,3).
medida(quarto2,3,4).
medida(cozinha,2,3).
tamanho(Peca,Area):-
medida(Peca,Comp,Larg),
Area is Comp * Larg.
3. Exemplo de condicional.
quadrado(X):-area(X,X).
retangulo(X,Y):-area(X,Y).
area(X,Y):-
Z is X*Y,
(
X=:=Y,write(’quadrado: ’)
;
write(’retangulo: ’)
),
write(Z).
?- enumerar(3,10,2,L).
L = [3,5,7,9] ?
Yes
2
• Mimosa, que é uma vaca.
• Vamp, que é um morcego.
• Xica, que é uma avestruz.
• Alfred, que é um salmão.
Defina fatos e regras prolog que representam as premissas acima, e somente elas, e formule consultas
prolog para responder às seguintes perguntas:
12. O Prolog pode representar relações mais complexas que as vistas nos exemplos anteriores. É possı́vel por
exemplo relacionar Diários de motocicleta, 2004 e Walter Salles numa relação que se poderia ser chamada
de filme.
Desta forma, o programa prolog abaixo contém várias relações que representam os dados de uma vı́deo
locadora. Perceba a semelhança com um banco de dados relacional (baseado em tabelas). No caso, cada
predicado representa uma tabela do banco de dados.
% Relacao de filmes
% filme(id, titulo, ano, diretor, nacionalidade).
%
filme(f1, ’Monty Python: O Sentido da Vida’, 1983, ’Terry Jones’, uk).
filme(f2, ’Edukators’, 2004, ’Hans Weingartner’, de).
filme(f3, ’Lavoura Arcaica’, 2001, ’Luiz Fernando Carvalho’, br).
filme(f4, ’Lisbela e o Prisioneira’, 2003, ’Guel Arraes’, br).
filme(f5, ’Abril despedaçado’, 2001, ’Walter Salles’, br).
filme(f6, ’Diários de motocicleta’, 2004, ’Walter Salles’, br).
% Relacao de paises
% pais(sigla, nome).
%
pais(uk, ’Unided Kingdom’).
pais(de, ’Alemanha’).
pais(br, ’Brasil’).
3
% Relacao de clientes
% cliente(cod, nome, telefone).
%
cliente(c1, ’Bob’, ’333-3112’).
cliente(c2, ’Zeca’, ’245-1099’).
cliente(c3, ’Mari’, ’323-0685’).
cliente(c4, ’Bianca’, ’333-4391’).
cliente(c5, ’Alice’, ’251-7439’).
cliente(c6, ’Maria’, ’212-3271’).
% Relacao de locacoes
% locacao(cod cliente, nro do DVD, data de entrega)
%
locacao(c1, d1, ’2005-11-07’).
locacao(c1, d2, ’2005-11-07’).
locacao(c3, d5, ’2005-11-09’).
locacao(c2, d3, ’2005-11-10’).
locacao(c3, d3, ’2005-11-11’).
locacao(c4, d8, ’2005-11-12’).
locacao(c5, d7, ’2005-11-12’).
locacao(c6, d6, ’2005-11-12’).
locacao(c1, d5, ’2005-11-13’).
locacao(c1, d6, ’2005-11-13’).
locacao(c6, d2, ’2005-11-14’).
locacao(c3, d7, ’2005-11-14’).
locacao(c3, d8, ’2005-11-14’).
locacao(c5, d1, ’2005-11-15’).
A partir destas relações, formule consultas prolog para responder às perguntas abaixo (as primeiras já
estão respondidas como exemplo).
Yes
Observação: o representa uma variável que não se quer saber o valor.
Caso você conheça a linguagem de manipulação de banco de dados SQL, a consulta acima seria
equivalente a
SELECT titulo
FROM filme
WHERE diretor = ’Walter Salles’
ORDER BY titulo
(b) O nome dos filmes nacionais? Resposta:
4
p2 :- findall(Titulo,
(pais(Sigla, ’Brasil’), filme(_, Titulo, _, _, Sigla)),
R),
sort(R,Nomes), write(Nomes).
(c) O nome e o diretor dos filme(s) lançados até 2004 na Alemanha? Resposta:
p3 :- findall(filme(T,D),
(pais(CodP, ’Alemanha’), filme(_, T, A, D, CodP), A =< 2004),
R),
sort(R,Nomes), write(Nomes).
Em SQL:
SELECT titulo, diretor
FROM filme, pais
WHERE pais.nome = ’Alemanha’ and
pais.sigla = filme.nacionalidade and
filme.ano = 2004
ORDER BY titulo
(d) O nome dos filme(s) lançados até o ano de 2001.
(e) A identificação dos Dvd(s) dos filmes internacionais.
(f) A identificação dos Dvd(s) dos filmes nacionais que estão na estante 2 (est2).
(g) Os nomes dos diretores dos filmes que estão na estante 1 (est1).
(h) Os nomes dos filmes que não possuem pelo menos um dvd.
(i) O nome dos paises dos filmes que estão na estante 1 e 4.
(j) O nome dos clientes que realizaram locações no dia 2005-11-07.
(k) A estante de todos os Dvds que estão locados.
(l) O nome dos filmes locados pela cliente ’Maria’.
(m) A quantidade de filmes locados pela ’Maria’.
(n) O nome do paı́s dos filmes locados pelo cliente Bob no dia 2005-11-07.
(o) A quantidade de filmes que o Bob locou.
terca(1,6,2004).
terca(8,6,2004).
terca(13,7,2004).
quarta(2,6,2004).
quarta(9,6,2004).
quarta(14,7,2004).
quinta(3,6,2004).
quinta(10,6,2004).
quinta(15,7,2004).
paradigmas(D,M,A) :- terca(D,M,A).
paradigmas(D,M,A) :- quinta(D,M,A).
(a) quinta(2,6,2004) = D.
(b) quinta(2,6,2004) = quinta(D,M,2004).
(c) quinta(2,6,2004).
5
(d) terca(1,6,2004).
(e) terca(DT,M,2004).
(f) quarta(DQ,6,2004), terca(DT,6,2004),DQ > DT.
(g) paradigmas(D,7,2004).
(h) findall(D,paradigmas(D,M,A),L).
(i) findall(M,paradigmas(D,M,A),L).
(j) findall(D,paradigmas(D,M,A),L), L = [C|R].
(k) findall(D,paradigmas(D,M,A),L), L = [C1,C2|R].
(l) findall(D,paradigmas(D,M,A),L), L = [C1,C2,R].
(m) findall(M,paradigmas(D,M,A),L), sort(L,L2).
14. Acrescente no programa acima regras Prolog para definir o predicado antes de aridade 6, sendo os três
primeiros argumentos uma data e os três últimos outra data. Esse predicado deve ser verdade quando a
primeira data for anterior à segunda. Por exemplo:
?- antes(1,6,2004,2,6,2004).
Yes
?- antes(2,6,2004,1,6,2003).
No