Exercícios Práticos: Programação lógica com Prolog
Preparação
| Interação Básica
| Fatos, regras e consultas
| Entrada e saída
| Mais programas
| Material de apoio
Preparação
Para estes exercícios você vai precisar do ambiente SWI-Prolog, que está disponível no NCC:
$ pl Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.6.64) Copyright (c) 1990-2008 University of Amsterdam. SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. Please visit http://www.swi-prolog.org for details. For help, use ?- help(Topic). or ?- apropos(Word). ?-
Interação Básica
- O arquivo ex_bd.pl contém um exemplo de programa em Prolog. Para carregar este programa, utilize o predicado consult que é pré-definido em Prolog. Este predicado alimenta a base de dados a partir de um programa fonte.
?- consult('ex_bd.pl').
- Descubra uma maneira abreviada de utilizar o predicado consult. Para isso, consulte o manual on-line do SWI-Prolog:
?- help(consult).
- Para verificar o conteúdo da base de dados, utilize o predicado listing:
?- listing.
- Para sair do SWI-Prolog, utilize o predicado pré-definido halt (ou Ctrl-d):
?- halt.
Fatos, regras e consultas
- Examine o programa ex_bd.pl e responda: quantos fatos e quantas regras estão definidos neste arquivo?
- Verifique quais são as respostas às seguintes consultas:
?- gaucho(andre). % "André é gaúcho?" ?- europeu(jose). % "José é europeu?"
- Verifique quais são as respostas para a seguinte consulta (utilize um ponto-e-vírgula após cada resposta para descobrir se existem outras):
?- brasileiro(X). % "Quem é brasileiro?"
- Na linguagem Prolog, o caracter sublinhado (_) representa uma variável sem nome. Este recurso é útil quando o valor da variável é irrelevante em uma dada regra ou consulta. Para testar o uso de variáveis anônimas, execute a seguinte consulta:
?- brasileiro(_). % "Existe algum brasileiro na base de dados?"
- Transforme as seguintes afirmações em fatos Prolog e inclua-os em ex_bd.pl (recarregue o programa modificado utilizando consult):
- "Joana nasceu em Salvador."
- "Joana tem 22 anos."
- "Michel nasceu em Paris e tem 40 anos."
- (Solução) Considerando a base de dados em ex_bd.pl, transforme as seguintes perguntas em consultas Prolog (verifique quais são as respostas retornadas pelo sistema):
- "Onde fica Grenoble?"
- "Quais são as pessoas nascidas na Europa?"
- "José nasceu no Brasil?"
- "Quais são as pessoas com mais de 30 anos?"
- "Quem são os brasileiros que moram na França?"
- "Há alguém que more no Rio Grande do Sul ou na Bahia?"
- Traduza a seguinte consulta Prolog para uma pergunta em linguagem natural:
?- localizado_em(X, brasil).
Qual é a resposta para esta consulta Prolog? Por que santa_maria não está entre os resultados? - (Solução) Modifique o programa ex_bd.pl para levar em conta a seguinte declaração:
- "Toda localidade situada no Rio Grande do Sul ou na Bahia também localiza-se no Brasil".
- Repita a consulta do exercício 7 e veja o efeito da modificação feita no exercício 8.
Entrada e saída
- O arquivo ex_es.pl contém um exemplo de programa Prolog que utiliza predicados pré-definidos para operações de entrada e saída. Carregue este programa e execute a seguinte consulta:
?- interacao.
Atenção: para terminar a entrada de dados você deve digitar um ponto final e teclar [Enter].
Mais programas
- O arquivo ex_cont.pl contém um exemplo de programa Prolog que conta de 1 até 10. Carregue este programa e execute-o:
?- conta.
- Inclua no programa ex_cont.pl uma nova regra para contagem regressiva de B até A, sendo que B >= A.
- (Solução) Crie um programa Prolog interativo (semelhante a ex_es.pl) que leia um número N positivo e imprima na tela o somatório de 1 até N. Dica: o somatório de 1 é igual a 1.
- (Solução) Crie um programa Prolog que imprima a famosa canção:
1 elefante incomoda muita gente 2 elefantes incomodam incomodam muito mais 3 elefantes incomodam muita gente 4 elefantes incomodam incomodam incomodam incomodam muito mais
O número (N) de elefantes deve ser um argumento para o programa. Dica: para determinar se um número N é par, utilize as seguintes regras:par(0). par(N) :- M is floor(N/2)*2, M = N. impar(N) :- not(par(N)).
Operações com listas
- (Use o template) Defina os predicados
constroi_lista(L)
,somatorio(L,S)
emedia(L, M)
para completar o programa abaixo:main :- constroi_lista(L), somatorio(L, S), write('Somatorio :'), write(S), nl, media(L, M), write('Media :'), write(M), nl.
Material de apoio
- SWI-Prolog Reference Manual
Manual de referência do SWI Prolog.