siguiente arriba atrasadelante (solo si previamente se ha ido atras)

A.2.1. Consultas

Consultas sobre hechos

Supongamos que se define explícitamente la relación «jefe(X,Y)» , enumerando como hechos todas las parejas de individuos tales que el primero es jefe del segundo. (Sugerencia: dibuje la «jerarquía de mando» para entender mejor los ejemplos que siguen):

H1: jefe(a1,a2).
H2: jefe(a1,b2).
H3: jefe(a2,a3).
H4: jefe(a2,b3).
H5: jefe(a2,c3).
H6: jefe(b2,d3).
H7: jefe(b3,a4).
H8: jefe(b3,b4).

(Las «H» que aparecen a la izquierda no son parte del programa; las incluimos aquí para referirnos más adelante a uno u otro de los hechos. «a1» , «a2» , «b1» , etc, son abreviaturas para nombres de individuos).

Con este conjunto de hechos (o «base de datos» ) podemos ya hacer consultas:

 ?- jefe(a1,a2).  
 YES

(La consulta es «jefe(a1,a2).» ; «?-» y «YES» los genera la máquina).

 ?- jefe(a1,a3).  
 NO  
 
 ?- jefe(a1,X).  
 X=a2  
 X=b2

(En efecto, la máquina ha encontrado los dos valores de X para los que la relación es verdadera).

 ?- jefe(a1,a2),jefe(a2,c3).  
 YES

(Porque ambos componentes de la consulta son verdaderos).

 ?- jefe(a1,a2),jefe(b2,c3).  
 NO

(El segundo predicado es falso).

 ?- jefe(a1,X),jefe(X,c3).  
 X=a2  
 
 
 ?- jefe(a1,X),jefe(X,Y),jefe(Y,Z).  
 X=a2;  Y=b3;  Z=a4  
 X=a2;  Y=b3;  Z=b4

(La máquina da las dos combinaciones de valores posibles de X, Y y Z para las que los tres predicados son verdaderos).

Consultas sobre predicados definidos mediante reglas

Pero lo interesante de Prolog es la posibilidad de definir, mediante reglas, nuevos predicados para expresar propiedades o relaciones generales. Por ejemplo, a los hechos anteriores podemos añadir una regla que defina «X es subordinado de Y si Y es jefe de X» :

 subordinado(X,Y) :- jefe(Y,X).

Podemos también añadir otra para definir la propiedad «es_jefe» , que se aplicará a todo individuo que tenga al menos un subordinado:

 es_jefe(X) :- subordinado(Y,X).

X es jefe si existe algún Y tal que Y es subordinado de X» ) o, equivalentemente:

 es_jefe(X) :- jefe(X,Y).

X es jefe si existe algún Y del cual X es el jefe» ).

Otra regla puede definir, por ejemplo, la relación «jefe de segundo grado» , es decir, «jefe del jefe» :

 jefe2(X,Y) :- jefe(X,Z),jefe(Z,Y).

X es jefe2 de Y si existe algún Z tal que X es jefe de Z, y este Z es jefe de Y» ).

Obsérvese que las variables tienen un significado dentro de cada una de las reglas. Es decir, en este último ejemplo el valor que tome X debe ser igual en los dos sitios en que aparece X, y lo mismo para Y y Z, pero la variable X utilizada en una regla no tiene nada que ver con la variable X de otra regla.

Añadiendo estas reglas a los hechos H1–H8 podemos hacer nuevas consultas. El lector puede comprobar fácilmente las respuestas de la máquina:

 ?- subordinado(X,a1).  
 X=a2  
 X=b2  
 
 ?- es_jefe(X).  
 X=a1  
 X=a2  
 X=b2  
 X=b3  
 
 ?- jefe2(a2,X).  
 X=a4  
 X=b4

Si el lector está comprobando los ejemplos en un ordenador con un procesador de Prolog, observará que con la segunda consulta algunas respuestas se obtienen de manera repetida. Ello es debido al modelo procesal, que estudiaremos en el Apartado A.3, y en el A.4 veremos la manera de evitarlo.


siguiente
arriba atrasadelante (sólo si previamente se ha ido atras)


algunos derechos reservados DIT-ETSIT-UPM
Portada