Aula de Prolog 08 - Unificação

19
Prolog – 08 Fábio M. Pereira Baseado em Amzi! inc. – www.amzi.com

Transcript of Aula de Prolog 08 - Unificação

Page 1: Aula de Prolog 08 - Unificação

Prolog – 08

Fábio M. Pereira

Baseado emAmzi! inc. – www.amzi.com

Page 2: Aula de Prolog 08 - Unificação

Aventura em Prolog 2

Aventura em Prolog Unificação Exercícios

Page 3: Aula de Prolog 08 - Unificação

Aventura em Prolog 3

Unificação Uma das características mais poderosas

de Prolog Unificação é o algoritmo interno de

Prolog para casamento de padrões Para todos os exemplos que vimos até

aqui, a unificação foi relativamente simples Iremos agora examinar a unificação com

mais detalhes

Page 4: Aula de Prolog 08 - Unificação

Aventura em Prolog 4

O Processo de Unificação

Variável&Qualquer termo

A variável irá unificar com e ligar (binding) a qualquer termo, incluindo outra variável.

Primitivo&Primitivo

Dois termos primitivos (átomos ou inteiros) unificam somente se eles forem idênticos

Estrutura&Estrutura

Duas estruturas unificam se elas possuem o mesmo funtor e aridade e se cada par de argumentos correspondentes unificam

Page 5: Aula de Prolog 08 - Unificação

Aventura em Prolog 5

Predicado Interno =/2 Utilizado para verificar unificação:

É bem sucedido quando os dois argumentos unificam

Falha se eles não unificam Sintaxe: arg1 = arg2 ou =(arg1, arg2)

Aviso: O sinal de igualdade (=) não causa

atribuição como na maioria das linguagens, também não causa avaliação aritmética

Ele causa unificação em Prolog

Page 6: Aula de Prolog 08 - Unificação

Aventura em Prolog 6

Predicado Interno =/2 A unificação entre os dois lados do sinal

de igualdade (=) é exatamente a mesma unificação que ocorre quando Prolog tenta casar objetivos com as cabeças das cláusulas

No backtracking, as ligações de variáveis são desfeitas, da mesma maneira quando Prolog faz backtracking através de cláusulas

Page 7: Aula de Prolog 08 - Unificação

Aventura em Prolog 7

Forma mais simples de Unificação Entre duas estruturas sem variáveis

Se elas forem idênticas, a unificação é bem sucedida, se não, a unificação falha

?- a = a. ?- a = b.Yes No?- local(maçã, cozinha) = ?- local(maçã, cozinha) = local(maçã, cozinha). local(pêra, cozinha).Yes No?- a(b, c(d, e(f,g))) = ?- a(b, c(d, e(f,g))) = a(b, c(d, e(f,g))). a(b, c(d, e(g,f))).Yes No

Page 8: Aula de Prolog 08 - Unificação

Aventura em Prolog 8

Unificação entre Variável e Primitivo Outra forma simples de unificação

A variável assume o valor que faz com que a unificação seja bem sucedida

?- X = a. ?- 4 = Y.X = a Y = 4

?- local(maçã, cozinha) = local(maçã, X).X = cozinha

Page 9: Aula de Prolog 08 - Unificação

Aventura em Prolog 9

Unificação entre Variável e Primitivo Em outros casos, múltiplas variáveis são

simultaneamente atribuídas a valores?- local(X,Y) = local(maçã, cozinha).X = maçãY = cozinha

?- local(maçã, X) = local(Y, cozinha).X = cozinhaY = maçã

Page 10: Aula de Prolog 08 - Unificação

Aventura em Prolog 10

Unificação entre Variáveis Uma variável também pode unificar com outra Cada instância de uma variável possui um

único valor interno em Prolog Quando duas variáveis unificam entre si,

Prolog anota que elas devem possuir o mesmo valor

Nos exemplos a seguir, assumimos que Prolog usa ‘_nn’, onde ‘n’ é um dígito, para representar variáveis não ligadas (unbound)

Page 11: Aula de Prolog 08 - Unificação

Aventura em Prolog 11

Unificação entre Variáveis Exemplos:

?- X = Y.X = _01Y = _01

?- local(X, cozinha) = local(Y, cozinha).X = _01Y = _01

Page 12: Aula de Prolog 08 - Unificação

Aventura em Prolog 12

Unificação entre Variáveis Variáveis Prolog são ligadas entre si, o

que irá se refletir se ocorrer ligação tardia (later bound)?- X = Y, Y = hello.X = helloY = hello

?- X = Y, a(Z) = a(Y), X = hello.X = helloY = helloZ = hello

Page 13: Aula de Prolog 08 - Unificação

Aventura em Prolog 13

Unificação entre Variáveis Ilustra a principal diferença entre

unificação com variáveis Prolog e atribuição de variáveis encontrada na maioria das outras linguagens Observe cuidadosamente o comportamento

das consultas seguintes?- X = Y, Y = 3, ?- X = Y, gosto_ruim(X), write(X). write(Y).3 brócolisX = 3 X = brócolisY = 3 Y = brócolis

Page 14: Aula de Prolog 08 - Unificação

Aventura em Prolog 14

Unificação entre Estruturas Quando duas estruturas com variáveis

unificam, as variáveis tomam os valores que tornam as duas estruturas idênticas

Note que uma estrutura ligada a uma variável pode ela mesma conter variáveis?- X = a(b,c). ?- a(b,X) = a(b, c(d,e)).X = a(b,c) X = c(d,e)?- a(b,X) = a(b, c(Y,e)).X = c(_01, e)Y = _01

Page 15: Aula de Prolog 08 - Unificação

Aventura em Prolog 15

Unificação entre Estruturas Mesmo em exemplos mais complexos, os

relacionamentos entre variáveis são lembrados e atualizados assim que uma nova ligação à variável ocorrer?- a(b,X) = a(b, c(Y,e)), Y=hello.X = c(hello, e)Y = hello?- alimento(X,Y) = Z, write(Z), nl, gosto_ruim(X), comestivel(Y), write(Z).alimento(_01, _02)alimento(brócolis, maçã)X = brócolisY = maçãZ = alimento(brócolis, maçã)

Page 16: Aula de Prolog 08 - Unificação

Aventura em Prolog 16

Unificação entre Estruturas Se um novo valor é atribuído a uma

variável em uma ligação tardia, em conflito com um padrão estabelecido anteriormente, o objetivo falha?- a(b,X) = a(b, c(Y,e)), X = hello.No

?- a(b,X) = a(b, c(Y,e)), X = c(hello, e).X = c(hello, e)Y = hello

Page 17: Aula de Prolog 08 - Unificação

Aventura em Prolog 17

Unificação entre Estruturas Se não existir valores possíveis para a

variável, a unificação falha?- a(X) = a(b,c). ?- a(b,c,d) = a(X,X,d).No No?- a(c,X,X) = a(Y,Y,b).No

A variável anônima (_) não se liga a nenhum valor Múltiplas ocorrências dela não indicam valores

iguais?- a(c,X,X) = a(_,_,b).X = b

Page 18: Aula de Prolog 08 - Unificação

Aventura em Prolog 18

Exercícios Qual o resultado dessas consultas de

unificação??- a(b,c) = a(X,Y).

?- a(X, c(d,X)) = a(2, c(d,Y)).

?- a(X,Y) = a( b (c,Y), Z).

?- tree(left, root, Right) = tree(left, root, tree(a, b, tree(c, d, e))).

Page 19: Aula de Prolog 08 - Unificação

Aventura em Prolog 19

O que vem a seguir?

Listas Operadores ...