Curso intermedio de programación en Prolog

Si en Prolog no existen declaraciones de tipo, � como demonios estamos seguros de que un argumento es de un tipo determinado ?. La respuesta est� en los tests de tipo. �stos s�n predicados que (habitualmente) reciben un dato como argumento y fallan si el argumento no es del tipo esperado.

Como ejemplo vamos a escribir el test de tipo para comprobar si un argumento es una lista:

 es_una_lista( [] ). 
 es_una_lista( [ _ | Resto ] ) :- 
 ���es_una_lista(Resto). 
  

La lista vac�a es una lista, y si no, [A|B] ser� una lista si y s�lo si B es una lista. En cuanto a A, nos trae al fresco lo que valga, por eso usamos una variable an�nima en el c�digo.

Ahora podemos comprobar el tipo de un argumento llamando al test de tipo:

 mi_predicado(Lista1,Lista2) :- 
    es_una_lista(Lista1), 
    es_una_lista(Lista2), 
    ..., 
 

.�Tests de tipo predefinidos

Existen predicados predefinidos para comprobar algunos tipos b�sicos. Estos son:

PredicadoTest
integer/1 Comprueba si su argumento es un n�mero entero
float/1 Comprueba si el argumento es un n�mero decimal
number/ Comprueba si el argumento es un n�mero (entero o decimal)
atom/1 Comprueba si el argumento es un t�rmino cero-ario excluyendo las constantes num�ricas
var/1 Comprueba si el argumento es una variable libre
nonvar/1 Comprueba si el argumento est� instanciado
ground/1 Comprueba si el argumento es un t�rmino que no contiene variables libres (est� cerrado)

.�Ejecuci�n de los tests

La desventaja de los tests de tipo es que resulta necesario ejecutarlos. Esto a�ade un tiempo extra de ejecuci�n a nuestra aplicaci�n que no sirve para nada �til. Sin embargo, esto es solamente una verdad a medias:

  • La mayor�a de los predicados no requieren test de tipo como es el propio predicado que implementa el test de tipo. Todo gracias a la unificaci�n.
  • Los compiladores m�s avanzados son capaces de suprimir los test de tipo cuando pueden asegurar en tiempo de compilaci�n que el predicado no se llamar� con tipos inadecuados.
  • Analogamente, algunos compiladores son capaces de insertar autom�ticamente el test de tipo cuando al programador "se le olvida" (es decir, siempre).
  • Cuando la aplicaci�n esta terminada y probada, el propio programador puede suprimir los test de tipo si est� seguro de que no pueden producirse errores de tipo.
  • El polimorfismo que aporta la ausencia de declaraciones de tipo es deseable en muchas ocasiones. Por eso, los test de tipo no siempre son necesarios.

En cualquier caso, el programador tiene libertad para decidir si es necesario ejecutar tests de tipo en su programa.

.�Tests de tipo versus sublenguaje de tipos

La mayor�a de los lenguajes tradicionales (imperativos) incorporan un sublenguaje para la declaraci�n de los tipos. Se dice que es un sublenguaje porque no sigue la misma sint�xis, ni dispone de los mismos recursos, que el propio lenguaje de programaci�n. Estos sublenguajes solamente contemplan un tipado de tipo estructural, pero no de tipo sem�ntico. Por ejemplo, es posible declarar el tipo de datos Lista de n�meros enteros, pero dificilmente podemos declarar el tipo de datos Lista de n�meros enteros ordenados de menor a mayor que adem�s son todos menores que cien. A decir verdad, lo podemos declarar, pero no espere que el compilador compruebe si las lista de su programa estan ordenadas o no.

Sin embargo, en Prolog esto s� es posible incluso en tiempo de compilaci�n. Hoy por hoy las t�cnicas para conseguir esto est�n a�n en investigaci�n, motivo por el que no va ha encontrar muchos entornos de desarrollo que lo incorporen. Lo importante es ser consciente de que la ausencia de sublenguaje de tipos no es una desventaja sino todo lo contrario.

.�Tipos param�tricos

Tambi�n es posible escribir test de tipos param�tricos, es decir, aquellos que dependen de otro tipo. Por ejemplo, para evitar tener que definir un test de tipo para listas de n�meros y otro para listas de �tomos, podr�amos definir el tipo "lista de X". La declaraci�n de estos test de tipo requiere el uso de predicados de orden superior (o metapredicados) que estudiaremos posteriormente.

� Copyright 2000-2001

Angel Fern�ndez Pineda.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO