Vous êtes sur la page 1sur 10

El sistema deductivo de Prolog

En esta seccin vamos a presentar el procedimiento bsico de deduccin de Prolog: la re


solucin SLD. La presentacin la haremos ampliando sucesivamente la potencia expresiva del
lenguaje considerado.

Deduccin Prolog en lgica proposicional


En esta seccin vamos a estudiar el sistema deductivo de Prolog en el caso de la lgica pro
posicional. Vamos a desarrollar el estudio mediante el siguiente ejemplo.
Ejemplo 2.1 [Problema de clasificacin de animales] Disponemos de una base de conocimiento com
puesta de reglas sobre clasificacin de animales y hechos sobre caractersticas de un animal.
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.
Demostrar a partir de la base de conocimientos que el animal es una cebra.
Demostracin: Una forma de demostrarlo es razonando hacia atrs. El problema inicial consiste
en demostrar que el animal es una cebra. Por la regla 1, el problema se reduce a demostrar que el
animal es ungulado y tiene rayas negras. Por la regla 3, el problema se reduce a demostrar que el
animal es mamfero, tiene pezuas y tiene rayas negras. Por el hecho 1, el problema se reduce a
demostrar que el animal tiene pezuas y tiene rayas negras. Por el hecho 2, el problema se reduce
a demostrar que el animal tiene rayas negras. Que es cierto por el hecho 3.

Para resolver el problema anterior con Prolog vamos a considerar las siguientes cuestiones:
1. cmo se representan en Prolog las reglas,
2. cmo se representan en Prolog los hechos,
3. cmo se representan en Prolog las bases de conocimientos,
4. cmo se inicia una sesin Prolog,
5. cmo se carga en Prolog la base de conocimiento,
6 . cmo se representa en Prolog el objetivo a demostrar,

7. cmo se interpreta la respuesta de Prolog,


8 . cmo ha realizado Prolog la bsqueda de la demostracin,

9. cul es la demostracin obtenida y


10 . cmo se corresponde dicha demostracin con la anteriormente presentada.

Para representar una regla, se empieza por elegir los smbolos para los tomos que aparecen
en la regla. Para la regla 1, podemos elegir los smbolos es_ungulado, tien e_rayas_n egras y
es_cebra. La regla 1 puede representarse como
Si es_ungulado y tiene_rayas_n egras entonces es_cebra
Usando las conectivas lgicas la expresin anterior se escribe mediante la frmula
es_ungulado A tien e_rayas_n egras >es_cebra
donde A representa la conjuncin y el condicional. La frmula anterior se representa en Prolog,
mediante la clusula
e s _c eb r a
es_ungulado, t i e n e _ r a y a s _ n e g r a s .
Se puede observar que la transformacin ha consistido en invertir el sentido de la escritura y
sustituir las conectivas por
(condicional inversa) y , (conjuncin). El tomo a la izquierda de
: - se llama la cabeza y los tomos a la derecha se llama el cuerpo de la regla.

Para representar los hechos basta elegir los smbolos de los tomos. Por ejemplo, el hecho 2
se representa en Prolog por
tien e _ ra y a s_ n e g ra s.
es decir, el smbolo del tomo terminado en un punto. Los hechos pueden verse como clusulas
con el cuerpo vaco.
Para representar la base de conocimiento en Prolog, se escribe en un fichero (por ejemplo,
an im ales. p l) cada una de las reglas y los hechos 1.
e s _c eb r a
es_ungulado, t i e n e _ r a y a s _ n e g r a s .
es_ungulado
rumia, es_mamfero.
es_ungulado
es_mamfero, t i e n e _ p e z u a s .
es_mamfero.
tiene_pezuas.
tiene_rayas_negras.

1 Regla
l Regla
1 Regla
l Hecho
% Hecho 2
l Hecho 3

Al lado de cada regla y de cada hecho se ha escrito un comentario (desde % hasta el final de la
lnea).
Para iniciar una sesin de Prolog (con SWI Prolog) se usa la orden p l . La base de conocimiento
se carga en la sesin Prolog escribiendo el nombre entre corchetes y terminado en un punto. La
pregunta se plantea escribiendo el tomo y un punto.
Welcome to SWI-Prolog (M ult i-t hr ead ed , Versin 5 . 6 . 1 8 )
Copyright (c) 1990-2006 U n iv e r s it y of Amsterdam.
?- [anim ales].
Yes
? - e s_ ceb ra .
Yes

La respuesta Yes significa que ha demostrado que el animal es una cebra.


Podemos ver cmo Prolog ha obtenido la demostracin mediante el rbol de deduccin en la
Figura 1.
La bsqueda de la prueba es una bsqueda en profundidad en un espacio de estados, donde
cada estado es una pila de problemas por resolver. En nuestro ejemplo, el estado inicial consta de
un nico problema (es_cebra). Buscamos en la base de hechos una clusula cuya cabeza coinci
da con el primer problema de la pila, encontrando slo la regla 1. Sustituimos el problema por
el cuerpo de la regla, dando lugar a la pila es_ungulado, tien e_ray as_n egras. Para el primer
problema tenemos dos reglas cuyas cabezas coinciden (las reglas 2 y 3). Consideramos en primer
lugar la regla 2 , produciendo la pila de problemas rumia, esjm am fero, tien e_ ra y a s_ n eg ra s.
El primer problema no coincide con la cabeza de ninguna clusula. Se produce un fallo y se recon
sidera la eleccin anterior. Consideramos ahora la clusula 3, produciendo la pila de problemas
es_mamif e r o , ti e n e _ p e z u a s , t i e n e _ r a y a s _ n e g r a s . Cada uno de los problemas restantes coin
cide con uno de los hechos, con lo que obtenemos una solucin del problema inicial.
1En SWI Prolog, para que no d error en los predicados no definidos, hay que aadirle al fichero con la base de
conocimiento la lnea
set_proIog_flag(unknown,fail).

Exito

Figura 1: rbol de deduccin del problema de los animales

Podemos observar que el rbol tiene dos ramas: una rama de fallo (su hoja es no vaca y su
primer tomo no coincide con la cabeza de ninguna regla) y una rama de xito (su hoja es vaca).
A partir de la rama de xito podemos extraer la demostracin (por resolucin SLD) que se
muestra en la Figura 2 (pgina 8 ).
es cebra.

es_cebra
es_ungulado,
tiene_rayas_negras.

es_ungulado,
tiene_rayas_negras.

es_ungulado :es_mamifero,
tiene_pezuas.

es_mamifero,
tiene_pezuas,
tiene_rayas_negras.

es mamfero.

tiene_pezuas,
tiene_rayas_negras.

tiene_pezuas

:- tiene_rayas_negras.

^tiene_rayas_negras,

L
Figura 2: Demostracin SLD del problema de los animales
Leda en sentido contrario, y con notacin lgica, se obtiene la siguiente demostracin por
deduccin natural
1
2
3
4
5
6
7
8
9
5

es_ung'iilado A tiene_ray as_n egras > es_cebra


rumia A es_mamfero >es_ungulado
es_mamfero A tie n e ..pezuas >es_ungulado
es_mamfero
tiene_pezuas
tiene_rayas_negras
es_mamfero A tie n e ..pezuas
es_ungulado
es_ungulado A tiene_rayas_n egras
es_cebra

Regla 1
Regla 2
Regla 3
Hecho 1
Hecho 2
Hecho 3
Ia 4 y 6
E_ 3 y 7
Ia 8 y 6
E_ 1 y 9

Deduccin Prolog en lgica relacional


En esta seccin vamos a ampliar la presentacin del sistema deductivo de Prolog a la lgica
relacional (con variables, cuantificadores, constantes y smbolos de relacin). A lo largo de la
seccin se mostrar el uso de la unificacin.

La presentacin se basar en la siguiente base de conocimientos:


Hechos:
6 y 12 son divisibles por 2 y por 3.
4 es divisible por 2.
Regla: Los nmeros divisibles por 2 y por 3 son divisibles por 6 .
Para representar la base de conocimiento usaremos las constantes 2 , 3, 6 y 12 y el predicado
binario divide (X, Y) que se verifica si X divide a Y. Los hechos se representan mediante 4 clusulas
unitarias. La regla, se puede expresar como para todo X: si X es divisible por 2 y X es divisible por 3,
entonces X es divisible por 6. La representacin lgica de la regla es
(V X )[divide(2,X ) A d ivid e(3,X ) > divide( 6 ,X )]
y su representacin Prolog es
d i v i d e ( 6 ,X )
divide(2,X ), divide(3,X ).
en la que observamos que aparece la variable X (en Prolog se consideran variables las palabras
que empiezan por mayscula) y que est universalmente cuantificada de manera implcita. La
representacin en Prolog de la base de conocimientos es
d iv id e(2,6).
d iv id e(2,4).
d i v i d e ( 2 , 12 ).
d iv id e(3,6).
d i v i d e ( 3 , 12 ).
divide(6,X)

divide(2,X ), divide(3,X ).

1 Hecho
l Hecho
l Hecho
l Hecho
l Hecho
% Regla

Usando la base de conocimiento podemos determinar los nmeros divisibles por 6 como se
muestra a continuacin
?- div id e(6,X ).
X = 6 ;
X = 12 ;

No

Despus de obtener la primera respuesta se determina otra pulsando punto y coma. Cuando se
intenta buscar otra responde No que significa que no hay ms respuestas.
El rbol de deduccin correspondiente a la sesin anterior se muestra en la Figura 3 (pgina
10). Podemos observar en el rbol dos ramas de xito y una de fallo. Adems, el paso entre obje
tivos se ha ampliado: no se exige que el primer objetivo sea igual que la cabeza de una clusula,
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 sustitu
cin de X por 6 (representada por {X/6}). Componiendo las sustituciones usadas en una rama de
xito se obtiene la respuesta.

R e s p u e s t a X=6

R e s p u e s t a X=12

Figura 3: rbol SLD del problema de divisibilidad

Deduccin Prolog en lgica funcional


En esta seccin volvemos a ampliar la presentacin del sistema deductivo de Prolog al caso
de la lgica funcional (con smbolos de funcin). Adems, presentaremos el primer ejemplo de
definicin recursiva y detallaremos el clculo de unificadores.
Los nmeros naturales se pueden representar mediante una constante 0 y un smbolo de
funcin unitaria s que representan el cero y el sucesor respectivamente. De esta forma, 0 , s ( 0 ),
s (s ( 0 ) ) , __ representan a los nmeros naturales 0 , 1 , 2 , . . . . Vamos a definir la relacin suma(X, Y, Z)
que se verifica si Z es la suma de los nmeros naturales X e Y con la anterior notacin. La definicin,
por recursin en el primer argumento, se basa en las identidades
0 + Y = Y
s(X) + Y = s(X+Y)
que se traduce en las frmulas
(VY) [suma(0, Y, Y)]
(VX, Y, Z )[sum a(X, Y, Z) su m a(s(X ), Y,s(Z))]
y stas en el programa Prolog
suma( 0 , Y , Y ) .
su ma( s(X ), Y , s ( Z ) )

suma(X,Y,Z).

1 R1
1 R2

Vamos a usar el programa para responder a distintas siguientes cuestiones y explicar cmo
se obtienen las respuestas.
La primera cuestin consiste en calcular la suma d e s ( 0 ) y s ( s ( 0 ) ) . L a forma de plantear la
cuestin en Prolog y la respuesta obtenida es
? - s u ma ( s ( 0 ) , s ( s ( 0 ) ) ,X) .
X = s(s(s(0)))
Yes

El rbol de deduccin se muestra en la Figura 4 (11). Del rbol vamos a comentar la separa-

Resp.: X = XO = s(zi)

= s(s(s(0)))

Figura 4: rbol SLD del problema de la suma


cin de variables, las unificaciones y el clculo de la respuesta. Para evitar conflicto con las
variables, se cambia de nombre aadiendo el ndice 0 a las del objetivo inicial y para las clu
sulas del programa se aade como ndice el nivel del rbol. El nodo inicial slo tiene un su
cesor con la regla 2 , porque es la cabeza de la nica regla con la que unifica; efectivamente
el tomo suma(s(0) , s ( s ( 0 ) ) ,X0) no es unificable con suma(0,Yl,Y1) porque los primeros ar
gumentos son tomos sin variables distintos y s es unificable con suma(s (XI) , Y l , s ( Z l ) ) me
diante la sustitucin { X l / 0 , Y l / s ( s ( 0 ) ) , XO/s ( Z l ) > que aplicada a ambos tomos da el tomo
suma(s( 0 ) , s (s ( 0 ) ) , s ( Z l ) ). Lo mismo sucede con el segundo nodo. Finalmente, la respuesta se
calcula componiendo las sustituciones realizadas en la rama de xito a las variables iniciales: X
se sustituye inicialmente por XO, en el primer paso se sustituye XO por s (Zl) y en el segundo se
sustituye Zl por s (s (0) ) con lo que el valor por el que sustituye X es s (s (s ( 0 ) ) ) .
La segunda cuestin es cmo calcular la resta d e s ( s ( s ( 0 ) ) ) y s ( s ( 0 ) ) . Para ello no es ne
cesario hacer un nuevo programa, basta con observar que X = a b ^ X + a = b y plantear la
pregunta
?- suma(X,s(s(0)) , s ( s ( s ( 0 ) ) ) ) .
X = s (0) ;
No

El rbol de deduccin correspondiente se muestra en la Figura 5 en el que se observa que al


intentar obtener una segunda respuesta se produce una rama de fallo, ya que el ltimo objetivo
de la segunda rama no es unificable con la cabeza de la primera clusula (porque el segundo
y tercer argumentos del objetivo son trminos sin variables distintos) ni con la de la segunda
(porque los terceros argumentos son trminos sin variables distintos).
La tercera cuestin es descomponer el nmero 2 en suma de dos nmeros naturales; es decir
resolver la ecuacin X + Y = 2. Tampoco para este problema se necesita un nuevo programa,
basta realizar la siguiente consulta
? - s u m a ( X , Y , s ( s ( 0 ) )) .
X = 0
Y = s (s ( 0 ) ) ;

s u m a ( X 3 ,s ( s (0 )), 0 )

Fallo

Figura 5: rbol SLD del problema de la resta


X
Y
X
Y

No

=
=
=
=

s( 0)
s (0) ;
s(s(0))
0 ;

con la que se obtienen las tres soluciones 2 = 0 + 2 = l + l = 2 + 0. El rbol de deduccin corres


pondiente se muestra en la Figura 6 . Vamos a comentar la unificacin de la primera resolucin.
Los tomos a unificar son
t\ = suma(X0,Y0, s ( s ( 0 ) ) ) y 2 = suma(0, Y1,Y1) .
Para unificar los primeros argumentos necesitamos la sustitucin <7\ = {X 0 /0 }. Aplicando cr\ a los
tomos obtenemos
o\ (ti) = suma(0, YO, s (s ( 0 ) )) y 7i(2) = suma(0 ,Y1, Yl).
Para unificar los segundos argumentos podemos usar la sustitucin cri ={Y0/Y1}. Aplicando cri a
los tomos obtenemos
d2((li(ti)) =suma(0,Yl,s(s(0))) y (72(t7"i ( 2 )) =suma(0,Y l ,Yl).
Para unificar los terceros argumentos necesitamos la sustitucin <73 = {Y l/ s (s ( 0 ) ) } . Aplicando (73
a los tomos obtenemos
^ ( ^ 2(^1 (i))) = cr3 (c'2 (crl(2))) =suma(0,s(s(0)) ,s(s(0))).

En definitiva, un unificador de ti y 2 se obtiene componiendo las anteriores sustituciones


a
=
(73(72(7i = { X 0 / 0 , Y O / s (s ( 0 ) ) , Y l / s ( s ( 0 ) ) }
La cuarta cuestin es resolver el sistema de ecuaciones

1+x = y
x+y= 1
En este caso basta plantear una pregunta compuesta
? - suma(s( 0 ) , X , Y ) , suma (X, Y,s( 0))

X=s(s(0))
Y=0
Figura 6 : rbol SLD del problema de la descomposicin en suma dos elementos
X = 0
Y = s (0) ;
No
El rbol de deduccin correspondiente se muestra en la Figura 7. En este ejemplo se observa que
el unificador del primer objetivo y la cabeza de la clusula se le aplica a los restantes objetivos: en
el primer paso se ha sustituido la variable YO del segundo objetivo por s ( Z l ) .

Vous aimerez peut-être aussi