Programação Lógica
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
Programação Lógica
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;
Programação Lógica
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.
Programação Lógica
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.
Programação Lógica
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
Programação Lógica
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.
Programação Lógica
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”
Programação Lógica
Fatos servem para estabelecer um relacionamento existente entre objetos de um determinado contexto de discurso.
Por exemplo, num contexto familiar,
pai(sebastião,livia)
é 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”.
Predicado ou relação Argumento do predicado
Programação Lógica
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).
Programação Lógica
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 .”
Programação Lógica
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.
Programação Lógica
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.
Programação Lógica
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)
Programação Lógica
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.
Programação Lógica
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.
Programação Lógica
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.
Programação Lógica
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).
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
se e
Programação Lógica
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)).
Programação Lógica
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.
Programação Lógica
Evidentemente, poderíamos definir a relação irmão simplesmente listando todas as suas instâncias.
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.
Programação Lógica
Fatos para uma base de dados
Exemplo: um sistema ecológico para especificar a cadeia alimentar
come (urso, peixe)
come (urso, raposa) % predicado binário
come (cavalo, mato)
animal (urso)
animal (peixe) % predicado unário
animal (raposa
Programação Lógica
Consultas
Exemplos:
? come (cavalo, mato)
Resposta: yes
? come (urso, coelho)
Resposta: no
? come (urso, X)
Resposta: peixe
coelho
Regras
Exemplo: “um animal é presa se é comido por outro animal”.
Linguagem simbólica: come(Y,X) ^ animal(X) -> presa(X)
Prolog: presa(X) :- come(Y,X), animal(X)
Programação Lógica
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
Programação Lógica
Regras de inferência: resolução
As regras e os fatos de um programa Prolog correspondem à fórmulas de 1a 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?
Programação Lógica
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)
xy(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)
Programação Lógica
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ão-negado 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
Programação Lógica
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)
Programação Lógica
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 Lógica
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
Programação Lógica
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).
Programação Lógica
Operadores Lógicos
Operadores relacionais
símbolo conectivo Operador lógico
:- If (se) implicação
, and conjunção
; or disjunção
not not negação
operador significado
X=Y Igual a
X \= Y Não igual a
X < Y Menor que
Y > X Maior que
Y =< X Menor ou igual a
Y >= X Maior ou igual a
Programação Lógica
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)).
Programação Lógica
Fatos
Os fatos permitem definir os predicados:
- Exemplo: um sistema ecológico para especificar a cadeia alimentar
come (urso, peixe)
come (urso, raposa) % predicado binário
come (cavalo, mato)
animal (urso)
animal (peixe) % predicado unário
animal (raposa)
Programação Lógica
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
Programação Lógica
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) .
Programação Lógica
Consultas e respostas: ? animal(coelho) yes
? come(gato-selvagem,mato) no
? come(X,peixe) urso quati
? come(X,Y),planta(Y) peixinho alga coelho mato
cavalo mato
? presa(X) peixe Peixinho quati raposa coelho cavalo
Consulta ao programa em Prolog
Programação Lógica
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.
Programação Lógica
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, 3a edição,
1995.
Luiz A. M. Palazzo: Introdução à Programação
PROLOG, Editora da Universidade Católica de
Pelotas/UCPEL - Pelotas