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