Programação Lógica. Programação Lógica PROLOG

Documentos relacionados
INF 1771 Inteligência Artificial

Inteligência Artificial. Prolog. Aula 2 Introdução (cont.)

Programação Lógica. A Linguagem Prolog. Paulo Henrique Ribeiro Gabriel Faculdade de Computação Universidade Federal de Uberlândia

Introdução à Programação em Prolog

03/04/2016 LÓGICA MATEMÁTICA. Prof. Esp. Fabiano Taguchi. Introdução ao Prolog

SCC Capítulo 5 Representação de Conhecimento através do Prolog

CENTRO UNIVERSITÁRIO LUTERANO DE PALMAS PROLOG. Elias Melgaço Chaves Júnior Jonatas Luiz da Costa Rafael Gonçalves Barreira

Fundamentos de Lógica Matemática

Paradigmas de Linguagens de Programação

Programação em Lógica. UCPEL/CPOLI/BCC Lógica para Ciência da Computação Luiz A M Palazzo Maio de 2010

Matemática Discreta - 01

Métodos para a construção de algoritmo

SEMÂNTICA. Rogério Rocha. rode = program simples = var x : int := 3 in x := x + 5 end.

30/04/2013. Prof. Hudson Costa

Lógica de primeira ordem (Capítulo 8 - Russell) Inteligência Artificial

Fundamentos 1. Lógica de Predicados

Prof. Jorge Cavalcanti

Cálculo proposicional

Raciocínio Automatizado

Lógica. Cálculo Proposicional. Introdução

Linguagens de Programação Funcional

Inteligência Artificial. Sistemas Baseados em Conhecimento. Representação de Conhecimento (continuação)

Aula 2 Programação Lógica Sintaxe Prolog. Profa. Elaine Faria UFU -2014

Programação Orientada a Objetos. Programação Lógica

Os Fundamentos: Lógica de Predicados

Programação Lógica. (Capítulo 11) LÓGICA APLICADA A COMPUTAÇÃO. Professor: Rosalvo Ferreira de Oliveira Neto

SCC Capítulo 2 Lógica de Predicados

Fundamentos de Lógica Matemática

Lógica de primeira ordem First Order Logic (FOL)

Aula 2: Linguagem Proposicional

Algoritmos e Programação I

Dedução Natural e Sistema Axiomático Pa(Capítulo 6)

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Linguagens Formais e Autômatos 02/2015. LFA Aula 02. introdução 28/09/2015. Celso Olivete Júnior.

Introdução à Programação

Linguagens de Programação Aula 15

Matemática discreta e Lógica Matemática

Linguagens de Programação

UNIDADE ACADÊMICA: Faculdade de

2. Linguagem de Programação Prolog

Capítulo 3 Lógica de Primeira Ordem

A Lógica de Primeira Ordem

Inteligência Artificial IA II. LÓGICA DE PREDICADOS PARA REPRESENTAÇÃO DO CONHECIMENTO

Elisabete Raposo Freire Departamento de Matemática Universidade dos Açores 21 Abril 2012

Linguagens de Programação Princípios e Paradigmas

Demonstrações. Terminologia Métodos

Ederson Luiz da Silva Ciência da Computação. Algoritmos e Programação

5. Expressões aritméticas

Introdução ao Curso. Área de Teoria DCC/UFMG 2019/01. Introdução à Lógica Computacional Introdução ao Curso Área de Teoria DCC/UFMG /01 1 / 22

Capítulo 7. Expressões e Sentenças de Atribuição

Lógica Proposicional. LEIC - Tagus Park 2 o Semestre, Ano Lectivo 2007/08. c Inês Lynce c Luísa Coheur

Lógica Formal. Matemática Discreta. Prof Marcelo Maraschin de Souza

Lógica proposicional

Um alfabeto é um conjunto de símbolos indivisíveis de qualquer natureza. Um alfabeto é geralmente denotado pela letra grega Σ.

Recursividade e listas

Fundamentos da Computação 1. Aula 03

Prolog. MATA56 - Paradigmas de Linguagens de Programação, UFBA, Prof. Rodrigo Rocha Prolog. Iniciando.

Programação I Apresentação

JOÃO NUNES de SOUZA. LÓGICA para CIÊNCIA da COMPUTAÇÃO. Uma introdução concisa

Lógica Formal. Matemática Discreta. Prof. Vilson Heck Junior

A linguagem da Lógica de Predicados. (Capítulo 8) LÓGICA APLICADA A COMPUTAÇÃO. Professor: Rosalvo Ferreira de Oliveira Neto

Lógica. Professor Mauro Cesar Scheer

BUSCA DE SOLUÇÕES EM PROLOG

Aula 6: Dedução Natural

Algoritmos e Programação - Engenharia da Computação -

Afirmações Matemáticas

MD Lógica de Proposições Quantificadas Cálculo de Predicados 1

Grupo de Usuários Java do Noroeste Paulista. Tópicos Avançados em Java

Lógica Proposicional (Consequência lógica / Dedução formal)

Dedução Natural LÓGICA APLICADA A COMPUTAÇÃO. Professor: Rosalvo Ferreira de Oliveira Neto

Conhecimento e Raciocínio Lógica Proposicional

Introdução à Programação Aula 03. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

Aula 1: Introdução ao curso

Expressões e sentença de atribuição

Sistemas de Banco de Dados

PROGRAMAÇÃO COMPUTACIONAL I

PORTUGUÊS ESTRUTURADO: INTRODUÇÃO INTRODUÇÃO À PROGRAMAÇÃO PROF. ALEXANDRO DOS SANTOS SILVA

Transcrição:

Programação Lógica PROLOG

A programação em lógica se desenvolveu no início dos anos 70 a partir de alguns trabalhos sobre prova de teoremas. Desde então ela tem demonstrado ser um formalismo simples, mas muito poderoso, que é bastante adequado tanto para a representação do conhecimento quanto como ferramenta de programação. Programação Lógica unifica: Engenharia de Software (especificação formal, linguagens de programação) IA (raciocino e Representação do Conhecimento (RC)) Banco de Dados -- Dedutivos (BDDs) Teoria Lógica (TL) das provas

Primeira linguagem de programação que seguiu o novo paradigma associado à programação em lógica foi PROLOG. PROLOG é uma linguagem baseada em um conjunto de conceitos: casamento de padrões; estruturação em forma de árvore; backtracking automático É uma linguagem orientada ao processamento simbólico. Representa uma implementação da lógica como linguagem de programação;

Paradigmas de linguagem de programação Linguagens Procedimentais (C, Pascal, Basic...) Especifica como realizar determinada tarefa. Linguagens Orientadas a Objetos (C++, Java, C#...) Especifica objetos e seus métodos. Linguagens Lógica (Prolog) Especifica o quê se sabe sobre um problema e o quê deve ser feito. É mais direcionada ao conhecimento e menos direcionada a algoritmos.

A programação em lógica baseia-se em estruturas lógicas denominadas Cláusulas de Horn, herdados da lógica de predicados, que se apresentam em quatro formas distintas: fatos, regras, consulta, vazia. Onde: Fatos verdades incondicionais Regras podem ser verdadeiras ou não Consultas provoca a execução do programa O PROLOG é uma linguagem de programação baseada em lógica de primeira ordem.

Na lógica de predicados usamos regras de inferência para demonstrar que uma tese é consequência de determinadas hipóteses Programação em Lógica e especificamente a linguagem Prolog Progamming in Logic também pode provar teses a partir de hipóteses A linguagem Prolog inclui: predicados, conectivos lógicos e regras de inferência - Princípio da Resolução

Prolog é uma linguagem declarativa ao invés de procedimental Um programa Prolog consiste na declaração (ou descrição de uma interpretação) de hipóteses que são verdadeiras em uma interpretação O conjunto de declarações que forma um programa Prolog é chamada a base de dados (BD) desse programa Para determinar se uma tese (consulta do usuário ao BD) é ou não verdadeira, Prolog aplica suas regras de inferência na BD.

Um programa em lógica é um modelo de um determinado problema ou situação expresso por meio de um conjunto de sentenças lógicas. Um programa em lógica não é a descrição de um procedimento para obter soluções de um problema. BD convencionais descrevem apenas fatos Oscar é um avestruz As sentenças de um Programa em Lógica, além de descrever fatos, permite a descrição de regras Todo avestruz é um ave Havendo regras, novos fatos podem ser deduzidos Oscar é uma ave

Fatos servem para estabelecer um relacionamento existente entre objetos de um determinado contexto de discurso. Por exemplo, num contexto familiar, pai(sebastião,livia) Predicado ou relação Argumento do predicado é um fato que estabelece que Sebastião é pai de Lívia, ou seja, que a relação pai existe entre os objetos denominados sebastião e livia.

Em Prolog, identificadores de relacionamentos são denominados predicados e identificadores de objetos são denominados átomos. Tanto predicados quanto átomos devem iniciar com letra minúscula. Ex.: Programa árvore genealógica. pai(adao,cain). pai(adao,abel). pai(adao,seth). pai(seth,enos).

Consulta são usadas para recuperar informações de um programa lógico. Uma consulta pergunta se uma determinado relacionamento existe entre objetos. Por exemplo, a consulta?- pai(sebastião,lívia). pergunta se a relação pai vale para os objetos sebastião e lívia ou, em outras palavras, pergunta se Sebastião é pai de Lívia. Então, dados os fatos estabelecidos no programa, a resposta a essa consulta será yes.

Sintaticamente, fatos e consultas são muito similares. pai(sebastiao, livia)?pai(sebastiao, livia) A diferença é que fatos são agrupados no arquivo que constitui o programa, enquanto consultas são sentenças digitadas no prompt (?-) do interpretador Prolog. Responder uma consulta com relação a um determinado programa corresponde a determinar se a consulta é consequência lógica desse programa, ou seja, se a consulta pode ser deduzida dos fatos expressos no programa.

Outra consulta que poderíamos fazer com relação ao Programa árvore genealógica é:?- pai(adao,enos). Nesse caso, porém, o sistema responderia no. As consultas tornam-se ainda mais interessantes quando empregamos variáveis, ou seja, identificadores para objetos não especificados. Por exemplo:?- pai(x,livia). pergunta quem é o pai de Livia ou, tecnicamente, que valor de X torna a consulta uma consequência lógica do programa. A essa pergunta o sistema responderá X = sebastiao.

Uma consulta com variáveis pode ter mais de uma resposta. Nesse caso, o sistema apresentará a primeira resposta e ficará aguardando até que seja pressionado enter, que termina a consulta, ou ponto-e-vírgula, que faz com que a próxima resposta possível, se houver, seja apresentada.?- pai(adao,x). X = cain ; X = abel ; X = seth ; no (final da consulta)

Variável compartilhada Suponha que desejássemos consultar o Programa árvore genealógica para descobrir quem é o avô de Enos. Nesse caso, como a relação avô não foi diretamente definida nesse programa, teríamos que fazer a seguinte pergunta: Quem é o pai do pai de Enos? Então, como o pai de Enos não é conhecido a priori, a consulta correspondente a essa pergunta tem dois objetivos: primeiro, descobrir quem é o pai de Enos, digamos que seja Y; depois, descobrir quem é o pai de Y.

Variável compartilhada?- pai(y,enos), pai(x,y). Y = seth X = adão yes Para responder essa consulta, primeiro o sistema resolve pai(y,enos), obtendo a resposta Y = seth. Em seguida, substituindo Y por seth no segundo objetivo, o sistema resolve pai(x,seth), obtendo X = adão. Nessa consulta, dizemos que a variável Y é compartilhada pelos objetivos pai(y,enos) e pai(x,y). Variáveis compartilhadas são úteis porque permitem estabelecer restrições entre objetivos distintos.

Variável anônima Uma variável anônima deve ser usada quando seu valor específico for irrelevante numa determinada consulta. Por exemplo, considerando o Programa árvore genealógica, suponha que desejássemos saber quem já procriou, ou seja, quem tem filhos. Então, como o nome dos filhos é uma informação irrelevante, poderíamos digitar:?- pai(x,_). A essa consulta o sistema responderia: X = adão X = seth.

Regras permitem definir novas relações em termos de outras relações já existentes. Por exemplo, a regra avô(x,y) :- pai(x,z), pai(z,y). se e define a relação avô em termos da relação pai, ou seja, estabelece que X é avô de Y se X tem um filho Z que é pai de Y. Com essa regra, podemos agora realizar consultas tais como:?- avo(x,enos). X = adão

Regras são utilizadas para expressar dependência entre um fato e outro fato: criança(x) :- gosta(x,sorvete). criança(x) :- not odeia(x,sorvete). Ou grupo de fatos: avó(x,z) :- (mãe(x,y),mãe(y,z)); mãe(x,y),pai(y,z)).

Fatos e regras são tipos de cláusulas e um conjunto de cláusulas constitui um programa lógico. Como definir a relação irmão em termos da relação pai, já existente? Podemos dizer que duas pessoas distintas são irmãs se ambas têm o mesmo pai. Em Prolog, essa regra é escrita como: irmão(x,y) :- pai(z,x), pai(z,y), X\=Y.

Evidentemente, poderíamos definir a relação simplesmente listando todas as suas instâncias. irmão irmão(cain,abel). irmão(cain,seth). irmão(abel,cain). irmão(abel,seth). irmão(seth,cain). irmão(seth,abel). Entretanto, usar regras, além de muito mais elegante e conciso, também é muito mais consistente. Por exemplo, se o fato pai(adão,eloi) fosse acrescentado ao Programa árvore genealógica, usando a definição por regra, nada mais precisaria ser alterado. Por outro lado, usando a definição por fatos, teríamos que acrescentar ao programa mais seis novas instâncias da relação irmão.

Fatos para uma base de dados Exemplo: um sistema ecológico para especificar cadeia alimentar a come (urso, peixe) come (urso, raposa) come (cavalo, mato) animal (urso) animal (peixe) animal (raposa % predicado binário % predicado unário

Consultas Exemplos:? come (cavalo, mato) Regras Resposta: yes? come (urso, coelho) Resposta: no? come (urso, X) Resposta: peixe coelho Exemplo: um animal é presa se é comido por outro animal. Linguagem simbólica: Prolog: come(y,x) ^ animal(x) -> presa(x) presa(x) :- come(y,x), animal(x)

Regras e Consultas Acrescentando a nova regra à BD podemos fazer novo tipo de consulta come (urso, peixe) come (urso, raposa) % predicado binário come (cavalo, mato) animal (urso) animal (peixe) % predicado unário animal (raposa) presa(x) :- come(y,x), animal(x) % regra?-presa(x) resposta: peixe; raposa

Regras de inferência: resolução As regras e os fatos de um programa Prolog correspondem à fórmulas de 1 a ordem transformada em Cláusulas de Horn. Prolog trata as regras como sendo quantificadas universalmente. A regra de inferência usada pelo interpretador Prolog é a regra da resolução. Como foi obtida a resposta do exemplo anterior?

Regras de inferência: resolução Observe que a regra (Cláusula de Horn) presa(x) :- come(y,x), animal(x) Corresponde a wff (fórmula bem formada) x y(come(y,x) ^ animal(x)) -> presa(x) Corresponde a cláusula ~(come(x,y) ^ animal(x)) v presa(x ~come(x,y) v ~animal(x) v presa(x)

Regras de inferência: resolução Regra da resolução : Duas cláusulas de Horn são resolvidas em uma nova cláusula se uma delas contiver um predicado negado que corresponda a um predicado nãonegado na outra cláusula. A nova cláusula elimina o termo de correspondência e fica disponível para uso em resposta a pergunta. As variáveis são substituídas por constantes associadas de maneira consistente

Regras de inferência: resolução? presa(x) O Prolog procura, na BD, por uma regra com o predicado presa(x) como o consequente Busca outras cláusulas que possam ser resolvidas com a regra Faz as substituições das variáveis na cláusula regra 1. ~come(x,y) v ~animal(x) v presa(x) 2. come(urso,peixe) 3. ~animal(peixe) v presa(peixe) {resolvente de 1 e 2} 4. animal (peixe) 5. presa (peixe) {resolvente de 3 e 4} Refaz o processo procurando na BD outra cláusula a resolver com a cláusula da regra. Encontrará come(urso,peixe)

Regras de inferência: resolução Outro exemplo: acrescentando a BD a regra: x é caçado se é presa equivalente a caçado(x) :- presa(x) Como é feita a consulta que segue?? caçado(x) a regra na forma simbólica é: presa(x) -> caçado(x) a cláusula correspondente é: ~(presa(x) v caçado(x) essa cláusula é resolvida como a regra de definição de presa e seguindo a resolução obtém-se as respostas: peixe raposa

Programação em Prolog Programar em Prolog envolve: Declarar alguns fatos a respeito de objetos e seus relacionamentos. Definir algumas regras sobre os objetos e seus relacionamentos. Fazer perguntas sobre os objetos e seus relacionamentos

Sentenças Prolog Nomes de constantes e predicados iniciam sempre com letra minúscula. O predicado (relação unária, n-ária ou função) é escrito primeiro e os objetos relacionados são escritos depois entre parênteses. Variáveis sempre começam por letra maiúscula. Toda sentença termina com ponto. Exemplo: gosta(maria, jose).

Operadores Lógicos símbolo conectivo Operador lógico :- If (se) implicação, and conjunção ; or disjunção not not negação Operadores relacionais operador X=Y X \= Y X < Y Y > X Y =< X Y >= X significado Igual a Não igual a Menor que Maior que Menor ou igual a Maior ou igual a

Regras Regras são utilizadas para expressar dependência entre fatos: criança(x) :- gosta(x,sorvete). criança(x) :- not odeia(x,sorvete). Ou grupo de fatos: avó(x,z) :- (mãe(x,y),mãe(y,z)); (mãe(x,y),pai(y,z)).

Fatos Os fatos permitem definir os predicados: - Exemplo: um sistema ecológico para especificar a cadeia alimentar come (urso, peixe) come (urso, raposa) come (cavalo, mato) animal (urso) animal (peixe) animal (raposa) % predicado binário % predicado unário

Consultas De posse do programa Prolog (base de dados, podemos fazer consultas. Exemplos:? come (cavalo, mato) Resposta: yes? come (urso, coelho) Resposta: no? come (urso, X) Resposta: peixe raposa

Exemplo de um programa em Prolog come (urso, peixe). come (peixe,peixinho). come (peixinho,alga). come (quati,peixe). come(urso,quati). come (urso, raposa). come(raposa,coelho). come (coelho, mato). come(urso,fruta). come(cavalo,mato). come(gato-selvagem,cavalo). animal(urso). animal(peixe). animal(peixinho). animal(quati). animal(raposa). animal(coelho). animal(cavalo). animal(gato-selvagem). planta(mato). planta(alga). presa(x) :- come(y,x), animal(x).

Consulta ao programa em Prolog Consultas e respostas: cavalo mato? animal(coelho) yes? come(gato-selvagem,mato) no? come(x,peixe) urso quati? come(x,y),planta(y) peixinho alga coelho mato? presa(x) peixe Peixinho quati raposa coelho cavalo

Exercício. 1. Crie uma base de dados com informações de sua família e estabeleça as regras em Prolog que possibilite as seguintes questões: a) Quem são os pais? b) Quem são os avos? (avô, avó) c) Quem são os primos? (primo e prima) d) Quem é cunhado? e) Relação irmãos. f) Relação tios.

Referencias http://www.mat.ufmg.br/~michel/inicmat2010/livros/rosen1.pdf Judith L. Gersting: Fundamentos Matemáticos para a Ciência da Computação, LTC Editora, 3 a edição, 1995. Luiz A. M. Palazzo: Introdução à Programação PROLOG, Editora da Universidade Católica de Pelotas/UCPEL - Pelotas