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.