UNIVERSIDADE FEDERAL DE UBERLÂNDIA Disciplina: Programação Lógica Curso: Sistemas de Informação Professores: Elaine Ribeiro de Faria Créditos Roteiro de Aula Prática O material a seguir consiste de adaptações e extensões dos originais gentilmente cedidos pelo Prof. Alexsandro Santos Soares Agradecimento especial ao Prof. Gabriel Coutinho que auxiliou na confecção do material Objetivo Apresentar o ambiente SWI - Prolog Introduzir a linguagem Prolog: fatos, regras e consultas. Exercícios 1 1.1 Escreva cláusulas Prolog (fatos, regras, ou perguntas) que expressem as seguintes sentenças. Há mais de uma solução em alguns casos. Não é preciso fazer no SWI Prolog, use apenas o bloco de notas. a) O patinho é feio. b) Eu sou legal. c) Todo homem é mortal, exceto o super-homem. d) João nasceu em Pelotas e Jean nasceu em Paris. e) Pelotas fica no Rio Grande do Sul. f) Paris fica na França. g) Só é gaúcho quem nasceu no Rio Grande do Sul. Introdução ao SWI-Prolog Comandos do Prolog O texto de um programa em Prolog é normalmente criado num arquivo, ou conjunto de arquivos, usando um dos editores de texto standard, como por exemplo, o bloco de notas (notepad) do Windows. Embora em alguns momentos deste texto ênfase seja dada para o ambiente Windows nada impede que o mesmo procedimento seja adotado para o SWI-Prolog executado em Linux. O interpretador de Prolog pode depois ser instruído a ler os programas ou bases de conhecimento destes arquivos - a este processo chamamos consultar. Embora esses arquivos possam ter uma extensão arbitrária, optamos por usar a extensão.pl, que é a extensão por defeito usada pelo SICStus (uma outra implementação de Prolog) e pelo SWI-Prolog. Iniciar o interpretador de Prolog Existe um ícone para o interpretador SWI-Prolog no Windows. Depois de clicar duas vezes nesse ícone, o interpretador de Prolog fica à espera de ordens, aparecendo o prompt?- Criar um programa Prolog
Escolha a opção do menu File/New. Uma nova janela será aberta, na qual você digitará o seu programa. Para compilar, acesse a opção Compile/ Compile buffer. Agora é só voltar ao prompt de comandos e fazer suas perguntas ao Prolog. Exercícios 2 2.1 Abra a Aula2-Sintaxe.pdf (disponível no site www.facom.ufu.br/~elaine/pl.html). 2.2 Copie a base de conhecimento 6 (slide 46) para um programa Prolog. 2.3 Faça perguntas ao Prolog sobre essa base de conhecimento. Relacionamentos familiares Prolog é uma linguagem adequada para processamento simbólico. É indicada para resolver problemas que envolvam objetos e seus relacionamentos, por exemplo, o relacionamento familiar. Em Prolog para especificar que Carlos é progenitor de Ana escreve-se: progenitor(carlos,ana). Continuando com o exemplo da família deve-se especificar que Carlos tem mais uma filha: Juliana. Assim temos que: progenitor(carlos,ana). progenitor(carlos,juliana). Após comunicar este programa ao sistema Prolog, podemos fazer com que ele nos responda a perguntas. Isto se faz colocando o sistema num modo em que isto é possível. Em geral o símbolo?-, que é um prompt, representa este estado. Por exemplo, podemos perguntar: Carlos é progenitor de Ana? Em Prolog isto se faz escrevendo:?- progenitor(carlos,ana). Perguntas mais interessantes podem ser formuladas. Exemplo: Quem são o(s) filho(s) de Carlos??- progenitor(carlos,x). Desta vez a resposta não será true ou false. Prolog nos dirá qual é o valor de X que tornará a cláusula verdadeira. X=ana Conforme especificado anteriormente, temos que Carlos tem mais de uma filha. Para dizer a Prolog que queremos outras soluções digitamos ; na frente da resposta dada:?- progenitor(carlos,x). X=ana; X=juliana; False Exercícios 3 3.1 Estender o programa Prolog para incluir os relacionamentos pai, mae, homem e mulher. 3.2 Escrever em Prolog as seguintes consultas: a. Quem é pai de Ana? b. Quem é pai de Quem?
Relacionamentos familiares - continuação Uma pergunta mais complicada: Quem é o avô de Ana? Não foi dito ao Prolog nenhum relacionamento avô. A consulta tem que ser decomposta em dois passos: - Quem é o pai de Ana? Assuma que é algum Y. - Quem é o pai de Y? Assuma que é algum X. Tal consulta composta é escrita em prolog da seguinte forma:?- pai(y,ana),pai(x,y). Esta consulta pode ser lida da seguinte forma: Encontre X e Y de tal forma que pai(y,ana) e pai(x,y) sejam satisfeitos Exercícios 4: 4.1 Escrever em Prolog as seguintes consultas: a. Quem são os netos de João? b. Juliana e Ana têm o mesmo pai? Relacionamentos familiares - continuação Se ao invés de uma consulta quisermos algo mais definitivo, devemos criar uma regra. Definindo uma regra para a relação avo: avo(x,y) :- pai(x,z), pai(z,y). Esta regra pode ser lida da seguinte forma: para todo X, Y e Z, X é avô de Y se X é pai de Z e Z é pai de Y. Exercícios 5: 5.1 Escreva regras para os relacionamentos: a. Avó b. Filho c. Filha d. Irmã e. Irmão f. Irmãos g. Tio h. Tia i. Primo j. Prima 5.2 Monte uma base de dados usando as informações sobre a árvore genealógica da sua família. Faça diversas perguntas ao Prolog sobre as relações de parentesco entre seus familiares. 5.3 Suponha a seguinte Base de Fatos Prolog: cargo(tecnico, rogerio). cargo(tecnico, ivone). cargo(engenheiro, daniel). cargo(engenheiro, isabel). cargo(engenheiro, oscar). cargo(engenheiro, tomas). cargo(engenheiro, ana). cargo(supervisor, luis). cargo(supervisor_chefe, sonia).
cargo(secretaria_exec, laura). cargo(diretor, santiago). chefiado_por(tecnico, engenheiro). chefiado_por(engenheiro, supervisor). chefiado_por(analista, supervisor). chefiado_por(supervisor, supervisor_chefe). chefiado_por(supervisor_chefe, director). chefiado_por(secretaria_exec, director). Escreva em linguagem natural as seguintes interrogações Prolog: a)?- chefiado_por(tecnico, X), chefiado_por(x,y). b)?- chefiado_por(tecnico, X), cargo(x,ivone), cargo(y,z). c)?- cargo(supervisor, X); cargo(supervisor, X). d)?- cargo(j,p), (chefiado_por(j,supervisor_chefe);chefiado_por(j, supervisor)). e)?- chefiado_por(p, director), not(cargo(p, carolina)). Responda qual é a resposta encontrada pelo Prolog para cada uma destas interrogações. Mundo de Harry Poter Observe a seguinte base de conhecimento: elfo_domestico(dobby). bruxo(hermione). bruxo('mcgonagall'). bruxo(rita_skeeter). magico(x):- elfo_domestico(x). magico(x):- feiticeiro(x). magico(x):- bruxo(x). Exercício 6 6.1 Quais das seguintes consultas são satisfeitas? Onde relevante, dê todas as instanciações de variáveis que levam ao sucesso. magico(elfo_domestico). feiticeiro(harry). magico(feiticeiro). magico('mcgonagall'). magico(hermione). Alunos Escreva os seguintes fatos (especificados num arquivo de nome aluno.pl): aluno(joao,poo). aluno(pedro,poo). aluno(maria,pl). aluno(rui,pl). aluno(manuel,pl). aluno(pedro,pl). aluno(rui,ed1). Exercícios 7 7.1 Verifique que os fatos estão presentes na Base de Conhecimento (utilize o predicado listing). a. Escreva uma consulta que verifique se joao é aluno de pl. b. Escreva uma consulta que verifique se rui é aluno de poo. c. Escreva uma consulta que verifique se joao e maria são ambos alunos de ed1. joao e maria são ambos alunos de ed1 se joao for aluno de ed1 e maria for aluna de ed1.
d. Escreva uma consulta que permita saber quem é aluno de pl. e. Escreva uma consulta que permita saber as disciplinas em que rui é aluno. 7.2 Adicione os seguintes fatos à Base de Conhecimento anterior: estuda(joao). estuda(maria). estuda(manuel). f. Sabendo que a aluno A faz a disciplina D se A é aluno de D e A estuda, escreva uma consulta que lhe permita saber se maria faz pl. g. Experimente agora a seguinte consulta?- aluno(x,pl), estuda(x). O que lhe permite esta consulta saber? h. Utilizando a consulta anterior, acrescente à Base de Conhecimento o predicado fazpl(x) e escreva uma consulta que lhe permita saber quem faz pl.