Tutorial básico de programación en Prolog

La unificación es el mecanismo mediante el cuál las variables lógicas toman valor en Prolog. El valor que puede tomar una variable consiste en cualquier término, por ejemplo, j(3), 23.2, 'hola que tal', etc. Por eso decimos que los datos que maneja Prolog son términos.

Cuando una variable no tiene valor se dice que está libre. Pero una vez que se le asigna valor, éste ya no cambia, por eso se dice que la variable está ligada.

Se dice que dos términos unifican cuando existe una posible ligadura (asignación de valor) de las variables tal que ambos términos son idénticos sustituyendo las variables por dichos valores. Por ejemplo: a(X,3) y a(4,Z) unifican dando valores a las variables: X vale 4, Z vale 3. Obsérvese que las variables de ambos términos entran en juego.

Por otra parte, no todas las variables estan obligadas a quedar ligadas. Por ejemplo: h(X) y h(Y) unifican aunque las variables X e Y no quedan ligadas. No obstante , ambas variables permanecen unificadas entre sí. Si posteriormente ligamos X al valor j(3) (por ejemplo), entonces automáticamente la variable Y tomará ese mismo valor. Lo que esta ocurriendo es que, al unificar los términos dados, se impone la restricción de que X e Y deben tomar el mismo valor aunque en ese preciso instante no se conozca dicho valor.

La unificación no debe confundirse con la asignación de los lenguajes imperativos puesto que representa la igualdad lógica. Muchas veces unificamos variables con términos directamente y de manera explícita (ya veremos como se hace esto), por ejemplo,X y 355. Esto provoca la sensación de que estamos asignando valores a las variables al estilo imperativo.

Para saber si dos términos unifican podemos aplicar las siguientes normas:

  • Una variable siempre unifica con un término, quedando ésta ligada a dicho término.
  • Dos variables siempre unifican entre sí, además, cuando una de ellas se liga a un término, todas las que unifican se ligan a dicho término.
  • Para que dos términos unifiquen, deben tener el mismo functor y la misma aridad. Después se comprueba que los argumentos unifican uno a uno manteniendo las ligaduras que se produzcan en cada uno.
  • Si dos términos no unifican, ninguna variable queda ligada.

. Ejemplos paradigmáticos

  • Una misma variable puede aparecer varias veces en los términos a unificar. Ejemplo: k(Z,Z) y k(4,H). Por culpa del primer argumento, Z se liga al valor 4. Por culpa del segundo argumento, Z y H unifican, pero como Z se liga a un valor, entonces H se liga a ese mismo valor, que es 4.
  • Recuerde que una variable no puede ligarse a dos valores distintos. Por ejemplo: k(Z,Z) y k(4,3) no unifican, sin embargo k(Z,Z) y k(5,5) sí unifican.
  • ¿ Sería capaz de decir a que valores se ligan las variables de este ejemplo ? a(b(j,K),c(X)) y a(b(W,c(X)),c(W)). Puede estar seguro de que unifican.
  • Cuidado con las variables anónimas, recuerde que son todas distintas. Por ejemplo: k(_,_) y k(3,4) unifican perfectamente.

. Culturilla

  • Existe un algoritmo de unificación más preciso que las normas dadas aqui. Además es computable, de otra manera, no estariamos hablando de Prolog.
  • Una variable siempre unifica consigo misma: Z y Z.
  • Cuando una variable empieza por el símbolo de subrayado, por ejemplo _Var1, Prolog sobreentiende que no estamos interesados en conocer el valor concreto que tiene esa variable. Esto sirve para evitar ciertos mensajes de advertencia (warnings) del compilador que resultan algo molestos.
  • Una variable puede unificar con un término que contiene esa variable: X y a(X). Esto no es muy recomendable puesto que estamos definiendo un término infinitamente anidado. No obstante, algunos entornos de desarrollo son tan potentes que pueden manejar dichos términos dependiendo, eso sí, de qué se pretenda hacer con ellos.

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.