Programando en Prolog: Unificación

La unificación, en Prolog, es el proceso fundamental de comparar dos términos para ver si coinciden y asignar valores a las variables si es necesario.

Para entender este concepto debemos tomar en cuenta que en Prolog existen estos tres términos:

  • Constantes: que pueden ser átomos y números. 
  • Variables: marcadores de posición que representan valores desconocidos o por determinar; funcionan de manera distinta a las variables de asignación en otros lenguajes de programación. 
  • Términos complejos o estructura: dato formado por un funtor (función de una categoría a otra) y una secuencia de argumentos encerrados entre paréntesis.

La unificación en Prolog

La unificación es el mecanismo central que permite que las variables y términos coincidan, vinculando valores y estructuras para que las consultas puedan resolverse. En pocas palabras, es el proceso por el cual se intenta hacer que dos expresiones sean iguales, asignando valores a variables si es necesario.

Abriremos una terminal y entraremos al REPL de Prolog:

$ swipl

Probaremos la unificación, de dos átomos y dos números:

1 ?- 33=33.
true.

2 ?- gelatina=gelatina.
true.

3 ?- =(33,33).
true.

4 ?- =(gelatina,gelatina).
true.

Ahora miremos esto:

5 ?- x=122.
false.

6 ?- gato=perro.
false.

El error ocurre porque dos constantes diferentes no unifican.

Ejemplo de unificación de lista:

7 ?- [X, Y, Z] = [Ana, True, 133].
X = Ana,
Y = True,
Z = 133.

Ejemplo de unificación en Prolog

Unificación en un mini sistema de parentescos.

parentescos.pl

% Hechos
padre(juan, maria).
padre(juan, pedro).
padre(carlos, juan).
madre(ana, maria).
madre(ana, pedro).

% Regla: X es progenitor de Y si es padre o madre
progenitor(X, Y) :- padre(X, Y).
progenitor(X, Y) :- madre(X, Y).

Cargamos el programa:

?- [parentesco].

Consultamos:

?- padre(juan, maria).
true.

Unificación con variables:

?- padre(juan, Hijo).
Hijo = maria ;
Hijo = pedro.

Unificación en reglas:

?- progenitor(ana, Quien).
Quien = maria ;
Quien = pedro.

Unificación más compleja

?- progenitor(X, maria).
X = juan ;
X = ana.

Cómo funciona internamente

  • Variables libres: se pueden asignar a cualquier valor.
    Ejemplo: X = 5  X queda ligado a 5.
    
  • Átomos y números: deben ser idénticos para unificarse.
    Ejemplo: 3 = 3  éxito; 3 = 4  falla.
    
  • Términos compuestos: deben tener el mismo functor y aridad.
    Ejemplo: padre(juan, X) = padre(juan, maria)  X = maria.
    
  • Backtracking: si una unificación falla en un camino, Prolog retrocede y prueba otras alternativas.

Tenemos entonces que:

  • El signo = en Prolog no es asignación, es un intento de igualar estructuras.
  • Los signos == en Prolog no solo compara, puede ligar variables. 
  • El pattern matching en Prolog es similar a lo que se hace en Haskell, pero ocurre dinámicamente en tiempo de ejecución.

A tomar en cuenta:

  • Unificación no es comparación: X = Y no pregunta si son iguales, sino que los hace iguales si es posible.
  • Ciclos: X = f(X) crea un término infinito (rational tree). Para evitarlo, se usa unify_with_occurs_check/2.
  • Orden estándar de términos: Prolog define un orden para comparar variables, números, átomos y estructuras.

Continuaremos con este tema y otros sobre el lenguaje Prolog.

Enlaces:

https://blog.adrianistan.eu/camino-a-prolog-unificacion/
https://wiki.uqbar.org/wiki/articles/unificacion-y-pattern-matching.html
https://programacionprolog.wordpress.com/2010/06/19/prolog-proceso-de-unificacion/
https://vitojph.github.io/ling/mrc/Prolog-Unificacion-Recursion.pdf
https://com-proff.com/estrategia/la-funcion-e-importancia-de-prolog/
https://blog.adrianistan.eu/supertutorial-prolog/

Comentarios