Linguagens de programação lógica

46
Equipe: André Pitombeira Fernando Helton Francisco Humberto Niltemberg Carvalho Rainara Maia

Transcript of Linguagens de programação lógica

Page 1: Linguagens de programação lógica

Equipe: André Pitombeira

Fernando Helton

Francisco Humberto

Niltemberg Carvalho

Rainara Maia

Page 2: Linguagens de programação lógica

• Expressar programas na forma de lógica simbólica e usar processo de inferência lógica para produzir resultados.

• Os programas lógicos são declarativos, não são baseados em procedimentos.

• A sintaxe das linguagens de programação lógica é diferente da sintaxe das linguagens imperativas e das funcionais.

• A semântica, por sua vez, tem pouca semelhança com a dos programas em linguagem imperativa.

Page 3: Linguagens de programação lógica

• Antes de discutir a programação lógica, precisamos investigar sua base: a lógica formal.

• Uma proposição é uma declaração que pode ou não ser verdadeira. A lógica formal foi desenvolvida para fornecer um método de descrever proposições, com o objetivo de permitir que estas sejam verificadas quanto a sua validade.

• A lógica simbólica pode ser usada para três necessidades básicas da lógica formal: expressar as proposições, as relações entre estas e descrever como novas proposições podem ser inferidas de outras que se presumem verdadeiras.

Page 4: Linguagens de programação lógica

• Existe uma estreita relação entre a lógica formal e a matemática, os axiomas da teoria dos números e dos conjuntos são o conjunto inicial de proposições presumidas como verdadeiras.

• A forma particular de lógica simbólica usada para programação lógica é o cálculo de predicados.

Page 5: Linguagens de programação lógica

• ProposiçõesConsiste em objetos e nas relações de objetos entre si, esses objetos são representados por termos simples, constantes ou variáveis. Uma constante é um símbolo que representa um objeto. Uma variável é um símbolo que pode representar diferentes objetos. As proposições mais simples, chamadas proposições atômicas, consistem em termos compostos, que é formado por duas partes: um functor, o símbolo de função que nomeia a relação e uma lista ordenada de parâmetros. Por exemplo:

homem(jake)gosta(bob, bife)

Page 6: Linguagens de programação lógica

• ProposiçõesAs proposições compostas têm duas ou mais proposições atômicas, ligadas por conectores lógicos ou operadores:

Nome Símbolo Exemplo Significado

Negação ¬ ¬a Não a

Conjunção ∩ a∩b a e b

Disjunção U aUb a ou b

Equivalência ≡ a b≡ a é equivalente a b

Implicação ⊃ a b ⊃ a implica b

Page 7: Linguagens de programação lógica

• Variáveis podem aparecer em proposições, mas somente quando introduzidas por quantificadores. O cálculo de predicados inclui dois quantificadores:

• Exemplo: X. (mulher(x)) ∀ ⊃ humano(x))• ∃ X.(mãe(mary, X) ∩ homem(X))

Nome Exemplo Significado

Universal ∀ XP Para todo X, P é verdadeiro

Existencial ∃ X.P Existe um valor de X tal que P seja verdadeiro

Page 8: Linguagens de programação lógica

• Forma Clausal• Um problema é que há muitas maneiras diferentes de

declarar proposições com o mesmo significado, ou seja, há muita redudância. Para simplificar as coisas uma forma padrão de proposições é desejável. A clausal, uma forma relativamente simples de proposições, é uma dessas formas. Uma proposição nessa forma tem a seguinte sintaxe:

B1 U B2 U … U Bn C A2 ∩ A2 ∩ … ∩ Na

onde A e B são termos, o significado é se todos os As forem verdadeiros, pelo menos um B será verdadeiro.

Page 9: Linguagens de programação lógica

• O lado direito de uma proposição na forma clausal é chamado antecedente. O esquerdo, consequente; isso porque é a consequência da verdade de seu antecedente. Exemplo:

pai(louis, beto) U pai(louis, nara) C pai(beto, bob) ∩ mãe (nara, bob) ∩ avô(louis, bob)

Page 10: Linguagens de programação lógica

É um método para expressar coleções de proposições.

Estas coleções são usadas para determinar se fatos interessantes ou úteis podem ser inferidos a partir da mesma.

Page 11: Linguagens de programação lógica

• Resolução é uma regra de inferência que permite a computação das proposições inferidas a partir das proposições dadas.

• Este método é muito utilizado na demonstração de teoremas.

Page 12: Linguagens de programação lógica

Suponhamos duas proposições:P1 c P2Q1 c Q2

Page 13: Linguagens de programação lógica

Se P1 é igual a Q2, poderíamos reescrever substituindo P1 e Q2 por T:

T c P2

Q1 c T

Page 14: Linguagens de programação lógica

Tendo que:T c P2Q1 c T

Poderíamos dizer que:Q1 c P2

Page 15: Linguagens de programação lógica

• Este processo de a partir das proposições dadas:

• P1 c P2• Q1 c Q2

• Inferir que:• Q1 c P2

• É chamado resolução.

Page 16: Linguagens de programação lógica

• Outro exemplo, a partir de:

mais velho(Joane, Jake) c mãe(Joane, Jake)

mais sábio(Joane, Jake) c mais velho(Joane, Jake)

• Inferirmos que:

mais sábio(Joane, Jake) c mãe(Joane, Jake)

Page 17: Linguagens de programação lógica

• A mecânica dessa construção de resolução é simples: os termos que aparecem do lado esquerdo são unidos por um E para formar o lado esquerdo da nova proposição. Então, a mesma coisa é feita para obter o lado direito dela. Em seguida, o termo que aparece em ambos os lados é removido.

Page 18: Linguagens de programação lógica

Porém a resolução é mais complexa do que os exemplos mostram. Em particular, a presença de variáveis em proposições exige que a resolução encontre valores para essas variáveis permitindo que o processo de comparação seja bem-sucedido. Este processo de determinação dos valores é chamado de unif icação. A atribuição temporária de valores a variáveis para permitir a unificação é chamada instanciação.

Page 19: Linguagens de programação lógica

Uma propriedade importante da resolução é a capacidade de detectar qualquer inconsistência em um conjunto de proposições. Essa propriedade permite que a resolução seja usada para demostrar teoremas. Esta prova é feita por contradição, as proposições originais são chamadas de hipóteses, e a negação do teorema é chamada de meta.

Page 20: Linguagens de programação lógica

• Um problema do processo de resolução é o tempo necessário para tal. O tempo necessário para encontrar uma inconsistência pode ser enorme.

Page 21: Linguagens de programação lógica

• A demonstração de teoremas é a base da programação lógica. Grande parte do que é computado pode ser expresso na forma de uma lista de fatos dados e de relações como hipóteses, e uma meta a ser inferida a partir das hipóteses, usando resolução.

Page 22: Linguagens de programação lógica

• As cláusulas de Horn, simplificam ainda mais o processo de resolução. Elas podem estar somente em duas formas: com uma única proposição atômica no lado esquerdo, ou com o lado esquerdo vazio.

Page 23: Linguagens de programação lógica

• O lado esquerdo de uma fórmula clausal pode ser chamado de cabeça, e as cláusulas de Horn que possuem lado esquerdo pode ser chamada de cláusula de Horn encabeçada.

gosta(bob, truta) c gosta(bob, peixe) ^ peixe(truta)

• As cláusulas de Horn com o lado esquerdo vazio são ditas sem-cabeça.

pai(bob, Jake)

Page 24: Linguagens de programação lógica

• Termos;• Instruções Relativas a Fatos;• Instruções Relativas a Regras;• Instruções Relativas a Metas;• Processo de Inferência do Prolog;• Aritmética Simples;• Estruturas de Listas.

Page 25: Linguagens de programação lógica

• Como em outra linguagens de Programação o Prolog consiste em um conjunto de instruções , que podem ser em alguns casos muito complexas. Todas são construídas a partir de termos.

• Termo: Em Prolog é uma constante, uma variável ou uma estrutura.

• Constante: É um átomo ou um número inteiro.• Átomo: É uma cadeia de letras, de dígitos e de grifos que

se inicia com uma letra minúscula ou uma cadeia de quaisquer caracteres ASCII imprimíveis delimitados por apóstrofos.

Page 26: Linguagens de programação lógica

• Variável: É qualquer cadeia de letras, de dígitos e de grifos que se inicia com uma letra maiúscula. As variáveis não são vinculadas a tipos por declarações, são por instanciação, que ocorre somente no processo de resolução. As instanciações duram somente o tempo necessário para a prova ou refutação de uma proposição.

• Estrutura: Representam as proposições atômicas do cálculo de predicados, e sua forma geral é a mesma: functor(lista de parâmetros).

Page 27: Linguagens de programação lógica

• O Prolog tem duas formas de instrução básicas que correspondem as Cláusulas de Horn sem e com cabeça de cálculo de predicados.

• A forma mais simples de cláusulas de Horn sem cabeça no Prolog é uma estrutura simples, interpretada como uma asserção incondicional ou como um fato.

• Logicamente, fatos são simplesmente proposições consideradas verdadeiras.

Page 28: Linguagens de programação lógica

• Exemplo:mulher(rainara).

homem(fernando).mulher(adriana).homem(andre).

pai(fernando, andre).pai(fernando, rainara).mae(adriana, andre).

mae(adriana, rainara).

Page 29: Linguagens de programação lógica

• A outra forma básica de instrução Prolog para construir o banco de dados é a cláusula de Horn com cabeça. Forma relacionada a um teorema da matemática conhecido, a partir do qual se pode tirar uma conclusão sobre se o conjunto de determinadas condições é satisfeito. O lado direito é o antecedente, ou a parte se (if), e o lado esquerdo é o conseqüente, ou a parte então (then).

• Conjunções: Contém termos múltiplos separados por operações AND lógica, que é implícita. A vírgula pode ser considerada o AND:

mulher(rainara), f i lho (rainara).

Page 30: Linguagens de programação lógica

• Forma geral de construção de cláusula de Horn com cabeça:• Conseqüência_1 :- expressão_antecedente

• Leia-se: a “ conseqüência_1 poderá ser concluída se a expressão antecedente for verdadeira ou puder torna-se verdadeira por meio de alguma instanciação de suas variáveis”.

• antepassado(adriana, rainara) :- mãe(adriana, rainara).

• Obs: As cláusula de Horn são chamadas regras porque declaram regras de implicação entre proposições.

Page 31: Linguagens de programação lógica

• Utilizadas para provar Teoremas, que queremos que o sistema prove ou desaprove. Essas proposições são chamadas metas ou consultas. A sintaxe é idêntica as cláusulas de Horn sem cabeça.

homem(fred).

• O sistema poderá responder com yes ou no.

pai (x, mike).

• O sistema tentará, pela unificação, encontrar uma instanciação de x que resulta em um valor verdadeiro para a meta.

Page 32: Linguagens de programação lógica

• As consultas são chamadas metas. Quando uma meta é uma proposição composta, cada um dos fatos (estruturas) é chamado submeta. Para provar que ela é verdadeira, o processo de inferência deve encontrar um encadeamento de regras de inferência e/ou de fatos no banco de dados que ligam a meta a um ou mais fatos no banco de dados.

• O processo de provar uma submeta é feito por um processo de comparação de proposições, às vezes é chamado de casamento.

Page 33: Linguagens de programação lógica

• Encadeamento Progressivo: Inicia com a meta e tenta encontra uma seqüência de proposições coincidentes que levam a algum conjunto de fatos originais no banco de dados.

• Encadeamento Retrogrado: Funciona bem quando há um conjunto razoavelmente pequeno de respostas candidatas. As implementações em Prolog usam o encadeamento retrogrado para resolução de problemas, porque seus projetistas achavam que ele era melhor para uma classe maior de problemas.

• Primeiramente pela profundidade: Localiza uma seqüência completa de proposições – uma prova – referente à primeira submeta antes de trabalhar nas outras.

• Primeiramente pela largura: Trabalha em todas as submetas de determina meta de maneira paralela.

• Backtracking: Uma nova solução é encontrada ao iniciar a procura onde a busca anterior dessa submeta interrompeu-se.

Page 34: Linguagens de programação lógica

• O Prolog suporta variáveis de números inteiros e seus respectivos cálculos.

+(7, x)

• O Prolog permite uma sintaxe mais abreviada para cálculos aritméticos com o operador is. Este toma uma expressão aritmética como seu operando direito e variável como seu operando esquerdo.

A is B / 17 + C.

Page 35: Linguagens de programação lógica

• Exemplo simples do uso de computações numéricas em Prolog:• Suponhamos conhecer as velocidades médias de diversos automóveis em

uma pista de corrida particular e a quantidade de tempo que eles permanecem na pista. Essa informação básica pode ser codificada como fatos, e a relação entre velocidade, tempo e distancia pode ser escrita como uma regra.

• velocidade(ford, 100).• velocidade(chevy, 105).• velocidade(dodge, 95).• velocidade(volvo, 80).• tempo(ford, 20).• tempo(chevy, 21).• tempo(dodge, 24).• tempo(volvo, 24).• Distancia(x, y) :- velocidade(x, Velocidade), tempo(x, Tempo), y is Velocidade * tempo.

• Consulta: distancia(chevy, Distancia_do_Chevy).

Page 36: Linguagens de programação lógica

• Estrutura de dados básica é a lista. Elas são sequências de qualquer numero de elementos, em que estes podem ser átomos ou quaisquer outros termos, inclusive outras listas. O Prolog usa uma sintaxe convencional para especificar listas. Os elementos delas são separados por vírgulas, e a lista inteira é delimitada por colchetes, como em:

[maçã, ameixa seca, uvas, kumquat]

Uma lista pode ser criada como uma estrutura simples, como em:

nova_lista([maçã, ameixa seca, uvas, kumquat]) .

Page 37: Linguagens de programação lógica

• Algumas operações são necessárias para lidar com lista. Um exemplo é a operação append. Os dois parâmetros para a operação append no código são as duas listas a serem anexadas e o terceiro parâmetro é a lista resultante:

append([Cabeça|Lista_1], Lista_2, [Cabeça, Lista_3]) append(Lista_1, Lista_2, Lista_3).

• A função append cria uma nova lista na terceira lista passada como parâmetro, concatenando as duas primeiras listas passadas como parâmetros.

Page 38: Linguagens de programação lógica

38

• Controle de Ordem de ResoluçãoDependendo do problema, a intervenção do programador é muito importante para o programa ficar mais eficiente devido ao modo de inferência.

A ordem como as cláusulas são escritas podem levar a laços infinitos.

Ex: f(X, Y) : - f(Z, Y), g(X, Z).

/* Semelhante ao problema que um analisador

descendente recursivo tem com regras gramaticais

recursivas à esquerda */

Page 39: Linguagens de programação lógica

39

• Controle de Ordem de ResoluçãoUso do comando cut, especificado por ‘!’ para limitar o backtracking, em prol da eficiência

Ex1.: a, b, ! , c, d. /* Se a e b forem ‘ true ’ e c falhar, então a

meta inteira falhará */

Ex2.: membro(Elemento, [Elemento | _ ] ) : - ! .membro(Elemento, [ _ | Lista]) : -

membro(Elemento, Lista).

% ‘_’ indica variável livre ou anônima

Page 40: Linguagens de programação lógica

40

• Pressuposição de Mundo FechadoO Prolog é na verdade um sistema true / fail e não um sistema true / falsePois, quando não consegue provar que uma meta é verdadeira ele pressupõe que a meta deve ser falsa.

Page 41: Linguagens de programação lógica

• O Problema da NegaçãoAs cláusulas de Horn evitam conclusões negativas

B ← A1 ∧ A2 ∧ . . . ∧ An

Se todas as proposições A forem verdadeiras, B também é, porém independente da verocidade ou

falsidade de qualquer um ou de todos os As, não se pode concluir que B é falso.

Page 42: Linguagens de programação lógica

42

• Limitações Intrínsecas

Ineficiente para resolução de problemas de características iterativas ou procedimentais

Page 43: Linguagens de programação lógica

43

• Sistemas de Gerenciamento de Banco de Dados RelacionaisPrincipal vantagem: Capacidade Dedutiva

• Sistemas EspecialistasDiminuir incosistencias e falta de completude

• Processamento de Linguagem Natural• Educação

Em particular crianças até 07 anos de idadeÉ mais fácil ensina-lás do que um programador

experiente em linguagem imperativa

Page 44: Linguagens de programação lógica

44

Demonstração prática das seguintes aplicações:

• Problema da Torre de Hanói• Problema das Rainhas• APES (Sistema Especialista para construção

de outros sistemas especialistas)• Uso do Delphi 5.0 com Visual Prolog 5.2

Page 45: Linguagens de programação lógica

45

• Programas em Prolog são conjuntos de instruções basicamente escritos em forma de Cláusulas de Horn

• Paradigma Declarativo• Baseado na Lógica Formal

Menos erros e menos manutenção• Programas Concisos

Tempo de desenvolvimento reduzidoBoa ferramenta para prototipação

• Forma alternativa para solução de problemas

Page 46: Linguagens de programação lógica