programação lógica prolog -...

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

Upload: dinhthien

Post on 14-Apr-2018

223 views

Category:

Documents


3 download

TRANSCRIPT

Programação Lógica

Programação Lógica

PROLOG

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.