Tutorial básico de programación en Prolog

Los programas se escriben en ficheros de texto, generalmente con extension .pl y pueden contener comentarios y c�digo. Para ello puede utilizar cualquier editor de texto. Le recomendamos que intente escribir el siguiente programa desde el principio para familiarizarse con la sint�xis.

 % Este es mi primer programa en Prolog 
 % 
 % Se trata de un arbol genealogico muy simple 
 % 
 % 
 % Primero defino los parentescos basicos 
 % de la familia. 
 % padre(A,B) significa que B es el padre de A... 
 
 padre(juan,alberto). 
 padre(luis,alberto). 
 padre(alberto,leoncio). 
 padre(geronimo,leoncio). 
 padre(luisa,geronimo). 
 
 % Ahora defino las condiciones para que 
 %  dos individuos sean hermanos 
 % hermano(A,B) significa que A es hermano de B... 
 
 hermano(A,B) :- 
   padre(A,P), 
   padre(B,P), 
   A \== B. 
 
 % Ahora defino el parentesco abuelo-nieto. 
 % nieto(A,B) significa que A es nieto de B... 
  
 nieto(A,B) :- 
   padre(A,P), 
   padre(P,B). 
 

.�Cargando el c�digo

Para compilar y cargar el c�digo existe el predicado consult/1. Recuerde que puede ser necesario indicar la ruta completa del fichero fuente. En este ejemplo hemos usado el top-level shell de SWI-Prolog:

 Welcome to SWI-Prolog (Version 2.7.14) 
  Copyright (c) 1993-1996 University of Amsterdam.  All rights
  reserved. 
 
  For help, use ?- help(Topic). or ?- apropos(Word). 
 
 1 ?- consult('arbolgenealogico.pl'). 
 arbolgenealogico.pl compiled, 0.00 sec, 1,108 bytes. 
 
 Yes 
 2 ?- 
 

.�Predicados reversibles

Una vez que hemos compilado y cargado nuestro programa vamos a estudiar sus caracter�sticas. Una de ellas es el backtracking, o la posibilidad de obtener varias soluciones, como ya hemos visto.

 2 ?- hermano(A,B). 
 
 A = juan 
 B = luis ; 
 
 A = luis 
 B = juan ; 
 
 A = alberto 
 B = geronimo ; 
 
 A = geronimo 
 B = alberto ; 
 
 No 
 3 ?- 
 

Ahora vamos a reparar en otra curiosa propiedad que no existe en otros lenguajes: la reversibilidad. Esto es la habilidad de los argumentos de los predicados para actuar indistintamente como argumentos de entrada y/o salida.Por ejemplo:

 3 ?- nieto(luis,X). 
 
 X = leoncio 
 
 No 
 4 ?- 
 

Aqu�, el primer argumento es de entrada mientras que el segundo es de salida. El predicado nos dice de qui�n es nieto Luis. Pero ahora vamos a intercambiar los papeles:

 4 ?- nieto(X,leoncio). 
 
 X = juan ; 
 
 X = luis ; 
 
 X = luisa ; 
 
 No  
 5 ?-  
 

Obs�rve c�mo el mismo predicado que nos dice el abuelo de un nieto sirve para conocer los nietos de un abuelo. Estos predicados se dicen reversibles, o que sus argumentos son reversibles.

.�Predicados no reversibles

No todos los predicados son reversibles. Por ejemplo, los de comparaci�n aritm�tica. El predicado >/2 sirve para saber si un n�mero es mayor que otro, pero no sirve para saber todos los n�meros mayores que uno dado (puesto que son infinitos).

Otros predicados pueden perder la reversibilidad por deseo expreso de su programador, o solamente ser reversibles para ciertos argumentos pero no otros. As� podemos hablar de las posibles formas de invocar un predicado. Esto es lo que se denomina modos de uso.

.�Modos de uso

Los modos de uso indican que combinacion de argumentos deben o no estar instanciados para que un objetivo tenga sentido. Se dice que un argumento est� instanciado cuando no es una variable libre.

A efectos de documentaci�n, los modos de uso se describen con un t�rmino anotado en sus argumentos con un s�mbolo. Los argumentos pueden ser:

  • De entrada y/o salida indistintamente. Estos argumentos se denotan con un s�mbolo de interrogaci�n (?).
  • De solamente entrada. Estos se denotan con un s�mbolo de suma (+).
  • De solamente salida. Estos se denotan con un s�mbolo de resta (-).

El modo de uso que instancia todos los argumentos siempre es v�lido.

Por ejemplo, para el predicado hermano/2 su �nico modo de uso es hermano(?A,?B). Supongamos un predicado cuyos modos de uso son:

  • p(+A,+B,-C).
  • p(+A,-B,+C).

Entonces son objetivos v�lidos:

  • p(1,2,X).
  • p(1,X,3).
  • p(1,2,3).

Pero no son v�lidos:

  • p(X,Y,3).
  • p(X,2,3).
  • p(X,Y,Z).

Los modos de uso se suelen indicar a modo documentativo, pero actualmente los entornos de desarrollo m�s avanzados los pueden utilizar para detectar errores en tiempo de compilaci�n.

.�Culturilla

  • Un compilador que no utiliza los modos de uso no detecta objetivos inv�lidos. En ese caso, el programa se ejecuta sin m�s. Cuando le llega el turno al objetivo mal formado pueden ocurrir dos cosas: que el objetivo falle sin m�s, o que se lance una excepci�n. Cualquiera de ellas suele ir acompa�ada de un horrendo mensaje por pantalla.
  • La forma de describir los modos de uso "formalmente" varia de un entorno de desarrollo a otro. Si no es posible especificarlos "formalmente", entonces conviene escribir un comentario explicativo.
  • Si el compilador no detecta modos de uso, es responsabilidad del programador no invocar objetivos mal formados, tarea que no resulta nada trivial puesto que hay que saber que variables van a estar ligadas cuando el programa se ejecute.
  • Otra buena pr�ctica es escribir predicados que siempre sean reversibles.

COMPARTE ESTE ARTÍCULO

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