Você está na página 1de 2

LISTA DE EXERCCIOS no12 PROLOG

ATIVIDADE 1: usar listas em Prolog.


passo 1: obtenha no AVA (ava.furb.br/unidade 04) a base de fatos e regras sobre a cadeia alimentar (bichos.pl),
carregue a base no SWI-PROLOG e execute as consultas sugeridas abaixo.
Uma lista em Prolog uma sequncia de termos separados por vrgula e delimitados por colchetes, como por exemplo:
[] - lista vazia

[cerebro, pinky, remy, jerry]

Alguns predicados para manipulao de listas so os descritos a seguir. Observa-se que um mesmo predicado pode ser
utilizado para mais de uma funo.
a) delete( L1, E, L2 ): remove o elemento E da lista L1, resultando em L2.
Verifique o resultado das consultas:
?- delete([cerebro, pinky, remy, jerry], remy, L).
?- delete([cerebro, remy, remy, jerry], remy, L).
?- delete([cerebro, remy, remy, jerry], remy, [cerebro, jerry]).

b) findall( E, Meta, L ): cria uma lista L com todos os elementos E que satisfazem a Meta.
Verifique o resultado das consultas:
?- findall(X, rato(X), L).
?- findall(X, (cirurgiao_patela(X); peixe_palhaco(X)), L), write(L).

c) length( L, I ): retorna true se o nmero de elementos da lista L igual a I, retorna false, caso contrrio.
Verifique o resultado das consultas:
?- length([cerebro, pinky, remy, jerry], 4).
?- length([cerebro, remy, remy, jerry], 3).
?- delete([cerebro, remy, remy, jerry], remy, L), length(L, I).

d) nth1( I, L, E ): retorna true se o elemento E est na posio I da lista L, retorna false, caso contrrio.
Verifique o resultado das consultas:
?????-

nth1(2, [cerebro, pinky, remy, jerry], pinky).


nth1(3, [cerebro, pinky, remy, jerry], X).
nth1(X, [cerebro, pinky, remy, jerry], jerry).
findall(X, rato(X), L), nth1(1, L, X).
findall(X, rato(X), L), length(L, I), nth1(I, L, E).

e) sort( L1, L2 ): ordena e elimina os elementos duplicados da lista L1, resultando na lista L2.
Verifique o resultado das consultas:
?- sort([cerebro, pinky, remy, jerry], L).
?- sort([cerebro, remy, remy, jerry], L).
?- findall(X, rato(X), L1), sort(L1, L2), write(L2).

Para efetuar operaes aritmticas e relacionais, pode-se usar os seguintes predicados:


operao
= (igual), \= (diferente), < (menor), =< (menor ou igual), > (maior), >= (maior ou igual)
+ (soma), - (subtrao), * (multiplicao), / (diviso)

exemplo
10 \= 2
X is 10 / 2

passo 2: obtenha no AVA (ava.furb.br/unidade 04) a base de fatos e regras sobre filmes (filmes.pl).
passo 3: carregue a base no SWI-PROLOG.
passo 4: utilizando os fatos j definidos e os predicados para manipulao de listas, edite o arquivo filmes.pl e inclua
regras para responder s seguintes perguntas, como no exemplo abaixo:
pergunta

p1

Quais os ttulos de todos os filmes?

p2

Quais os ttulos dos filmes da DreamWorks?

p3

Quais os ttulos dos filmes da Pixar lanados at 2005?

p4

Quais os diretores do Os Croods?

p5

Quais os ttulos dos filmes do diretor Carlos Saldanha?

p6

Quais os diretores dos filmes da Pixar? Observa-se


que no podem aparecer nomes repetidos.

p7

Quais os personagens de A era do gelo?

p8

Quais os personagens dos filmes da DreamWorks?

p9

Quais os personagens dos filmes do diretor Chris


Wedge?

p10 Quais os cdigos dos DVDs dos filmes da Blue Sky?


p11

Quais os ttulos dos filmes que a vdeo locadora no


possui DVD?

p12 Quantos clientes a vdeo locadora possui?


p13

Quais os cdigos dos DVDs locados no dia 2013-1014?

p14

Quais os nomes dos clientes que locaram DVDs no dia


2013-11-07?

p15 Qual a quantidade de DVDs locados por Jos?


p16 Quais os ttulos dos filmes locados por Alice?
p17 Quais os diretores dos filmes locados por Paulo?
p18 Quantas vezes Nicole locou Shrek?
p19 Quantos clientes locaram Os Croods?
p20 Quais clientes locaram Procurando Nemo?

regra
p1 :- findall(Titulo, filme(X, Titulo, Y, Z), L),
write(' filmes: '), write(L).

Você também pode gostar