Tutorial básico de programación en Prolog

Hasta ahora sabemos c�mo ejecutar objetivos, pero no sabemos como escribir el c�digo de los predicados. Los predicados se definen mediante un conjunto de cl�usulas:

  clausula1 
  clausula2 
  ...       
  clausulaN 
  

Donde el orden es significativo. Para facilitar la lectura, se suele dejar una l�nea en blanco entre cl�usula y cl�usula.

Las cl�usulas son t�rminos (como todo en Prolog) con el siguiente formato:

  cabeza :-  
    ojetivo1, 
    ojetivo2, 
    ..., 
    ojetivoN. 
  

Todo gira en torno al operador ":-". Lo que aparece a la izquierda se denomina cabeza y la secuencia de objetivos que aparece a la derecha se denomina cuerpo.

La cabeza es un t�rmino simple, por ejemplo, p(X,12) podr�a ser la cabeza de una cl�usula del predicado p/2. Es decir, todas las cl�usulas de un mismo predicado tienen en la cabeza un t�rmino con el mismo functor y aridad, aunque los argumentos pueden ser distintos.

El cuerpo no es m�s que el conjunto de condiciones que deben cumplirse (tener �xito) para que el predicado tenga �xito si lo invocamos con un objetivo que unifique con la cabeza.

Cuando invocamos un objetivo, Prolog unifica dicho objetivo con las cabezas de las cl�usulas. Cada cl�usula que unifique constituye un punto de elecci�n.

A continuaci�n se ejecuta el cuerpo de la primera cl�usula. Para ello se mantienen las ligaduras que ocurrieron en el paso anterior. Si el cuerpo tiene �xito, pueden ocurrir nuevas ligaduras. Dichas ligaduras pueden afectar de nuevo a la cabeza de la cl�usula. En consecuencia, el �mbito de visibilidad de las variables es una �nica cl�usula.

Si el cuerpo de la cl�usula falla, el mecanismo de backtracking nos lleva al siguiente punto de elecci�n, es decir, la siguiente cl�usula. El proceso se repite mientras queden cabezas que unifiquen (es decir, puntos de elecci�n). Cuando no quedan cabezas que unifiquen, el objetivo falla.

.�Ejemplo simple

Veamos un predicado compuesto por una simple cl�usula:

  es_viejo(Individuo) :- 
    edad(Individuo,Valor), 
    Valor > 60.
  

Ahora invocamos el objetivo es_viejo(luis). Para ello supongamos que la edad de Luis es 32 a�os, es decir, el objetivo edad(luis,32) tiene �xito.

Primero se unifica la cabeza de la cl�usula con el objetivo. Es decir, unificamos es_viejo(luis) y es_viejo(Individuo), produciendose la ligadura de la variable Individuo al valor luis. Como el �mbito de visibilidad de la variable es su cl�usula, la ligadura tambi�n afecta al cuerpo, luego estamos ejecutando realmente:

  es_viejo(luis) :- 
    edad(luis,Valor), 
    Valor > 60.
  

Ahora ejecutamos el cuerpo, que liga la variable Valor a 32. Pero el cuerpo falla porque el segundo objetivo falla (32>60 es falso). Entonces la cl�usula falla y se produce backtracking. Como no hay m�s puntos de elecci�n el objetivo falla. Es decir, Luis no es un viejo.

.�Ejemplo menos simple

Ahora veamos como las ligaduras que se producen en el cuerpo de la cl�usula afectan tambi�n a la cabeza. Consideramos el siguiente predicado compuesto de una �nica cl�usula:

  mayor_que(Fulano,Mengano) :- 
    edad(Mengano,EdadMengano), 
    edad(Fulano,EdadFulanano), 
    EdadFulano > EdadMengano.
  

Supongamos que la edad de Juan es 20 a�os y la de Luis es 32 a�os. Ejecutamos el objetivo mayor_que(luis,Quien):

  • Unificamos el objetivo con la cabeza: la variable Fulano se liga a luis, la variable Mengano permanece unificada con la variable Quien. Esto �ltimo es importante.
  • Ejecutamos el cuerpo, que tiene �xito y liga las variables Mengano a juan, EdadMengano a 20, EdadFulano a 32.
  • Como la variable Mengano ha quedado ligada, y adem�s unificaba con Quien, la variable Quien queda ligada a ese mismo valor.
  • El objetivo tiene �xito ligando la variable Quien al valor juan. Es decir, Luis es mayor que Juan.

.�Cl�usulas sin cuerpo

Si no existen condiciones para que una cl�usula sea cierta podemos omitir el cuerpo. En tal caso solamente escribimos la cabeza terminada en punto. Por ejemplo:

  edad(juan,32). 
  edad(luis,20).
  

Son dos cl�usulas del predicado edad/2. Las cl�usulas sin cuerpo se suelen denominar hechos, e.g. es un hecho que la edad de Luis es 20 a�os.

.�Culturilla

  • Podemos escribir las cl�usulas en una sola l�nea, si no lo hacemos es por legibilidad: a :- b,c,d.
  • El orden de escritura de las cl�usulas determina el orden en que se suceden las soluciones.
  • Recuerde que pueden aparecer puntos de elecci�n dentro del cuerpo de una cl�usula, como en toda secuencia de objetivos. Esto significa que una �nica cl�usula puede dar lugar a varias soluciones cuando uno o m�s objetivos del cuerpo tienen tambi�n varias soluciones.
  • Si una misma variable aparece en dos cl�usulas diferentes, entonces son variables diferentes pero con el mismo nombre. Recuerde que el �mbito de visibilidad de las variables es una �nica cl�usula.

COMPARTE ESTE ARTÍCULO

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