Documentos de Académico
Documentos de Profesional
Documentos de Cultura
LECTURA 1: INTRODUCCIN A
PROLOG
Seoritas y Seores Estudiantes. La presente lectura tendr su
control en el primer examen parcial de salida, tres interrogantes
se plantearan en la prueba escrita
Cusco Per
Mayo 2017
Una introduccin a Prolog
Habitualmente, programar un
ordenador significa dar una sucesin de
tareas que, al ejecutarlas paso a paso,
permiten resolver un problema concreto.
Sin embargo, el proceso que se sigue en
la programacin lgica es
completamente distinto: un programa en
un lenguaje de programacin lgica est
formado por un conjunto de hechos, junto
con un conjunto de condiciones que debe
verificar la solucin... el ordenador,
usando un motor de inferencia, debe
"deducir" la solucin a partir de los hechos
y las condiciones dadas.
Prolog (del francs, PROgrammation
en LOGique) fue el primer lenguaje de
programacin basado en el paradigma de la programacin lgica. Se implement por
primera vez a principios de los aos setenta en la Universidad de Marsella (Francia), por
un equipo dirigido por A. Colmeraeur y utilizando resultados de R.
Kowalski (Universidad de Edimburgo). Aunque con ciertas dificultades iniciales, debido
principalmente a la novedad del paradigma y a la escasa eficiencia de las
implementaciones disponibles, el lenguaje se fue expandiendo rpidamente, sobre todo
en Europa y en Japn (en este ltimo pas la programacin lgica se incluy como parte
central del proyecto de ordenadores de quinta generacin de los aos ochenta) y en 1995
se normaliza con el correspondiente estndar ISO.
Los hechos
edad(juan,27).
Las reglas
Las reglas funcionan como las frmulas condicionales habituales en lgica. Reflejan
que la verdad de un hecho depende de la verdad de otro hecho o grupo de hechos. Consta
de una cabeza y un cuerpo, donde este ltimo puede estar formado por varios hechos
(tambin llamados objetivos). Su sintaxis general es:
Los objetivos van separados por comas (que representan conjunciones) y al final debe
ir un punto. Por ejemplo:
Las variables
Los nombres de las variables deben comenzar con letra mayscula o con el
carcter (_). Existe una variable especial, la variable annima o blanca, que se utiliza de
la misma manera que las dems variables pero nunca toma ningn valor.
Vamos a comenzar dando un ejemplo que ya hemos analizado en las clases de teora
para resolverlo por medio de un programa en Prolog.
Ejemplo Disponemos de una base de conocimiento compuesta por reglas sobre
clasificacin de animales y hechos sobre caractersticas de un cierto animal tal y como
muestra la siguiente lista:
Regla 1: Si un animal es ungulado y tiene rayas negras, entonces es una cebra.
Regla 2: Si un animal rumia y es mamfero, entonces es ungulado.
Regla 3: Si un animal es mamfero y tiene pezuas, entonces es ungulado.
Hecho 1: El animal es mamfero.
Hecho 2: El animal tiene pezuas.
Hecho 3: El animal tiene rayas negras.
Para representar una regla, debemos elegir previamente los smbolos para los tomos
que aparecen en la regla:
Para la regla 1, podemos elegir los
smbolos es_ungulado, tiene_rayas_negras y es_cebra. La regla 1 puede
representarse como: Si es_ungulado y tiene_rayas_negras entonces
es_cebra. Usando las conectivas lgicas la expresin anterior se escribe mediante la
frmula:
es_unguladotiene_rayas_negrases_cebraes_unguladotiene_rayas_negrases_cebra
Para representar los hechos basta elegir los smbolos de los tomos. Por ejemplo, el
hecho 2 se representa en Prolog por:
tiene_rayas_negras.
es_mamfero. % Hecho 1
tiene_pezuas. % Hecho 2
tiene_rayas_negras. % Hecho 3
:- set_prolog_flag(unknown,fail).
Una vez en Prolog, podemos cargar el fichero anterior e intentar ver si se puede
deducir el resultado que buscbamos. Una sesin interactiva que hiciera esto en SWI-
Prolog podra ser de la siguiente forma (el smbolo ?- es el prompt y lo que viene a
continuacin en su misma lnea lo introduce el usuario; la respuesta de Prolog se muestra
en la linea, o lneas, siguientes a la interaccin del usuario):
?- [animales].
Yes
?- es_cebra.
Yes
En este rbol, cada estado es una pila de problemas por resolver. El estado inicial
consta de un nico problema (es_cebra). A partir de este estado buscamos en la base de
conocimientos una regla cuya cabeza coincida con el primer problema de la pila (en
nuestro caso, esta bsqueda da como resultado la regla 1). Sustituimos el problema por el
cuerpo de la regla. dando lugar a la pila de problemas es_ungulado,
tiene_rayas_negras. Para el primer problema (es_ungulado) tenemos dos reglas
cuyas cabezas coinciden (las reglas 2 y 3). Consideramos en primer lugar la regla 2,
produciendo la pila de problemas rumia, es_mamfero, tiene_rayas_negras, que
no coincide con la cabeza de ninguna regla, por lo que se produce un fallo y se considera
la otra eleccin, la regla 3, que genera la pila de problemas es_mamfero,
tiene_pezuas, tiene_rayas_negras. Cada uno de los problemas restantes coincide
con uno de los hechos (reglas sin cuerpo), por lo que obtenemos una solucin al problema
inicial.
La siguiente figura muestra una representacin del proceso que se sigue en la rama
exitosa del rbol anterior:
Primer ejemplo
located_in(atlanta,georgia). % Clause 1
located_in(houston,texas). % Clause 2
located_in(austin,texas). % Clause 3
located_in(toronto,ontario). % Clause 4
Reglas:
1. Lo que est en Georgia o Texas, tambin est en USA.
2. Lo que est en Ontario, tambin est en Canad.
3. Lo que est en USA o Canad, tambin est en Norte Amrica.
Que podemos representar con las siguientes clausulas (geo.pl):
located_in(X,north_america) :- located_in(X,canada).%Clause 9
Vamos a ver cul es el rbol de deduccin que sigue Prolog para resolver la siguiente
clausula:
located_in(toronto,north_america).
y su representacin Prolog es
divide(2,6). % Hecho 1
divide(2,4). % Hecho 2
divide(2,12). % Hecho 3
divide(3,6). % Hecho 4
divide(3,12). % Hecho 5
?- divide(6,X).
X = 6 ;
X = 12 ;
false.
La forma de interactuar con Prolog para obtener el resultado anterior es como sigue:
despus de obtener la primera respuesta se pide la bsqueda de otra solucin pulsando
punto y coma (;). Si en este proceso se obtiene como respuesta false significa que no hay
ms respuestas.
El rbol de deduccin correspondiente a la sesin anterior se muestra en la siguiente
figura, donde se observa que el rbol tiene dos ramas de xito y una de fallo. Adems, el
paso entre objetivos se ha ampliado: no se exige que el primer objetivo sea igual que la
cabeza de una regla, sino que sea unificable (es decir, que exista una sustitucin que los
haga iguales); por ejemplo, en el segundo paso el objetivo divide(2,X) se unifica con el
hecho divide(2,6) mediante la sustitucin de X por 6 (representada por {X/6}).
Componiendo las sustituciones usadas en una rama de xito se obtiene la respuesta.
Tercer ejemplo
0 + Y = Y
s(X) + Y = s(X+Y)
X,Y,Z[suma(X,Y,Z)suma(s(X),Y,s(Z))]X,Y,Z[suma(X,Y,Z)suma(s(X),Y,s(Z))]
y stas en Prolog:
suma(0,Y,Y). % R1
suma(s(X),Y,s(Z)) :- suma(X,Y,Z). % R2
Vamos a ver cmo Prolog responde a diversas cuestiones a partir de esta defnicin. La
primera cuestin es calcular la suma de s(0) y s(s(0)). La forma de plantear esta
pregunta en Prolog, y la respuesta obtenida, sera (suma.pl):
?- suma(s(0),s(s(0)),X).
X = s(s(s(0))).
?- suma(X,s(s(0)),s(s(s(0)))).
X = s(0) ;
false.
?- suma(X,Y,s(s(0))).
X = 0,
Y = s(s(0)) ;
X = s(0), Y = s(0) ;
X = s(s(0)),
Y = 0 ;
false.
Obteniendo las tres soluciones 2=0+2=1+1=2+02=0+2=1+1=2+0. El rbol de
deduccin correspondiente se muestra en la figura siguiente:
Bibliografa y Recursos