Unificação

Objetivo

Encontrar uma substituição que torne duas expressões compatíveis, preferencialmente produzindo o unificador mais geral (MGU).

Pseudocódigo conceitual

UNIFICAR(x, y, θ):

    se θ representa falha:
        retornar falha

    se x e y são idênticos após aplicar θ:
        retornar θ

    se x é variável:
        retornar UNIFICAR-VARIAVEL(x, y, θ)

    se y é variável:
        retornar UNIFICAR-VARIAVEL(y, x, θ)

    se x e y são expressões compostas
       e possuem mesmo símbolo principal
       e mesma aridade:

        para cada par de argumentos correspondentes:
            θ <- UNIFICAR(argumento_x, argumento_y, θ)

            se θ representa falha:
                retornar falha

        retornar θ

    retornar falha
UNIFICAR-VARIAVEL(var, termo, θ):

    se var já possui associação em θ:
        unificar θ(var) com termo

    se termo contém var de forma incompatível:
        retornar falha

    adicionar {var/termo} a θ
    propagar a substituição nas associações existentes
    retornar θ

Exemplo

Conhece(x, Ada)
Conhece(Tiago, y)

θ = {}
x ↔ Tiago  => {x/Tiago}
Ada ↔ y    => {x/Tiago, y/Ada}

Observe

  • mesmo nome de predicado não é suficiente;
  • aridade e argumentos precisam ser compatíveis;
  • a substituição deve ser consistente;
  • o objetivo é preservar generalidade.