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

4.9. Un lenguaje de implementación: Prolog

Prolog es un lenguaje de programación basado en el lenguaje de la lógica de predicados. En el ApéndiceA se describen sus principales características (incluyendo algunas construcciones procedimentales, no lógicas). Veamos aquí, con un sencillo ejemplo, la idea básica del lenguaje. El ejemplo será el del mundo de los bloques, tal como lo habíamos formalizado en el Apartado 4.8.4 para responder a consultas mediante refutación.

Las sentencias de Prolog son cláusulas de Horn escritas con una sintaxis propia. Entre otras cosas, la sintaxis de Prolog difiere de la que venimos utilizando en que las constantes se escriben con minúscula (o empezando con minúscula) y las variables con mayúscula (o empezando con mayúscula). Hay tres tipos de sentencias:

Los hechos son cláusulas determinadas con un solo literal en el que únicamente figuran constantes. En el ejemplo:

   sobre(a,b).  
   sobre(b,c).  
   sobre(d,e).

Las reglas son cláusulas determinadas con al menos un literal negativo. La cláusula:

¬p1(x,y...)  \/ ¬p2(x,y...)  \/ ...  \/ q(x,y...)  =_ p1(x,y...)  /\ p2(x,y...)... ==> q(x,y...)

se escribe con la sintaxis:

   q(X,Y...) :- p1(X,Y...),p2(X,Y...).

que se lee: «q(X,Y...) si p1(X,Y...) y p2(X,Y...) y...»

En el ejemplo:

   maq(X,Y) :- sobre(X,Y).  
   maq(X,Y) :- sobre(X,Z),maq(Z,Y).

(No es necesario utilizar distintos símbolos para las variables de diferentes cláusulas, lo que sería muy engorroso para programar; el procesador del lenguaje, que implementa el sistema deductivo, sí lo hace internamente).

Las consultas son objetivos determinados. La claúsula:

¬p1(x,y...)  \/ ¬p2(x,y...)...  =_ ¬(p1(x,y...)  /\ p2(x,y)...)

se escribe:

   ?- p1(X,Y),p2(X,Y)...

donde «?-» lo escribe el procesador para que a continuación escribamos la consulta.

En el ejemplo podemos hacer, entre otras, estas consultas y obtener estas respuestas:

   ?- sobre(a,b).  
   YES  
 
   ?- sobre(a,c).  
   NO  
 
   ?- maq(a,c).  
   YES  
 
   ?- sobre(d,X).  
   X=e.  
 
   ?- maq(X,c).  
   X=b.  
   X=a.  
 
   ?- maq(X,Y).  
   X=a, Y=b.  
   X=b, Y=c.  
   X=d, Y=e.  
   X=a, Y=c.

Normalmente, los procesadores de Prolog (intérpretes o compiladores) implementan un sistema deductivo con resolución y refutación y una estrategia de control que se llama resolución SLD (Selected literals Linear from Definite clauses). Es una estrategia lineal (una generatriz es la consulta o uno de sus descendientes) con la entrada (la otra es una regla o un hecho) con un convenio para la selección de literales a resolver: el que está más a la izquierda de la consulta se resuelve con un hecho o con la cabeza de una regla. El proceso que se sigue para la consulta «?- maq(X,Y).» es exactamente el indicado al final del Apartado 4.8.4: cada vez que encuentra una refutación («P» ) devuelve una respuesta.

El restringir el lenguaje a cláusulas de Horn hace que algunos razonamientos lógicos no puedan realizarse. Por ejemplo, los basados en modus tollens, como el del Apartado 4.6.3:

Premisa1:
Todos los libros sobre ordenadores son terriblemente aburridos
Premisa2:
Este libro no es terriblemente aburrido
Conclusión:
Este no es un libro sobre ordenadores

En Prolog es posible expresar un cierto tipo de «negación» , pero con una semántica muy especial (Apartado A.5.5), y, de hecho, es inaplicable a un razonamiento como éste.

El hecho es que Prolog es un lenguaje cuya sintaxis es un subconjunto de la del lenguaje de la lógica de primer orden, y cuya semántica, aunque se pretende que sea declarativa, está determinada por la implementación (o sea, por el modelo procesal). Todo esto se explica en el Apéndice A.

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


algunos derechos reservados DIT-ETSIT-UPM
Portada