Roteiro e Exercícios para aula prática de PROLOG

Propaganda
UFES – CEUNES – DECOM – Engenharia de Computação
Linguagens de Programação
Prof. Henrique Monteiro Cristovão
Roteiro e Exercícios para aula prática de PROLOG
I. Introdução
Prolog é uma linguagem de paradigma declarativo e lógico. É baseada na lógica de predicados e um programa é
uma coleção de unidades lógicas chamadas predicados. Cada predicado é uma coleção de cláusulas. Uma cláusula
é uma regra ou um fato. A linguagem Prolog trata as regras como se fossem universalmente quantificadas.
As principais aplicação da programação em lógica são: (1) Sistemas Baseados em Conhecimento SBCs, (2)
Sistemas de Bases de Dados, (3) Sistemas Especialistas, (4) Processamento da Linguagem Natural, (5) Educação e
Modelagem de Arquiteturas Não-Convencionais.
Para mais detalhes, leia os livros “Introdução a Programação Prolog” de Luiz A. M. Palazzo disponível em
http://www.lapsi.eletro.ufrgs.br/~marchioro/ParaLingProg/LivroProlog.pdf; e “Programação em Prolog: uma
abordagem prática” de Eloi L. Fávero disponível em http://www3.ufpa.br/favero/
II. Software SWI-PROLOG
SWI-Prolog é uma implementação em código aberto em desenvolvimento contínuo desde 1987 para as plataformas
Unix, Windows e Macintosh. O nome SWI é derivado de Social-Wetenschappelijke Informatica ("Ciências Sociais
Informática"), o antigo nome do grupo na Universidade de Amsterdão onde seu autor principal trabalha.
Download: http://www.swi-prolog.org - selecione “Download” e “Stable release”.
Manual do SWI-Prolog: http://www.swi-prolog.org/pldoc/refman/
III. Inclusão dos fatos
a) Digite as clausulas dentro de um arquivo de banco de dados do Prolog (arquivo texto)
File – New – “atribua um nome para o arquivo”
Digite os seguintes fatos (use sempre letras minúsculas para fatos, regras e constantes):
Obs.: todos os fatos devem ficar agrupados.
come(urso,peixe).
come(peixe,peixinho).
come(peixinho,alga).
come(peixe,alga).
come(urso,raposa).
come(veado,grama).
come(peixe,minhoca).
come(urso,guaxinim).
come(raposa,coelho).
come(urso,veado).
come(lince,veado).
come(planta_carnívora,mosca).
come(veado,planta_carnívora).
animal(urso).
animal(peixe).
animal(raposa).
animal(veado).
animal(minhoca).
animal(lince).
animal(coelho).
Leitura:
“urso come peixe”
Conjunto de fatos.
“urso”, “peixe”, “peixinho”,
“alga”, etc, são constantes
Leitura:
“urso é um animal”
1/7
animal(guaxinim).
animal(mosca).
animal(peixinho).
planta(grama).
planta(alga).
planta(planta_carnívora).
b) Salve este arquivo (File – Save buffer) – não precisa fechá-lo
c) Compile o programa através da opção: Compile – Compile buffer
d) Faça perguntas ao ambiente (volte à janela principal, mas não precisa fechar o editor):
come(urso,peixe).
Aparecerá a resposta “Yes” confirmando a veracidade da informação.
come(urso,tigre).
Aparecerá a resposta “No” indicando que esta informação não existe.
animal(planta_carnívora).
Planta carnívora é animal? “No”
come(X,peixe).
Quais são os elementos que comem peixe? Tecle „;‟ para listar todos.
animal(X).
Quais são os elementos com propriedade animal?
come(X,Y).
Quais são todos os elementos que participam da relação come?
- Digite sempre após o prompt “?-”
Obs.:
-
Para fazer o prompt reaparecer tecle ponto e ENTER.
-
Use seta para cima para voltar as digitações anteriores.
-
Tecle “;” para obter o próximo item da resposta, caso exista mais de uma.
IV. Inclusão das regras
a) Tabela de conversão:
Lógica
Significado
Prolog
a  b
a e b
a,b
a  b
a ou b
a;b
a'
negação de a
\+a
a  b
se a então b
b:-a
a  b
a é equivalente a b
a=b
a não é equivalente a b
a\=b
(a  b)'
(somente para regras)
b) Observe a regra abaixo:
Português:
Carnívoro é quem come animal.
Lógica:
(x)(y)come( x, y)  animal ( y)  carnivoro( x)
Prolog:
carnívoro(X):-come(X,Y), animal(Y).
Obs.: as regras devem ser digitadas no mesmo arquivo dos fatos.
2/7
c) Escreva as regras no mesmo editor em que estão os fatos.
Obs.: as variáveis devem ser maiúsculas
%% carnívoro é quem como animal
carnívoro(X):-come(X,Y), animal(Y).
%% herbívoro é quem come planta e não come animal
herbívoro(X):-come(X,Y),planta(Y),\+carnívoro(X).
%% predador é carnívoro e também é animal
predador(X):-carnívoro(X),animal(X).
%% presa é quem é comido por predador e também é animal
presa(X):-come(Y,X),predador(Y),animal(X).
%% caçado é quem é presa
caçado(X):-presa(X).
%% X pertence a cadeia alimentar de Y
pertence_a_cadeia(X,Y):-come(Y,X).
pertence_a_cadeia(X,Y):-come(Z,X),pertence_a_cadeia(Z,Y).
d)
Para fazer perguntas, salve novamente o arquivo (File-Save buffer) e
recompile (Compile – Compile buffer):
Tecle “;” (ponto-e-vírgula) para obter o próximo item da resposta.
Perguntas em português
Perguntas em Prolog
1. Peixe come peixinho e minhoca?
come(peixe,peixinho),come(peixe,minhoca).
2. Quais são as plantas?
planta(X).
3. Quem é comido pelo urso?
come(urso,X).
4. Quem come peixe?
come(X,peixe).
5. Quem é predador?
predador(X).
6. Quem é predador e também presa?
presa(X),predador(X).
7. Quem é presa e herbívoro?
presa(X),herbívoro(X).
8. Quem pertence a cadeia alimentar do
urso?
pertence_a_cadeia(X,urso).
9. Quem pertence a cadeia alimentar do
urso e ao mesmo tempo come planta?
10. A minhoca pertence a cadeia alimentar
de quem?
pertence_a_cadeia(X,urso),herbívoro(X).
pertence_a_cadeia(minhoca,X).
3/7
V. Exercícios
1. A partir dos elementos construídos no exemplo sobre cadeia alimentar, crie a regra onívoro. Ela
define um animal que come planta e também come animal.
2. Suponha os seguintes fatos para registrar a média destes alunos:

nota(joao,5.0).

nota(maria,6.0).

nota(joana,8.0).

nota(mariana,9.0).

nota(cleuza,8.5).

nota(jose,6.5).

nota(jaoquim,4.5).

nota(mara,-1).

nota(mary,11).

...
Construa regras para identificar o estado dos alunos quanto a: aprovado (de 7.0 a 10.0), recuperação
(de 5.0 até menor que 7.0), reprovado (de 0.0 a menor que 5.0) e erro se nenhuma das faixas
anteriores.
Obs.: o operador menor ou igual deve ser escrito como “=<”.
3. Num banco de dados, feito em Prolog, para registrar relacionamentos afetivos envolvendo o sexo, o
gosto por filmes e o gosto por faixa etária do parceiro, e a partir dos fatos informados, escreva as
regras pedidas.

homem(pedro).

homem(marcos).

homem(ze).

mulher(maria).

mulher(joana).

idade(ze,30).

idade(maria,40).

idade(marcos,20).

idade(pedro,25).

idade(joana,28).

gosta(ze,aventura).

gosta(maria,comedia).

gosta(joana,romance).

gosta(marcos,terror).

gosta(marcos,romance).

gosta(pedro,romance).

gosta(maria,romance).
4/7

opcao(ze,20,40).
// significa que o zé gostaria de se relacionar
com pessoas 20 a 40 anos

opcao(maria,25,55).

...
a. afinidade_filme(X,Y)
Seleciona pessoas com o mesmo gosto de filme.
(sendo X e Y pessoas, X possui o mesmo gosto de filme do que Y)
b. casal(X,Y)
Seleciona casais (sexos diferentes)
c. casal_afinidade_filme(X,Y)
Seleciona casais com o mesmo gosto de filme
d. casal_afinidade_idade(X,Y)
Seleciona casais cujos gostos de faixa etárias sejam atndidos
e. casal_total(X,Y)
Seleciona casais com afinidade em filme e faixa etária
4. Em Prolog, suponha os seguintes fatos para registrar informações sobre capitais, estados e regiões:
 cidade(são_mateus,pequena).
 cidade(vitória,média).
 cidade(são_paulo,grande).
 cidade(maceió,média).
 cidade(campos,pequena).
 cidade(cariacica,pequena).
 cidade(colatina,pequena).
 ...
 capital(vitória).
 capital(maceió).
 capital(sãopaulo).
 ...
 estado(es,sudeste).
 estado(al,nordeste).
 estado(sp,sudeste).
 ...
 pertence(são_mateus,es).
 pertence(vitória,es).
 pertence(santos,sp).
 pertence(maceió,al).
 pertence(colatina,es).
 pertence(cariacica,es).
 ...
5/7
Escreva sentenças para responder as seguintes perguntas:
a. Qual a capital do Rio Grande do Sul?
b. Quais os estados que pertencem a região Nordeste?
c. Quais são todas as cidades pequenas e médias?
d. Quais são as cidades da região Sudeste?
Crie as seguintes regras:
e. cidade_pequena(X)
f.
cidade_na_região_norte(X)
g. capital_região_sul(X)
h. cidade_pequena_região_sudeste(X)
i.
estado_com_capital_grande(X)
j.
estado_região_nordeste_com_capital_média(X)
k. cidade_pequena_do_estado(X,Y)
5. Suponha que existe um banco de dados Prolog que fornece informações sobre peças de um motor de
automóvel. Os predicados grande(X), pequena(X) e parte_de(X,Y) estão incluídos.
a. Escreva uma pergunta para encontrar todas as peças pequenas que fazem parte de outras
peças.
b. Escreva uma pergunta para encontrar todas as peças grandes que são formadas por peças
pequenas.
c. Formule uma regra para definir peça_tamanho_indefinido(x) como sendo toda peça que não é
pequena nem grande.
6. Crie um banco de dados para representar as relações de parentesco da sua família.
A partir de 4 tipos de fatos (filho ambos os sexos, casado, homem e mulher), crie regras para:
pai(X,Y)
mãe(X,Y)
neto(X,Y)
neta(X,Y)
avô(X,Y)
bisavó(X,Y)
bisneta(X,Y)
irmão(X,Y)
irmã(X,Y)
tia(X,Y)
sobrinha(X,Y)
primo(X,Y)
cunhado(X,Y)
sogra(X,Y)
genro(X,Y)
6/7
nora(X,Y)
enteado(X,Y)
primo_segundo_grau(X,Y)
Exemplos de alguns fatos possíveis:
homem(joão).
homem(joaquim)
mulher(ana).
filho(ana, joão).
filho(ana, maria).
filho(joaquim,maria).
casado(joão, maria).
Neste caso, se for perguntado quais são as irmãs de Joaquim, em Prolog:
irmã(X,joaquim).
o sistema responderá:
ana.
7/7
Download