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
Publicar un comentario