Está en la página 1de 33

Introduccin a la programacin lgica con

Prolog
Jos A. Alonso Jimnez

Grupo de Lgica Computacional


Dpto. de Ciencias de la Computacin e Inteligencia Artificial
Universidad de Sevilla
Sevilla, 17 de Junio de 2006 (versin de 25 de septiembre de 2006)

Jos A. Alonso

Esta obra est bajo una licencia ReconocimientoNoComercialCompartirIgual 2.5 Spain de Creative Commons.

Se permite:
copiar, distribuir y comunicar pblicamente la obra
hacer obras derivadas
Bajo las condiciones siguientes:
Reconocimiento. Debe reconocer los crditos de la obra de la manera especificada
por el autor.
No comercial. No puede utilizar esta obra para fines comerciales.
Compartir bajo la misma licencia. Si altera o transforma esta obra, o genera una
obra derivada, slo puede distribuir la obra generada bajo una licencia idntica a
sta.
Al reutilizar o distribuir la obra, tiene que dejar bien claro los trminos de la licencia de
esta obra.
Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los
derechos de autor.

Esto es un resumen del texto legal (la licencia completa). Para ver una copia de esta licencia,
visite
ttrtsrssss
o envie una carta a
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

Introduccin a la programacin lgica con Prolog

ndice
1. Introduccin

2. El sistema deductivo de Prolog


2.1. Deduccin Prolog en lgica proposicional . . . . . . . . . . . . . . . . . . . . . . . .
2.2. Deduccin Prolog en lgica relacional . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3. Deduccin Prolog en lgica funcional . . . . . . . . . . . . . . . . . . . . . . . . . .

4
4
8
10

3. Listas
3.1. Representacin de listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2. Concatenacin de listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3. La relacin de pertenencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13
13
15
16

4. Disyunciones

17

5. Operadores

18

6. Aritmtica

19

7. Control mediante corte

20

8. Negacin

23

9. El condicional

26

10. Predicados sobre tipos de trmino

27

11. Comparacin y ordenacin de trminos

28

12. Procesamiento de trminos

30

13. Procedimientos aplicativos

31

14. Todas las soluciones

32

Bibliografa

33

Jos A. Alonso

1.

Introduccin

En este trabajo presentamos el lenguaje de programacin lgica Prolog con un doble objetivo:
como una aplicacin de la deduccin automtica estudiada en la asignatura de Lgica informtica y como soporte de la asignatura de Programacin declarativa.
Los textos fundamentales de Prolog son
1. I. Bratko. Prolog Programming for Artificial Intelligence. AddisonWesley, 3 edition, 2001.
2. W. F. Clocksin y C. S. Mellish. Programming in Prolog. SpringerVerlag, 4 edition, 1994.
3. L. Sterling y E. Shapiro. The Art of Prolog. MIT Press, second edition, 1994.
4. T. Van Le. Techniques of Prolog Programming (with implementation of logical negation and quantified goals). John Wiley, 1993.
Algunas introducciones a Prolog publicadas en la Red son
1. P. Blackburn, J. Bos y K. Striegnitz. Learn Prolog Now!, 2001.
2. T. Cornell. Introduction to Prolog, 1998.
3. U. Endriss. An Introduction to Prolog Programming. Universiteit van Amsterdam, 2005.
4. J. E. Labra. Programacin prctica en Prolog. Cuaderno Didctico Num. 13. Ed. Servitec, 1998.
5. F. Llorens y M. J. Castel. Prcticas de Lgica: Prolog. Universidad de Alicante, 2001.
6. H. Pain y R. Dale. An Introduction to Prolog, 2002.
7. G. Ritchie. Prolog StepbyStep. University of Edinburgh, 2002.
8. D. Robertson. Prolog. University od Edinburgh, 2003.
9. T. Smith. Artificial Intelligence Programming in Prolog. University of Edinburgh, 2004.

2.

El sistema deductivo de Prolog

En esta seccin vamos a presentar el procedimiento bsico de deduccin de Prolog: la resolucin SLD. La presentacin la haremos ampliando sucesivamente la potencia expresiva del
lenguaje considerado.

2.1.

Deduccin Prolog en lgica proposicional

En esta seccin vamos a estudiar el sistema deductivo de Prolog en el caso de la lgica proposicional. Vamos a desarrollar el estudio mediante el siguiente ejemplo.
Ejemplo 2.1 [Problema de clasificacin de animales] Disponemos de una base de conocimiento compuesta 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.

Introduccin a la programacin lgica con Prolog

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 s, trsrs y
sr. La regla 1 puede representarse como
Si s y trsrs entonces sr
Usando las conectivas lgicas la expresin anterior se escribe mediante la frmula
s trsrs sr
donde representa la conjuncin y , el condicional. La frmula anterior se representa en Prolog,
mediante la clusula
sr s trsrs
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.

Jos A. Alonso

Para representar los hechos basta elegir los smbolos de los tomos. Por ejemplo, el hecho 2
se representa en Prolog por
trsrs
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,
s) cada una de las reglas y los hechos 1 .

sr
s trsrs
s r sr

s sr ts

sr

ts

trsrs

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 . 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.

t Pr ttr rs
rt rst str
s
s
sr
s
La respuesta s 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 (sr). Buscamos en la base de hechos una clusula cuya cabeza coincida 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 s trsrs. 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 r sr trsrs.
El primer problema no coincide con la cabeza de ninguna clusula. Se produce un fallo y se reconsidera la eleccin anterior. Consideramos ahora la clusula 3, produciendo la pila de problemas
sr ts trsrs. Cada uno de los problemas restantes coincide con uno de los hechos, con lo que obtenemos una solucin del problema inicial.
1 En

SWI Prolog, para que no d error en los predicados no definidos, hay que aadirle al fichero con la base de
conocimiento la lnea
str

Introduccin a la programacin lgica con Prolog

: es_cebra.
R1
: es_ungulado,
tiene_rayas_negras.
R2
: rumia,
es_mamifero,
tiene_rayas_negras.
Fallo

R3
: es_mamifero,
tiene_pezuas,
tiene_rayas_negras.
H1
: tiene_pezuas,
tiene_rayas_negras.
H2
: tiene_rayas_negras.
H3
:.
Exito

Figura 1: rbol de deduccin del problema de los animales

Jos A. Alonso

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_mamifero.

: tiene_pezuas,
tiene_rayas_negras.

tiene_pezuas.

: tiene_rayas_negras.

tiene_rayas_negras.

:.

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 s trsrs sr Regla 1
2 r sr s
Regla 2
3 sr ts s
Regla 3
4 sr
Hecho 1
5 ts
Hecho 2
6 trsrs
Hecho 3
7 sr ts
I 4 y 6
8 s
E 3 y 7
9 s trsrs
I 8 y 6
5 sr
E 1 y 9

2.2.

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.

Introduccin a la programacin lgica con Prolog

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 , , y y el predicado
binario que se verifica si divide a . 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
( X )[divide(2, X ) divide(3, X ) divide(6, X )]
y su representacin Prolog es

en la que observamos que aparece la variable (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

Usando la base de conocimiento podemos determinar los nmeros divisibles por como se
muestra a continuacin

Despus de obtener la primera respuesta se determina otra pulsando punto y coma. Cuando se
intenta buscar otra responde 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 objetivos 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 se unifica con el hecho mediante la sustitucin de por (representada por ). Componiendo las sustituciones usadas en una rama de
xito se obtiene la respuesta.

10

Jos A. Alonso

: divide(6,X).
R1
: divide(2,X),
divide(3,X).
H1 {X/6}

H3 {X/12}
H2 {X/4}

: divide(3,6).

: divide(3,4).

H4

Fallo

: divide(3,12).
H5

:.

:.

Respuesta X=6

Respuesta X=12

Figura 3: rbol SLD del problema de divisibilidad

2.3.

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 y un smbolo de
funcin unitaria s que representan el cero y el sucesor respectivamente. De esta forma, , s,
ss, . . . . representan a los nmeros naturales 0, 1, 2, . . . . Vamos a definir la relacin s
que se verifica si es la suma de los nmeros naturales e con la anterior notacin. La definicin,
por recursin en el primer argumento, se basa en las identidades


s s
que se traduce en las frmulas

(Y )[suma(0, Y, Y )]
( X, Y, Z )[suma( X, Y, Z ) suma(s( X ), Y, s( Z ))]
y stas en el programa Prolog

s
sss s

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 de s y ss. La forma de plantear la
cuestin en Prolog y la respuesta obtenida es

ssss
sss
s

Introduccin a la programacin lgica con Prolog

11

El rbol de deduccin se muestra en la Figura 4 (11). Del rbol vamos a comentar la separa: suma(s(0),s(s(0)),X0).
suma(s(X1),Y1,s(Z1)) :
suma(X1,Y1,Z1).
{X1/0,Y1/s(s(0)),X0/s(Z1)}
: suma(0,s(s(0)),Z1).
suma(0,Y2,Y2).
{Y2/s(s(0)), Z1/s(s(0))}
:.
Resp.: X = X0 = s(Z1) = 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 clusulas del programa se aade como ndice el nivel del rbol. El nodo inicial slo tiene un sucesor con la regla 2, porque es la cabeza de la nica regla con la que unifica; efectivamente
el tomo ssss no es unificable con s porque los primeros argumentos son tomos sin variables distintos y s es unificable con sss mediante la sustitucin ss s que aplicada a ambos tomos da el tomo
sssss. 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:
se sustituye inicialmente por , en el primer paso se sustituye por s y en el segundo se
sustituye por ss con lo que el valor por el que sustituye es sss.
La segunda cuestin es cmo calcular la resta de sss y ss. Para ello no es necesario hacer un nuevo programa, basta con observar que X = a b X + a = b y plantear la
pregunta

ssssss
s

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 . Tampoco para este problema se necesita un nuevo programa,
basta realizar la siguiente consulta

sss

ss

12

Jos A. Alonso

: suma(X0,s(s(0)),s(s(s(0))).
suma(s(X1),Y1,s(Z1)) :
suma(X1,Y1,Z1).
{X0/s(X1),Y1/s(s(0)),Z1/s(s(0))}
: suma(X1,s(s(0)),s(s(0))).
suma(s(X2),Y2,s(Z2)) :
suma(0,Y2,Y2).
suma(X2,Y2,Z2).
{X1/0, Y2/s(s(0))}
{X1/s(X2),Y2/s(s(0)),Z2/s(0)}
:.

: suma(X2,s(s(0)),s(0)).
suma(s(X3),Y3,s(Z3)) :
Resp: X=X0=s(X1)=s(0)
suma(X3,Y3,Z3).
{X2/s(X3),Y3/s(s(0)),Z3/0}
: suma(X3,s(s(0)),0).
Fallo

Figura 5: rbol SLD del problema de la resta

s
s
ss

con la que se obtienen las tres soluciones 2 = 0 + 2 = 1 + 1 = 2 + 0. El rbol de deduccin correspondiente se muestra en la Figura 6. Vamos a comentar la unificacin de la primera resolucin.
Los tomos a unificar son
t1 = sss y t2 = s.
Para unificar los primeros argumentos necesitamos la sustitucin 1 = . Aplicando 1 a los
tomos obtenemos
1 (t1 ) = sss y 1 (t2 ) = s.
Para unificar los segundos argumentos podemos usar la sustitucin 2 =. Aplicando 2 a
los tomos obtenemos
2 (1 (t1 )) =sss y 2 (1 (t2 )) =s.
Para unificar los terceros argumentos necesitamos la sustitucin 3 =ss. Aplicando 3
a los tomos obtenemos
3 (2 (1 (t1 ))) = 3 (2 (1 (t2 ))) =sssss.
En definitiva, un unificador de t1 y t2 se obtiene componiendo las anteriores sustituciones
= 3 2 1 = ss ss
La cuarta cuestin es resolver el sistema de ecuaciones
1+X = Y
X+Y = 1
En este caso basta plantear una pregunta compuesta

ss ss

Introduccin a la programacin lgica con Prolog

13

: suma(X0,Y0,s(s(0))).
R1 {X0/0,
Y1/s(s(0)),
Y0/s(s(0)).
:.

R2 {X0/s(X1),
Y1/Y0,
Z1/s(0)}
: suma(X1,Y0,s(0)).

R1 {X1/0,
X=0
Y2/s(0),
Y=s(s(0))
Y0/s(0)}
:.
X=s(0)
Y=s(0)

R2 {X1/s(X2),
Y2/Y0,
Z2/0}
: suma(X2,Y0,0).
R1 {X2/0,
Y3/0,
Y2/0}
:.
X=s(s(0))
Y=0

Figura 6: rbol SLD del problema de la descomposicin en suma dos elementos

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 del segundo objetivo por s.

3.

Listas

En esta seccin vamos a estudiar cmo se representan las listas en Prolog y a definir algunas
relaciones sobre listas que se usan frecuentemente.

3.1.

Representacin de listas

De manera anloga a la construccin de los naturales a partir de y s, las listas puede definirse mediante una constante (que representa la lista vaca) y un smbolo de funcin binario (de
manera que si es una lista el trmino representa la lista obtenida aadiendo el elemento
a la lista ). Ntese que no todas las expresiones son listas, sino slo las que se obtienen
mediante las siguientes reglas:
La lista vaca es una lista.
Si es una lista, entonces es una lista.

14

Jos A. Alonso

: suma(s(0),X0,Y0)
suma(X0,Y0,s(0)).
R2 {X1/0, Y1/X0, Y0/s(Z1)}
: suma(0,X0,Z1),
suma(X0,s(Z1),s(0)).
R1 {Z1/X0}
: suma(X0,s(X0),s(0)).
R1 {X0/0}
:.
X=0
Y=s(0)

R2 {X0/s(X3),Y3/s(X0),Z3/0}
: suma(X3,s(X0),0).
Fallo

Figura 7: rbol SLD correspondiente al sistema de ecuaciones


Por ejemplo, la lista cuyo nico elemento es se representa por y la lista cuyos elementos
son y se representa por . Para simplificar la notacin, Prolog admite escribir las
listas utilizando corchetes y separando sus elementos por comas; por ejemplo, las listas anteriores pueden escribirse como y , respectivamente. Para comprobar la correspondencia,
podemos utilizar la unificacin de Prolog ():











En el segundo ejemplo se observa que si es una lista, entonces es el primer elemento e
es el resto de la lista. En la escritura abreviada de listas en Prolog, dicho trmino puede escribirse
como . Otros ejemplos, usando dicha notacin son

Introduccin a la programacin lgica con Prolog

15

3.2.

Concatenacin de listas

Vamos a definir una relacin que se verifique si es la lista obtenida escribiendo los elementos de la lista a continuacin de los elementos de la lista . Por ejemplo,
se verifica si es . La definicin, por recursin en el primer argumento, puede hacerse mediante las siguientes reglas:
Si es la lista vaca, entonces la concatenacin de y es .
Si es una lista cuyo primer elemento es y cuyo resto es , entonces la concatenacin de
y es una lista cuyo primer elemento es y cuyo resto es la concatenacin de y .
Una representacin de las reglas da el siguiente programa



que puede simplificarse, introduciendo patrones en los argumentos,


Hay que resaltar la analoga entre la definicin de y la de s, Adems, como hicimos
en el caso de la s, podemos usar para resolver distintas cuestiones como
1. Cul es el resultado de concatenar las listas y ?.



2. Qu lista hay que aadirle al lista para obtener ?.



3. Qu dos listas hay que concatenar para obtener ?.

16

Jos A. Alonso

El rbol de deduccin correspondiente a la ltima cuestin se muestra en la Figura 8 (pgina 16)


en el que vuelve a resaltar la analoga con el correspondiente a la tercera cuestin de la s.
: conc(L0,M0,[a,b]).
R1 {L0/[],
B1/[a,b],
M0/[a,b]}

R2 {L0/[a|D1],
B1/M0,
E1/[b]}

:.
L=[]
M=[a,b]

: conc(D1,M0,[b]).
R1 {D1/[],
B2/[b],
M0/[b]}
:.

R2 {D1/[b|D2],
B2/M0,
E2/[]}
: conc(D2,M0,[]).

L=[a]
M=[b]

R1 {D2/[],
B3/[],
M0/[]}
:.
L=[a,b]
M=[]

Figura 8: rbol SLD de la concatenacin


La relacin est predefinida en Prolog como .

3.3.

La relacin de pertenencia

Vamos a definir una relacin rt que se verifique si es un elemento de la lista


. Para definirla basta observar que para que un elemento pertenezca a una lista tiene que ser
igual al primer elemento de la lista o tiene que pertenecer al resto de la lista

rt
rt rt
Puesto que la primera clusula no depende de la variable y la segunda no depende de la variable
podemos sustituirla por la variable annima . La definicin queda como

rt
rt rt
Con la relacin rt podemos determinar si un elemento pertenece a una lista, calcular los
elementos de una lista y determinar la forma de las listas que contengan un elemento, como se
muestra en los siguientes ejemplos

Introduccin a la programacin lgica con Prolog

17

rt
s
rt

rt


rt



s
En el ltimo ejemplo hay infinitas respuestas: una lista con como primer elemento, segundo,
tercero, etc. En las respuestas aparecen variables annimas internas (, , . . . ). El rbol
de deduccin se muestra en la Figura 9
: pertenece(a,L0).
R1 {X1/a,
L0/[a|_]}
:.

R2 {X1/a,
L0/[_|L1]}
: pertenece(a,L1).

L=[a|_]
R1 {X2/a,
L1/[a|_]}
:.

R2 {X2/a,
L1/[_|L2]}

: pertenece(a,L2).

L=[_,a|_]

Figura 9: rbol SLD del problema de pertenencia


La relacin rt est predefinida en Prolog como r.

4.

Disyunciones

Se pueden escribir disyunciones en Prolog usando el operador . De esta forma, la relacin


rt puede definirse por

18

Jos A. Alonso

rt rt
Desde el punto de vista deductivo, la anterior definicin se transforma en

rt
rt rt

5.

Operadores

Prolog permite la declaracin de operadores indicando su nombre, tipo y precedencia. Adems, dispone de un conjunto de operadores previamente declarados. Uno de ellos es el operador
que est declarado de tipo (que significa que es infijo (porque la est en el centro) y asocia
por la izquierda (porque la est a la izquierda)) y con precedencia 500. Podemos comprobar el
carcter infijo y la asociatividad mediante los siguientes ejemplos,

La siguiente tabla contiene otros operadores aritmticos predeclarados


Precedencia Tipo Operadores
500
,
500

400
,
200

Infijo asocia por la izquierda


Prefijo no asocia
Infijo asocia por la izquierda
Infijo asocia por la derecha

Podemos observar la diferencia de asociatividad entre y en los ejemplos siguientes

Introduccin a la programacin lgica con Prolog

19

Tambin podemos observar cmo se agrupan antes los operadores de menor precedencia

Se pueden definir operadores como se muestra a continuacin

st

st
Hemos declarado a st e como operadores infijos no asociativos y los hemos utilizado en
la escritura de la clusula. Podemos tambin usarlo en las consultas

s st
s
tr st
tr

6.

Aritmtica

Hemos visto en la seccin 5 cmo construir expresiones aritmticas. Tambin pueden evaluarse mediante s como se muestra a continuacin

s

s s


Cuando Prolog encuentra una expresin de la forma s (donde es un a variable y es una
expresin aritmtica), evala y le asigna su valor a . Adems de las operaciones, se disponen
de los operadores de comparacin , , y como operadores infijo.
Usando la evaluacin aritmtica podemos definir nuevas relaciones. Como ejemplo, veamos
una definicin de la relacin tr que se verifica si es el factorial de .

20

Jos A. Alonso

tr
tr

s
tr
s
Con la anterior definicin se pueden calcular factoriales

tr

El rbol de deduccin correspondiente se muestra en la figura 10

7.

Control mediante corte

Prolog dispone del corte () como mtodo para podar la bsqueda y aumentar la eficiencia
de los programas. Un caso natural en donde aplicar la poda es en los problemas con solucin
nica 2 . Por ejemplo, consideremos la relacin t que se verifica si es la calificacin
correspondiente a la nota ; es decir, es sss si es menor que , es r si es
mayor o igual que pero menor que , es t si es mayor que pero menor que e es
sobresaliente si es mayor que . Una definicin de t es

tsss
tr
tt
tsrst

Si calculamos la calificacin correspondiente a un ,

t
r

se genera el rbol de deduccin que se muestra en la Figura 11. Vemos que se realizan clculos
que no son necesarios:
cuando llega a la segunda rama, el objetivo ha fallado con lo que no es necesario
comprobar en la segunda rama que ,
cuando encuentra la solucin en la segunda rama y se pregunta por otras soluciones, debe
de responder sin necesidad de bsqueda porque la solucin es nica.
Estos clculos se pueden evitar modificando el programa introduciendo cortes
2 El

origen de es el smbolo matemtico (!x ) A( x ) que indica que existe un nico x tal que A( x ).

Introduccin a la programacin lgica con Prolog

: factorial(3,Y0).
R2 {X1/3, Y1/Y0}
: 3 > 1,
A1 is 31,
factorial(A1,B1),
Y0 is 3*B1.
Aritmetica {A1/2}
: factorial(2,B1),
Y0 is 3*B1.
R2 {X3/2, Y3/B1}
: 2 > 1,
A3 is 21,
factorial(A3,B3),
B1 is 2*B3,
Y0 is 3*B1.
Aritmetica

{A3/1}

: factorial(1,B3),
B1 is 2*B3,
Y0 is 3*B1.
R1 {B3/1}

R2 {Y5/1, Y5/B3}

: B1 is 2*1,
Y0 is 3*B1.

: 1 > 1,
A5 is 11,
factorial(A5,B5),
B3 is 1*A5,
B1 is 2*B3,
Y0 is 3*B1.

Aritmetica {B1/2,
Y0/6}
:.
Y=6

Aritmetica
Fallo

Figura 10: Deduccin del factorial

21

22

Jos A. Alonso

: nota(6,Y0).
R1 {X1/6,
Y0/suspenso}

R4 {X1/6,
Y0/sobresaliente}

R2 {X1/6,
Y0/aprobado}

: 6 >= 5,
6 < 7.

: 6 < 5.
Fallo

R3 {X1/6,
Y0/notable}

: 6 >= 7,
6 < 9.

: 6 >= 9.

Fallo

Fallo

:.
Y=aprobado

Figura 11: rbol SLD del problema de las notas

tsss

tr

tt

tsrst
Con la nueva definicin y la misma pregunta el rbol de deduccin es el que se muestra en la
Figura 12. Vemos que el efecto del corte es la eliminacin de las alternativas abiertas por debajo
: nota(6,Y0).
R1 {X1/6,
Y0/suspenso}
R2 {X1/6,
Y0/aprobado}

: 6 < 5, !.

R4 {X1/6,
Y0/sobresaliente}

R3 {X1/6,
Y0/notable}

: 6 < 7, !.

Fallo
: !,.
Y=aprobado

Figura 12: rbol SLD del problema de las notas con corte
del padre de la clusula que ha introducido ese corte.
Junto al aumento de la eficiencia, el corte supone una prdida del sentido declarativo de los
programas pudiendo producir respuesta no deseadas como la siguiente

Introduccin a la programacin lgica con Prolog

23

tsrst
s
Las respuestas correctas se obtienen cuando el primer argumento es un nmero y el segundo una
variable, lo que se puede indicar en la documentacin mediante t.
Otro uso del corte se da en los casos en los que se desea slo la primera solucin. Por ejemplo,
hemos visto que la relacin r permite determinar si pertenece a , pero una vez
finalizado si se pide otra solucin vuelve a buscarla

Si slo deseamos la primera solucin y que no busque otras, podemos usar la relacin r

La definicin de r es

r
r r

8.

Negacin

Mediante el corte se puede definir la negacin como fallo: para demostrar la negacin de
una propiedad P, se intenta demostrar P si se consigue entonces no se tiene la negacin y si no se
consigue entonces se tiene la negacin

P P
P

donde es un tomo que siempre es falso.


Vamos a explicar el comportamiento de la negacin en el siguiente programa

r sss tr
tr
trs
sss
y con las consultas

rs
s
r

24

Jos A. Alonso

La respuesta a la primera pregunta es la esperada: s est aprobado porque no figura entre


los suspensos y est matriculado. El correspondiente rbol de deduccin se muestra en la Figura
13 (pgina 24). Para demostrar que s no est suspenso intenta probar que s est suspenso,
: aprobado(luis).
R1 {X/luis}
: no(suspenso(luis)),
matriculado(luis).
No 1
{P/suspenso(luis)}
: suspenso(luis),
!, fail,
matriculado(luis).

No 2
{P/suspenso(luis)}
: matriculado(luis).

Fallo

R3
:.
Exito

Figura 13: rbol SLD con negacin (I))


al fallar (rama izquierda) da por demostrado que luis est suspenso (rama derecha).
La respuesta a la segunda pregunta parece contradecir a la primera. Su correspondiente rbol
de deduccin se muestra en la Figura 14 (pgina 25). La diferencia con la primera es la presencia
de variables libres. Si cambiamos el orden de las condiciones en la regla 1

r tr sss

y volvemos a preguntar

r
s
s
obtenemos la respuesta esperada: s est aprobado. Su rbol de deduccin se muestra en la
Figura 15.
La relacin de segundo orden (porque su argumento es una relacin) est predefinida en
Prolog mediante t o .
Como una aplicacin, vamos a estudiar las definiciones con negacin y con corte de la relacin predefinida t que se verifica si es la lista obtenida eliminando los elementos de unificables simultneamente con ; por ejemplo,

Introduccin a la programacin lgica con Prolog

25

: aprobado(X0).
R1 {X1/X0}
: not(suspenso(X0)),
matriculado(X0).
No 1
{P2/suspenso(X0)}
: suspenso(X0),
!, fail,
matriculado(X0).

No 2
{P2/suspenso(X0)}

R4 {X0/juan}
: !, fail,
matriculado(juan).
: fail,
matriculado(juan).
Fallo

Figura 14: rbol SLD con negacin (II))


: aprobado(X0).
R1 {X1/X0}
: matriculado(X0),
no(suspenso(X0)).
R2 {X0/juan}

R2 {X0/luis}

: no(suspenso(juan)).
No 1
{P3/suspenso(juan)}
: suspenso(juan),
!, fail.

: no(suspenso(luis)).

No 2 No 1
{P3/suspenso(luis)}
: suspenso(luis),
!, fail.

No 2
:.
X=luis

R4

Fallo

: !, fail.

: fail.
Fallo

Figura 15: rbol SLD con negacin (III))

26

Jos A. Alonso

La definicin de t usando negacin es

t
t

t
t
t
t
y, eliminando la negacin mediante corte, su definicin es

t
t

t
t
t
t
La segunda clusula puede simplificarse introduciendo la unificacin en sus argumentos

t t

9.

El condicional

En Prolog se dispone del condicional . Usando el condicional, se puede definir la relacin


t (pgina 20)

t



tr

sss
r
t
srst

donde el condicional est declarado como operador infijo (de menor precedencia que la disyuncin) y definido por

Introduccin a la programacin lgica con Prolog

P P

27

y la constante verdad (tr) est definida por

tr
El rbol de deduccin correspondiente a la pregunta t se muestra en la Figura 16 (pgina
27). El rbol es anlogo al de la definicin con corte del la Figura 12 (pgina 22).
: nota(6,Y0).
R1 {X1/6,
Y1/Y0}

R2 {X1/6,
Y1/Y0}

: 6 < 5 > Y0 = suspenso.


Def >

R3

R4

: 6 < 7 > Y0 = aprobado.


Def >

: 6 < 5, !, Y0 = suspenso.
Fallo

: 6 < 7, !, Y0 = aprobado.
Aritmetica
: !, Y0 = aprobado.

: Y0 = aprobado.
{Y0/aprobado}
: .
Y=aprobado

Figura 16: rbol SLD con condicional

10.

Predicados sobre tipos de trmino

Existen distintos predicados para comprobar los tipos de trminos: variables (r), tomos
(t), cadenas (str), nmeros (r) y trminos compuestos (). El predicado
t sirve para reconocer los trminos atmicos (es decir, a las variables, tomos, cadenas y
nmeros). Por ejemplo,

r
r
r
r
tt

s
s
s

28

Jos A. Alonso

11.

tt
t
t
t
r
r
r
s r

tt
t
t
t

s
s

s
s

s
s
s

s
s

Comparacin y ordenacin de trminos

Para comprobar si dos trminos son idnticos se dispone del operador . La relacin de
identidad es ms fuerte que la de unificacin como se comprueba en los siguientes ejemplos



s
Los trminos estn ordenados segn el siguiente orden (de menor a mayor):
las variables (de ms viejas a ms recientes),
los nmeros (segn sus valores),
los tomos (en orden alfabtico),
las cadenas (en orden alfabtico) y
los trminos compuestos (primero los de menor aridad y los de la misma aridad ordenados
segn el smbolo de funcin (alfabticamente) y sus argumentos (de izquierda a derecha)).
La relacin bsica de comparacin del orden de trminos es : la relacin se verifica si el trmino es anterior a en el orden de los trminos. Por ejemplo,

Introduccin a la programacin lgica con Prolog

29

s
s

s
s

s
s

s
s
s

Usando la relacin se puede definir la relacin r que se verifica si es la


lista obtenida ordenando de manera creciente los distintos elementos de . Por ejemplo,

r




s
r
rr
rsrs
rrsrsr
rrsrsr
rsrrsrr

rsrs

rsrs
rsrs
rsrs
rsrs

rsrs

30

Jos A. Alonso

El predicado predefinido correspondiente a r es srt.

12.

Procesamiento de trminos

La relacin se verifica si es una lista cuyo primer elemento es el functor del


trmino y los restantes elementos de son los argumentos de . Por ejemplo,

rs
r s
r s
rs
Como aplicacin de consideremos la relacin r que se verifica si y
son figuras geomtricas del mismo tipo y el tamao de la es el de la multiplicado por ,
donde las figuras geomtricas se representan como trminos en los que el functor indica el tipo
de figura y los argumentos su tamao; por ejemplo,

rtr
tr
rr
r
La definicin de r es

rrtrr
r rts
tstrtstrrts
r rts
donde tst se verifica si es la lista obtenida multiplicando cada elemento de por .

tst
tst
s
tst
Otras relaciones para el procesamiento de trminos son tr, que se verifica si
es el functor del trmino y es su aridad, y r, que se verifica si es el argumento del
trmino que ocupa el lugar ; por ejemplo,

tr
tr
tr
r
r
trrr

Introduccin a la programacin lgica con Prolog

13.

31

Procedimientos aplicativos

La relacin se verifica si es demostrable despus de aumentar el nmero de sus


argumentos con los elementos de ; por ejemplo, si rt es la relacin definida por,

rt s
entonces

rt

rt

rt

rt

La relacin se puede definir mediante

rst
r Prr
rstr
t Prr
t
La relacin stP se verifica si se cumple el predicado P sobre los sucesivos pares
de elementos de las listas y ; por ejemplo, si ssr es la relacin definida por

ssr r s
ssr r s
entonces

stssr
sts
stssr
stssr

La relacin st puede definirse mediante

st
st

st
Usando st se puede redefinir tst (pg. 30)

tst
strt

32

14.

Jos A. Alonso

Todas las soluciones

La relacin se verifica si es la lista de las instancias del trmino que


verifican el objetivo . La relacin st se verifica si es la lista ordenada sin repeticiones
de las instancias del trmino que verifican el objetivo . Por ejemplo,

rr

strr

str

r

s
str

En los ltimos ejemplos se observa la diferencia entre y st cuando no hay ninguna


instancia que verifique el objetivo. Otra diferencia ocurre cuando hay variables libres; por ejemplo,

r

str




El conjunto { : () r} puede calcularse con st


usando el cuantificador existencial ()

str

Mediante st se pueden definir las operaciones conjuntistas. Para facilitar las definiciones,
definimos la relacin st que es como st salvo en el caso en que ninguna instancia
de verifique , en cuyo caso es la lista vaca

st st
st
Las operaciones de interseccin, unin y diferencia se definen por

Introduccin a la programacin lgica con Prolog

33

trs
st r r

st r r
r
st r tr

Referencias
[1] I. Bratko. Prolog Programming for Artificial Intelligence. AddisonWesley, 3 edition, 2001.
[2] W. F. Clocksin y C. S. Mellish. Programming in Prolog. SpringerVerlag, 4 edition, 1994.
[3] R. A. OKeefe. The Cratf of Prolog. The MIT Press, 1990.
[4] L. Sterling y E. Shapiro. The Art of Prolog. MIT Press, second edition, 1994.
[5] T. Van Le. Techniques of Prolog Programming (with implementation of logical negation and quantified
goals). John Wiley, 1993.

También podría gustarte