 Tutoriales
Tutorial básico de programación en Prolog
Dando valor a las variables
El mecanismo de unificación
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.
|
|
|