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

A.1.5. Reglas

Una regla sirve para representar conocimiento que en lenguaje natural se expresa mediante una sentencia condicional. Por ejemplo, si en lenguaje natural decimos «si X es padre de Y entonces Y es hijo de X» , en Prolog escribiremos:
 hijo(Y,X) :- padre(X,Y).

El símbolo «:-» significa «si» , y la traducción directa al lenguaje natural de la regla es: «Y es hijo de X si X es padre de Y» .

Las reglas resultan muy útiles para definir nuevos predicados a partir de otros previamente definidos. Por ejemplo, podríamos tener un conjunto de hechos de la forma «padre(juan, luis)» , «padre(luis,jaime)» , etc., que definen el predicado (o relación) «padre» por extensión. La regla anterior define intensionalmente la relación «hijo» .

Muchas expresiones que en lenguaje natural no tienen explícitamente la forma condicional pueden representarse de este modo manteniendo su significado: «todos los hombres son mortales» es equivalente a decir «si X es un hombre entonces X es mortal» ; en Prolog:

 mortal(X) :- hombre(X).

En general, una regla tiene una «cabeza» y un «cuerpo» . La cabeza es un predicado, y el cuerpo una conjunción de literales; para indicar la conjunción se utiliza una coma separando a los predicados del cuerpo: una definición de «abuelo» es:

 abuelo(X,Y) :- padre(X,Z),padre(Z,Y).

(X es abuelo de Y si X es padre de algún individuo Z que, a su vez, es padre de Y).

Pero esta definición estaría incompleta: sólo cubre los abuelos paternos. Podemos completarla añadiendo otra regla:

 abuelo(X,Y) :- padre(X,Z),madre(Z,Y).

Escribir dos o más reglas para definir un predicado es la manera normal de expresar en Prolog lo que en lógica sería una disyunción. En este caso, «X es abuelo de Y si... o bien si...» . También puede expresarse explícitamente la disyunción mediante «;» :

 abuelo(X,Y) :- padre(X,Z),(padre(Z,Y);madre(Z,Y)).

pero normalmente se prefiere la versión en dos reglas por su mayor claridad.

También se puede definir introduciendo un concepto intermedio, «progenitor» (padre o madre):

 progenitor(X,Y) :- padre(X,Y).  
 progenitor(X,Y) :- madre(X,Y).  
 abuelo(X,Y) :- padre(X,Z),progenitor(Z,Y).

El cuerpo de la regla puede contener literales negativos. Por ejemplo:

 hermano(X,Y) :- progenitor(Z,X),  
                 progenitor(Z,Y), not (X=Y).

(En esta última regla hemos introducido uno de los predicados incorporados que veremos en el Apartado A.2.5).

Una observación muy importante: no debe confundirse «reglas de inferencia» con «reglas» (de Prolog) (y tampoco con «reglas gramaticales» , Apartado 3.2). Las «reglas» de Prolog son sentencias condicionales que se satisfacen para unas interpretaciones pero no para otras. Una regla de inferencia (Apartado 3.6.1) es un esquema general de razonamiento que, formalizado, se representa por una sentencia válida (Apartado 4.3.3). Por ejemplo, la regla de Prolog «men(x) :- pol(x)» corresponde a la sentencia condicional ( A x)(pol(x) ==>men(x)) que, como hemos visto (Apartado 4.3.4), se satisface para unas interpretaciones pero no para otras. Una particularización de la regla de inferencia modus ponens es:

P1: ( A x)(pol(x) ==>men(x))

P2: pol(x)

C: men(x)

a la que corresponde la sentencia

( A x)((pol(x) ==>men(x)) /\ pol(x) ==>men(x)),

que es una sentencia válida (se satisface con cualquier interpretación de los predicados y cualquier asignación de x).


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


algunos derechos reservados DIT-ETSIT-UPM
Portada