Resoluo com variveis No caso da resoluo com

  • Slides: 15
Download presentation
Resolução (com variáveis) No caso da resolução com variáveis temos, de uma maneira mais

Resolução (com variáveis) No caso da resolução com variáveis temos, de uma maneira mais formal, considerando as seguintes cláusulas: C 1: A(arg 1) A 1 A 2 … An C 2: B A(arg 2) B 1 … Bm se existir um unificador mais geral para A tal que A(arg 1) = A(arg 2) então estas duas cláusulas podem ser premissas do passo de resolução, em que o resolvente é: C 3: (B A 1 A 2 … An B 1 … Bm) Universidade da Madeira Departamento de Matemática Elsa Carvalho 203 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)

Resolução (com variáveis) C 1: C 2: gosta(ana, X) gosta(X, logica) gosta(luis, Y) divertido(Y)

Resolução (com variáveis) C 1: C 2: gosta(ana, X) gosta(X, logica) gosta(luis, Y) divertido(Y) = {X/luis, Y/logica} Assim obtemos o resolvente C 3: Universidade da Madeira Departamento de Matemática Elsa Carvalho gosta(ana, luis) divertido(logica) 204 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)

Resolução (com variáveis) O motivo pelo qual temos de utilizar o unificador mais geral

Resolução (com variáveis) O motivo pelo qual temos de utilizar o unificador mais geral é para manter a propriedade de completude da refutação (‘refutation-complete’), quando são impostos critérios de selecção para as premissas dos passos da mesma. Ou seja, termos a garantia de que conseguimos inferir a cláusula vazia para qualquer conjunto que seja inconsistente. Mais adiante estudaremos esses critérios que são utilizados para tornar mais eficiente a resolução. Universidade da Madeira Departamento de Matemática Elsa Carvalho 205 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)

Resolução (com variáveis) Por exemplo sabemos que o conjunto de cláusulas C 1: C

Resolução (com variáveis) Por exemplo sabemos que o conjunto de cláusulas C 1: C 2: C 3: p(X) p(Y) q(Y) q(a) é inconsistente, logo, pela propriedade de completude da refutação (‘refutation-complete’), teremos de conseguir derivar a cláusula vazia. Universidade da Madeira Departamento de Matemática Elsa Carvalho 206 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)

Resolução (com variáveis) Em princípio é possível construir um sistema de prova de teoremas

Resolução (com variáveis) Em princípio é possível construir um sistema de prova de teoremas que investigue todas as possibilidades de ‘resolver’ as cláusulas de forma a obter. No entanto tal sistema seria muito ineficiente. Assim, esses sistemas têm critérios de selecção para escolher as premissas e literais de cada passo da refutação. Neste caso teríamos a árvore C 1 C 2 {X/Y} R 1: q(Y) C 3 {Y/a} R 2: Universidade da Madeira Departamento de Matemática Elsa Carvalho 207 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)

Resolução (com variáveis) Se tivéssemos decidido utilizar outro unificador menos geral no primeiro passo

Resolução (com variáveis) Se tivéssemos decidido utilizar outro unificador menos geral no primeiro passo da refutação, por exemplo {X/b, Y/b}, não conseguiríamos obter a cláusula vazia. . . e perderíamos a propriedade de completude da refutação. Universidade da Madeira Departamento de Matemática Elsa Carvalho 208 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)

Programação em Lógica e Resolução Dado um programa P, uma interrogação tem a forma

Programação em Lógica e Resolução Dado um programa P, uma interrogação tem a forma ? A 1 . . . An que é lida em lógica como (A 1 . . . An) Para responder à interrogação usando o programa P, aplica-se resolução para testar se e assim P { (A 1 . . . An)}├ P╞ (A 1 . . . An) A resolução é um mecanismo construtivo em que são retornados os valores para as variáveis presentes na interrogação. Estes valores são gerados pelo processo de unificação. Universidade da Madeira Departamento de Matemática Elsa Carvalho 209 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)

Exemplo C 1: append([ ], W, W) C 2: append([U|X], Y, [U|Z]) append(X, Y,

Exemplo C 1: append([ ], W, W) C 2: append([U|X], Y, [U|Z]) append(X, Y, Z) Interrogação (query) inicial Q 1: ? append([V|L], R, [V, a]) Q 1 só pode ser resolvido com a cláusula de programa C 2, usando o unificador mais geral = {U 1/V, X 1/L, Y 1/R, Z 1/[a]} onde as novas variáveis são resultado de uma mudança de variáveis (ou renomeação) das variáveis originais de C 2. Universidade da Madeira Departamento de Matemática Elsa Carvalho 210 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)

Programação em Lógica e Resolução Quando se vai utilizar uma cláusula de programa como

Programação em Lógica e Resolução Quando se vai utilizar uma cláusula de programa como premissa de um passo da resolução é primeiro aplicada uma mudança de variáveis à cláusula. Motivos Evitar a confusão quando usos repetidos da mesma cláusula resultassem em substituições distintas para as suas variáveis. as premissas de algum passo de resolução tivessem variáveis em comum. Universidade da Madeira Departamento de Matemática Elsa Carvalho 211 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)

Exemplo (cont. ) Os restantes passos podem ser resumidos no grafo seguinte: Q 1

Exemplo (cont. ) Os restantes passos podem ser resumidos no grafo seguinte: Q 1 C 2 Q 2 C 2 Q 3: ? append(X 2, L 2, []) Universidade da Madeira Departamento de Matemática Elsa Carvalho 212 C 1 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)

Exemplo (cont. ) Uma forma mais compacta de representar a execução de Q 1

Exemplo (cont. ) Uma forma mais compacta de representar a execução de Q 1 é através de uma árvore de resolução (a que vamos chamar árvore SLD ou de pesquisa). Aqui apenas aparecem os resolventes e os u. m. g. . append([V|L], R, [V, a]) 1= {U 1/V, X 1/L, Y 1/R, Z 1/[a] } append(L, R, [a]) 2= {L/[], R/[a], W 1/[a] } 3= {Y 2/R, U 2/a, Z 2/[], L/[a|X 2]} append(X 2, R, [ ]) 4= {X 2/[], R/[], W 2/[] } Universidade da Madeira Departamento de Matemática Elsa Carvalho 213 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)

Programação em Lógica e Resolução Uma computação pode ser vista como um ramo da

Programação em Lógica e Resolução Uma computação pode ser vista como um ramo da árvore. O ramo pode terminar com: sucesso(representado por ) insucesso finito (representado por ) insucesso infinito (representado por ∞ ) A resposta derivada é um subconjunto relevante da composição dos unificadores mais gerais utilizados durante os passos de resolução dessa computação. Isto é, é um subconjunto de * = 1° 2 °. . . n Universidade da Madeira Departamento de Matemática Elsa Carvalho 214 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)

Programação em Lógica e Resolução Neste exemplo temos duas computações e como tal *

Programação em Lógica e Resolução Neste exemplo temos duas computações e como tal * = 1° 2 (ramo da esquerda) * = 1° 3 ° 4 (ramo da direita) e no entanto utilizamos apenas o subconjunto relevante de * - - que contribui para os valores finais das variáveis da interrogação inicial. No caso deste exemplo as variáveis são V, L e R e por isso, se considerarmos o ramo da esquerda, o subconjunto de 1° 2 = {U 1/V, X 1/[], Y 1/[a], Z 1/[a], L/[], R/[a] } que nos interessa é = {L/[], R/[a]} (resposta derivada para o ramo esquerdo). Como foi dito atrás temos que P╞ ((append([V|L], R, [V, a]) ) e aplicando a substituição P╞ ( V)append([V], [a], [V, a]) Universidade da Madeira Departamento de Matemática Elsa Carvalho 215 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)

Programação em Lógica e Resolução Temos ainda outra resposta derivada, uma vez que também

Programação em Lógica e Resolução Temos ainda outra resposta derivada, uma vez que também chegámos à cláusula vazia através do ramo direito. Ao considerarmos o ramo da direita, o subconjunto de 1° 3 ° 4 = {U 1/V, X 1/[a], Y 1/[], Z 1/[a], Y 2/[], U 2/a, Z 2/[], L/[a], X 2/[], R/[], W 2/[] } que nos interessa é = {L/[a], R/[]} (resposta derivada para o ramo direito). E assim temos P╞ ((append([V|L], R, [V, a]) ) e aplicando a substituição P╞ ( V)append([V, a], [V, a]) Universidade da Madeira Departamento de Matemática Elsa Carvalho 216 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)

Programação em Lógica e Resolução Em geral (A 1 . . . An) pode

Programação em Lógica e Resolução Em geral (A 1 . . . An) pode não ser chã, como no exemplo anterior. Nesse caso a resposta mais geral é o fecho universal da fórmula que também é implicada por P. Assim, a nossa resposta final seria ( V)append([V, a], [V, a]), que representa toda a classe de tuplos na relação de ‘append’ que são a solução para a interrogação inicial. Desenhe a árvore de pesquisa para a interrogação ? append ([a, X], [Y], Z) Universidade da Madeira Departamento de Matemática Elsa Carvalho 217 Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05)