Este documento discute o processo de unificação em Prolog. Em três frases:
A unificação é o algoritmo interno de Prolog para casamento de padrões. Ele liga variáveis a termos para igualar estruturas, falhando se não houver valores possíveis. Variáveis ligadas por unificação mantêm seus relacionamentos mesmo quando novas ligações ocorrem posteriormente.
3. 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
4. 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
5. 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
6. 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
7. 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
8. 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
9. 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 = cozinha
Y = maçã
10. 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)
11. Aventura em Prolog 11
Unificação entre Variáveis
Exemplos:
?- X = Y.
X = _01
Y = _01
?- local(X, cozinha) = local(Y, cozinha).
X = _01
Y = _01
12. 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 = hello
Y = hello
?- X = Y, a(Z) = a(Y), X = hello.
X = hello
Y = hello
Z = hello
13. 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ócolis
X = 3 X = brócolis
Y = 3 Y = brócolis
14. 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
15. 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ócolis
Y = maçã
Z = alimento(brócolis, maçã)
16. 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
17. 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
18. 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))).