El código
Cláusulas
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.