Aula de Prolog 08 - Unificação
-
Upload
fabio-moura-pereira -
Category
Technology
-
view
444 -
download
7
Transcript of Aula de Prolog 08 - Unificação
Prolog – 08
Fábio M. Pereira
Baseado emAmzi! inc. – www.amzi.com
Aventura em Prolog 2
Aventura em Prolog Unificação Exercícios
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
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
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
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
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
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
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çã
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)
Aventura em Prolog 11
Unificação entre Variáveis Exemplos:
?- X = Y.X = _01Y = _01
?- local(X, cozinha) = local(Y, cozinha).X = _01Y = _01
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
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
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
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çã)
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
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
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))).
Aventura em Prolog 19
O que vem a seguir?
Listas Operadores ...