You are on page 1of 6

Centro Universitário SENAC 2o semestre de 2008

Programação em Lógica - Atividades de Laboratório


Paradigmas de Linguagens de Programação Prof. Fabrı́cio Jailson Barth

1. Crie os programas abaixo, rode no ambiente Prolog e analise o comportamento dos programas. Para a
maioria dos programas execute o trace.

(a) Exemplo do pedágio.


valorPedagio(carro,10).
valorPedagio(moto,5).
valorPedagio(onibus,20).
(b) Faça as seguintes perguntas:

?- 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.

(a) Formule a seguinte consulta: ?- tamanho(P,A).


(b) Inserir uma regra que permita formular a seguinte consulta: ?- tamanho total(Imovel).

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).

4. Faça o que está descrito no arquivo aulaPraticaProlog.pl.


5. Escreva um programa Prolog que retorne a soma dos elementos de uma lista.
6. Escreva um programa Prolog que retorne o último elemento de uma lista dada. Ou seja, defina o predicado
last(X,L) que testa se X é o último elemento da lista L.
7. Escreva um programa Prolog que retorne uma lista que contém a união dos elementos de duas listas dadas.
8. Escreva um programa Prolog que retorne uma lista que contém a união dos elementos de duas listas dadas.
9. Defina um predicado no dupl/2 que remova os duplicados de uma lista.
10. Defina um predicado enumerar(+N,+M,+P,?L) que gera a lista L de números entre N e M, a passo P.
Por exemplo:

?- enumerar(3,10,2,L).
L = [3,5,7,9] ?
Yes

11. Considere as seguintes premissas:


Todos os animais têm pele. Peixe é um tipo de animal, pássaros são outro tipo e mamı́feros são um
terceiro tipo. Normalmente, os peixes têm nadadeiras e podem nadar, enquanto os pássaros têm asas e
podem voar. Se por um lado os pássaros e os peixes põem ovos, os mamı́feros não põem. Embora tubarões
sejam peixes, eles não põem ovos, seus filhotes nascem já formados. Salmão é um outro tipo de peixe, e
é considerado uma delı́cia. O canário é um pássaro amarelo. Uma avestruz é um tipo de pássaro grande
que não voa, apenas anda. Os mamı́feros normalmente andam para se mover, como por exemplo uma
vaca. As vacas dão leite, mas também servem elas mesmas de comida (carne). Contudo, nem todos os
mamı́feros andam para se mover. Por exemplo, o morcego voa.
Considere ainda que existem os seguinte animais:

• Piupiu, que é um canário.


• Nemo, que é um peixe.
• Tutu, que é um tubarão.

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:

(a) O piupiu voa?


(b) Qual a cor do piupiu?
(c) A Xica voa?
(d) A Xica tem asas?
(e) O Vamp voa? Tem asas? Poem ovos?
(f) Quais os nomes dos animais que põem ovos?
(g) Quais os nomes dos animais que são comestı́veis?
(h) Quais os nomes dos animais que se movem andando?
(i) Quais os nomes dos animais que se movem nadando mas não põem ovos?

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’).

% Relacao de DVD (a caixa em si)


% dvd(nro do DVD, id do filme, estante).
%
dvd(d1, f1, est1).
dvd(d2, f2, est1).
dvd(d4, f4, est1).
dvd(d3, f3, est2).
dvd(d5, f5, est3).
dvd(d6, f1, est1).
dvd(d7, f2, est4).
dvd(d8, f2, est4).

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).

(a) Os nomes dos filmes do diretor Walter Salles?


Resposta: acrescente no programa prolog a seguinte regra:
p1 :- findall(Titulo,
filme(_, Titulo, _, ’Walter Salles’, _),
R),
sort(R,Nomes), write(Nomes).
E teste com a consulta:
?- p1.
[Abril despedacado, Diarios de motocicleta]

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.

13. Considere o seguinte programa Prolog:

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).

Qual a resposta do prolog para as seguinte consultas:

(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