Documente Academic
Documente Profesional
Documente Cultură
Facultat de Matemtiques
Universitat de Barcelona
PROGRAMACIN LGICA
1. INTRODUCCIN 4
1.1. Los computadores . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2. Los lenguajes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.1. El nacimiento de los lenguajes de programacin. . . . . . 7
1.2.2. El paradigma imperativo. . . . . . . . . . . . . . . . . . . 8
1.2.3. La orientacin a objetos . . . . . . . . . . . . . . . . . . 9
1.2.4. El paradigma declarativo. . . . . . . . . . . . . . . . . . . 9
1.2.5. El paradigma lgico. . . . . . . . . . . . . . . . . . . . . . 10
3. EL LENGUAJE PROLOG 27
3.1. Introduccin. El Prolog y los lenguajes declarativos. . . . . . . . 27
3.2. Evolucin histrica del Prolog. . . . . . . . . . . . . . . . . . . . 28
3.3. Elementos bsicos de Prolog. . . . . . . . . . . . . . . . . . . . . 28
3.3.1. Los hechos. . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.3.2. Las preguntas. . . . . . . . . . . . . . . . . . . . . . . . . 29
3.3.3. Las reglas. . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.3.4. La sintaxis. . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3.5. Las listas. . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3.6. La unicacin. . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3.7. Expresiones aritmticas. . . . . . . . . . . . . . . . . . . 32
3.4. El corte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.5. El backtracking. . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.6. Mecanismo de ejecucin del PROLOG. . . . . . . . . . . . . . . . 35
3.7. Especicaciones tcnicas y otros. . . . . . . . . . . . . . . . . . . 43
2
NDICE GENERAL 3
4. EJERCICIOS RESUELTOS. 44
4.1. Predicados predenidos. . . . . . . . . . . . . . . . . . . . . . . . 44
4.1.1. not/1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.1.2. select/3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.1.3. permutation/2 . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.4. length/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.5. append/3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.6. member/2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.7. write/1 y nl . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.1.8. El predicado subcjto. . . . . . . . . . . . . . . . . . . . . . 45
4.1.9. El predicado nat. . . . . . . . . . . . . . . . . . . . . . . . 46
4.2. Fibonacci. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.3. Ordenacin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.4. El jurado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.5. El vendedor viajero. . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.6. El problema de las ocho reinas. . . . . . . . . . . . . . . . . . . . 48
4.7. Problema de colorear un mapa. . . . . . . . . . . . . . . . . . . . 48
4.8. Resolver un sudoku . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Captulo 1
INTRODUCCIN
4
CAPTULO 1. INTRODUCCIN 5
Las operaciones del lgebra relacional que permiten generar nuevas relacio-
nes a partir de las existentes pueden ser reproducidas fcilmente en PROLOG.
Veremos algn ejemplo en el apartado de PROLOG: la conjuncin, la negacin,
la clusula vaca, etc.
Las gramticas.
El trmino procesamiento del lenguaje natural se reere a una forma res-
tringida del lenguaje humano. El lenguaje usado por los humanos en su totalidad
es demasiado complicado y ambiguo para ser tratado por un ordenador. En el
caso de los humanos la ambigedad es resuelta por el contexto y por muchos
aos de experiencia.
Como PROLOG tiene su origen en la lgica, es el lenguaje de programacin
ms apropiado para el tratamiento del lenguaje natural. De hecho, PROLOG
fue diseado originalmente para traducir lenguaje natural.
Bsicamente la tarea de procesar el lenguaje natural consiste en las siguientes
tres fases:
1. Anlisis lxico.
2. Anlisis sintctico.
3. Anlisis semntico.
Sistemas expertos.
Un sistema experto es un programa que se comporta como un experto para
algn dominio de aplicacin, normalmente reducido. Debe ser capaz de explicar
las decisiones que ha ido tomando y el razonamiento subyacente. Algunas veces
es interesante que los sistemas expertos manejen incertidumbre y conocimiento
incompleto.
Para el desarrollo de un sistema experto se distinguen tres mdulos: la base
de conocimiento, el motor de inferencia y la interfaz con el usuario. La base de
conocimiento contiene el conocimiento especco del dominio de la aplicacin, es
decir, un conjunto de hechos, un conjunto de reglas que denen relaciones en el
dominio, y mtodos, heursticos e ideas para resolver problemas en el dominio.
El motor de inferencia contiene los programas necesarios para manejar el co-
nocimiento de la base. La interfaz de usuario permitir una comunicacin fcil
y agradable entre el usuario y el sistema, proporcionando detalles del proceso
de resolucin del problema. El motor de inferencia y la interfaz de usuario se
pueden ver como un mdulo, que le llamaremos shell. Tericamente, el shell es
CAPTULO 1. INTRODUCCIN 12
LGICA DE PRIMER
ORDEN
1. x+y =7
2. (x + y = 7) ( xy < z)
Conectivos y cuanticadores: , , , , , ,
Auxiliares: parentesis y comillas( , ), ,
13
CAPTULO 2. LGICA DE PRIMER ORDEN 14
Ejemplo.
= c, f 2 , R1 V3 , c, f (V3 , c) son trminos
Ejemplo. f (V3 ) no es trmino.
Reglas de formalizacin
Todo A es B
x(Ax Bx)
Ningn A es B
x(Ax Bx)
Algn A es B
x(Ax Bx)
CAPTULO 2. LGICA DE PRIMER ORDEN 15
Algn A no es B
x(Ax Bx)
Ejemplo. Todos los esquiadores aman la montaa.
x(Ex Ax)
x(Ex Gx)
Ejemplo. Hay personas imprudentes y poco sensatas.
x(P x Ix Sx)
Ejemplo. Cuando alguien se muere, todos sus familiares se aigen.
Ejemplo. En la frmula
Denicin. Una frmula cerrada es una frmula sin variables libres. El ejemplo
anterior no es cerrada.
Ejemplo. La frmula
x(yRxy yRyx)
es cerrada.
CAPTULO 2. LGICA DE PRIMER ORDEN 16
Notacin:
Si D es un conjunto no vaco y n 1, escribimos Dn = {(x1 , ..., xn ) \x1 , ..., xn D }
Un operador de n argumentos sobre D es un subconjunto de Dn .
Si R es una relacin de n argumentos, pondremos Rx1 , ..., xn , en lugar de
(x1 , ..., xn ) R.
= a, b, f 2 , g 2 P 2
= a, f 2 , g 2 , P 2
Notacin:
Si I es una -interpretacin, pondremos:
= c, P 2 , Q2 , R2
1. 1 = P x0 Qx1 1 = P 2 Q1 = T F = F
2. 2 = Rx1 x2 Rx1 x3 2 = R12 R11 = V F = F
3. 3 = x0 Rcx0 n0 tal que Rcn0 = V n0 tal que R2n0 = V .
3 = V si n0 = 3 ( n0 = 1)
CAPTULO 2. LGICA DE PRIMER ORDEN 18
= {a,f 1 ,P 1 ,Q2 }
denimos I por:
B1 ... Bn A
I, I() = V I() = V
Tabla de equivalencias lgicas.
1.
( ) ( )
2.
3. ( ) ( )
( ) ( )
4. F
F F
V V
V
5.
( ) =
( ) =
( ) =
6. ( ) ( ) ( )
( ) ( ) ( )
7. xy yx
xy yx
8. x x
x x
9. x( ) x x
x( ) x x
Regla de resolucin.
1
2
1 , 2 clusulas y
Entradas, salida,
un resolvente de 1 , 2 .
Si 1 ,n , son clusulas, escribiremos. 1 , . . . , n `R si existe una
... ,
demostracin de , tomando a 1 ,..., n como premisas, utilizando nicamente
la regla de resolucin.
Acabamos de ver un algoritmo para efectuar la etapa (1). Para efectuar la etapa
(2) es suciente con aplicar las equivalencias bsicas para frmulas sin cuanti-
cadores. Y para efectuar la etapa (3) se procede de la siguiente manera. Sea
la frmula obtenida en (2). Entonces, si una cuanticacin existencial x del
prejo de no est precedida por ninguna cuanticacin universal, se sustituye
toda aparicin de x en el ncleo de por un nuevo smbolo de constante y se
elimina dicha cuanticacin existencial del prejo de . Y si una cuanticacin
existencial z del prejo de est precedida por n cuanticadores universales
x1 , ..., xn , entonces se toma un nuevo smbolo de funcin f de n argumen-
tos, se sustituye toda aparicin de z en el ncleo de por el trmino f (x1 , ..., xn )
y se elimina la cuanticacin existencial z del prejo de .
Ejemplo 1: Unicable.
Entradas: e1 = hcXf (f (Y )) y e2 = hZf (Z)f (U )
Inicialmente: p = [hcXf (f (Y )) = hZf (Z)f (U )], = [ ] y b = f alse
Empezamos el bucle:
6. Como la pila est vaca salimos del bucle con la b aun f alse. Por lo tanto,
salida = .
Ejemplo 2: No unicable.
Entradas: e1 = h(f (a), g(X)) y e2 = h(Y, Y ).
Inicialmente: p = [h(f (a), g(X)) = h(Y, Y )], = [ ] y b = f alse
Empezamos el bucle:
1. Sacamos de la pila h(f (a), g(X)) = h(Y, Y ), ahora tienen que unicar f (a)
con Y y g(X) con Y , lo aadimos a la pila y no cambia p = [f (a) =
Y, g(X) = Y ].
Denicin de resolvente.
Sean 1 , 2 clusulas de un lenguaje de predicados. Tomamos sustituciones
simples 1 , 2 tales que 1 1 , 2 2 no tengan ninguna variable en comn. Pa-
ra obtener un resolvente de 1 , 2 se sigue entonces uno de los dos siguientes
procesos:
1 = P f (Y ) Rg(Y )
2 = P f (g(a)) Qb
Siguiendo el proceso descrito anteriormente tenemos que,
Rg(g(a)) Qb
es un resolvente de 1 ,2 .
Regla de resolucin.
1
2
Entradas, 1 , 2 clusulas y salida, un resolvente de 1 , 2 .
En las demostraciones por resolucin, adems de utilizar la regla de resolu-
cin que acabamos de ver, se utiliza otra regla para simplicar las clusulas que
intervienen en dichas demostraciones.
Diremos que un miembro de de una clusula signo positivo, si
tiene
es un tomo. En caso contrario, diremos que tiene signo negativo. Si dos o
ms miembros con el mismo signo de una clusula son unicables y es un
unicador de dichos miembros obtenido mediante el algoritmo de unicacin,
diremos que es un f actor de .
Regla de simplicacin.
1
0
0
Entrada, clusula y salida, un factor de
.
Si1 , ... , n , son clusulas de un lenguaje de predicados, escribiremos.
1 , . . . , n `R si existe una demostracin de , tomando a 1 , ... , n como
premisas, utilizando nicamente las reglas de resolucin y simplicacin.
Recordemos que una frmula es cerrada, si no tiene ninguna variable libre.
Si 0 es una forma normal de Skolem de una frmula , denotamos por sk(0 )
0
al conjunto de smbolos de constante y smbolos de funcin que aparecen en
0
pero no en . Es decir, sk( ) es el conjunto de smbolos que tenemos que aadir
0
para construir la forma normal de Skolem .
Teorema de Resolucin.
Sean 1 , ... , n , frmulas cerradas de un lenguaje de predicados. Sean
01 , ... , 0n , 0 formas normales de Skolem de 1 , ... , n , respectivamente
CAPTULO 2. LGICA DE PRIMER ORDEN 26
tales que sk(01 ), ... , sk(0n ), sk(0 ) son conjuntos disjuntos dos a dos. Sean
1 , ..., k las clusulas que aparecen en los ncleos de 01 , ... , 0n , 0 . Entonces,
1989.
Captulo 3
EL LENGUAJE PROLOG
2003.
27
CAPTULO 3. EL LENGUAJE PROLOG 28
valioso(oro).
CAPTULO 3. EL LENGUAJE PROLOG 29
progenitor(laura, damian).
Las relaciones son valioso y progenitor. Los argumentos son oro, laura,
y damian. Los hechos acaban siempre con un punto. De estos hechos podemos
interpretar que el oro es valioso o que Laura es la madre de Damian. Aunque
tambin podra ser Damian el padre de Laura, el orden lo establece el progra-
mador, es arbitrario. Los nombres tambin son arbitrarios, y el programador
decidir la interpretacin que se haga de ellos.
Los hechos no tienen que reejar, necesariamente, el mundo real, pero ser
nica y exclusivamente lo que Prolog tomar como verdadero (no tiene ms
informacin que la que le demos en los hechos).
? progenitor(laura, damian).
PROLOG busca automticamente en la base de datos si existe un hecho que
se puede unicar (es decir, tiene el mismo nombre de relacin, el mismo nmero
de argumentos, y estos coinciden uno a uno) con el hecho que aparece en la
respuesta.
Observemos que una respuesta negativa a la pregunta no implica necesaria-
mente que el hecho sea falso, sino que no se puede probar (en general) que sea
verdadero con el conocimiento almacenado en la base de datos.
Se pueden realizar preguntas ms interesantes, como por ejemplo:
? progenitor(X, damian).
PROLOG, entonces, buscar en la base de datos cual podra ser el valor de la
variable X para que la pregunta sea armativa. La respuesta a la pregunta ser
negativa si no encuentra resultados, o el primer resultado encontrado. Pulsando
RETURN saldremos de la pregunta. Si antes escribimos ; y entonces puslamos
RETURN, nos ir dando, mientras existan, todas las respuestas que encuentre
en la base de datos.
En PROLOG disponemos tambin de la conjuncin de clusulas. La forma
de ponerlas es separndolas con una coma. Por ejemplo:
predecesor(X, Y ) : progenitor(X, Y ).
progenitor(V, Y ).
La denicin de varias reglas con el mismo nombre de relacin equivale en
Prolog a la disyuncin lgica. Pero la denicin de este conjunto de reglas es in-
nito para resolver este ejercicio, nunca terminaramos de escribirlo. Necesitamos
de una regla recursiva:
predecesor(X, Y ) : progenitor(X, Y ).
3.3.4. La sintaxis.
Primero de todo, veamos cuales son los tipos de objetos que trata un pro-
grama en Prolog.
Un tomo es el objeto ms simple y se denota empezando su identicador con
una letra minscula. Los tomos, junto a los nmeros (normalmente naturales
o enteros) forman las constantes.
Por otro lado tenemos las variables que pueden ser normales, las que hemos
visto hasta ahora, o la variable annima. La variable annima se representa por
_ y da a entender al programa que el valor que tome no es importante o que
es una variable que no unica con otra variable en la denicin. Por ejemplo:
tiene_un_hijo(X) : progenitor(X, Y ).
En este caso preguntamos si X tiene hijos, por lo que no interesa el nombre
de los hijos, solamente si los hay. Utilizaramos la variable annima _ en lugar
de la Y.
Las variables y las constantes son todos los posibles objetos simples. Los
dems objetos sern estructuras que relacionen algunas de las anteriores.
[a, b, c, d, e]
La representacin interna es con rboles binarios, donde la rama de la iz-
quierda es el primer elemento (cabeza) y la derecha es el resto(cola). La cola,
a su vez, est compuesta por cabeza y cola, y as sucesivamente, tal y como se
muestra en la gura de la derecha.
La cabeza y la cola de una lista se pueden separar con el smbolo |. Por
ejemplo, son equivalentes:
miembro(X, [X|_]).
concatenar([], L, L).
3.3.6. La unicacin.
La operacin ms importante sobre trminos es la unicacin. Dos trminos
pueden unicarse si son idnticos o las variables de ambos trminos pueden
instanciarse a objetos tales que, despu de la sustitucin de las variables por
esos objetos, los trminos sean idnticos. Por ejemplo:
V is E
Siendo V una variable y E una expresin. Si la expresin E es evaluable, se
unica su resultado con V , si no, fallo. Si V no est instanciada, se le asignar
el del resultado de E; si lo est, slo se compararan ambos valores.
Veremos algunos ejemplos en el captulo 4 de ejercicios resueltos en Prolog.
3.4. El corte.
El corte es un predicado predenido, cuya sintaxis es ! y cuyo comporta-
miento es el siguiente. Supongamos denido el predicado a con las siguientes
clusulas:
a : b, !, c.
En el caso de que b sea falso, ya no se comprobar si lo es c. El corte acta
como barrera para no hacer comprobaciones innecesarias.
CAPTULO 3. EL LENGUAJE PROLOG 34
Pero hay otros usos para el corte. En el ejemplo anterior hemos visto que nos
sirve para no buscar soluciones en predicados alternativos. Tambin podemos
combinar corte y fallo, o bien que no necesitemos mas soluciones.
not(P ).
En este caso, si P es cierto, falla (fail). Si es falso pasa a la siguiente clusula
que resuelve correctamente.
Slo es necesaria la primera solucin.
Cuando se encuentra una solucin al problema no se buscan ms. Por ejem-
plo si programramos, que resolviramos un sudoku, puede que nos interese
solamente una solucin. Con lo que al nal del predicado haramos una conjun-
cin con la expresin !, para que cortara el programa en caso de encontrar una
solucin al problema.
3.5. El backtracking.
En los lenguajes de programacin con paradigma lgica, y en particular en
el PROLOG, las instrucciones se ejecutan normalmente en orden secuencial,
es decir, una a continuacin de otra, en el mismo orden en que estn escritas,
que slo vara cuando se alcanza una instruccin de control (un bucle, una
instruccin condicional o una transferencia).
Los programas en PROLOG se componen de cl
ausulas de Horn. No obs-
tante, la forma de escribir las clusulas de Horn es al contrario de lo habitual.
Primero se escribe el consecuente y luego el antecedente. El antecedente puede
ser una conjuncin de condiciones que se denomina secuencia de objetivos. Ca-
da objetivo se separa con una coma. En el PROLOG no existen instrucciones
de control (if, while, etc). Su ejecucin se basa en dos conceptos: la unicacin
(explicada en el apartado 3.3.5) y el backtracking .
Gracias a la unicacin, cada objetivo determina un subconjunto de clusulas
susceptibles de ser ejecutadas. Cada una de ellas se denomina punto de eleccin.
Como ya hemos visto, PROLOG selecciona el primer punto de eleccin y sigue
ejecutando el programa hasta determinar si el objetivo es verdadero o falso.
En el caso de ser falso, o de querer seguir buscando ms soluciones, entra
el juego el backtracking, que consiste en deshacer todo lo ejecutado situando el
programa en el mismo estado en el que estaba justo antes de llegar al punto de
eleccin. Entonces se toma el siguiente punto de eleccin que estaba pendiente
y se repite de nuevo el proceso. Si los computos para los objetivos terminan, lo
hacen bien en xito o en fracaso.
En el ltimo ejemplo del apartado 3.9 podemos ver ejemplos de backtracking
al buscar ms de una solucin para el mismo objetivo.
CAPTULO 3. EL LENGUAJE PROLOG 35
Ejemplos de ejecucin:
Ejemplo 1. Selecciona al ltimo elemente de una lista.
Programa:
ultimo([X], X).
ultimo([X|L], Y ) : ultimo(L, Y ).
Objetivo:
ultimo([17, 3, 10], X)
ultimo([X 0 ], X 0 ).
inversa1([ ], L0 , L0 ).
comparamos la parte izquierda de la clusula con el objetivo y tenemos,
L0 = [c, b, a] , sustituimos L0 por [c, b, a] y entonces, L = [c, b, a].
La parte derecha de la cusula est vaca, por lo tanto la salida es y el
resultado L = [c, b, a].
Objetivo:
ultimo(60, 42, A)
mcd(X, 0, X).
padre(abraham, isaac).
padre(isaac, jacob).
CAPTULO 3. EL LENGUAJE PROLOG 39
padre(jacob, benjamin).
ant(X, Y ) : padre(X, Y ).
Habiamos visto tres tipos de clsulas: los hechos, las reglas y las preguntas.
En este caso podemos distinguir las clusulas con relacin padre, que son
hechos, las clusulas con relacin ant (antepasado), que son reglas, y el
objetivo sera una pregunta.
Vemos que para que X sea antepasado de Y es necesario, tal y como indican
las clusulas, que X sea padre de Y o bien que exista un Z tal que X sea
padre de Z y Z antepasado de Y.
Objetivo:
ant(abraham, A)
En este caso buscamos soluciones para A tales que abraham sea su antepa-
sado. Es decir, las respuestas deberan ser los descendientes de abraham.
ant(X, Y ) : padre(X, Y ).
padre(abraham, isaac).
ant(X, Y ) : padre(X, Y ).
padre(isaac, jacob).
padre(jacob, benjamin).
12. Hacemos backtracking hasta el ltimo punto de eleccin (paso 10). To-
memos ahora la quinta clusula. Recordemos que el objetivo vuelve a ser
ant(benjamin, A).
EJERCICIOS RESUELTOS.
4.1.1. not/1
Ya habamos denido este predicado cuando hablbamos de corte. El predi-
cado not() tiene xito cuando todos los cmputos del interpretador de Prolog
para el objetivo terminan y dan fallo. Usamos el corte para que pare cuando
uno de los cmputos de cierto, ya que para que sea exito han de ser todos fallo.
not(P ) : call(P ), !, f ail.
not(P ).
4.1.2. select/3
El predicado select(X, L1, L2) genera la lista L2 extrayendo de la lista L1
una aparicin de X.
Se extrae por orden cada elemento de L1, y lo insertamos en L2 (segun-
da clusula), hasta que encontramos X, entonces slo la extraemos de L1 sin
insertarla en L2 (segunda clusula).
select(X, [X|Xs], Xs).
extract(X, [Y |Y s], [Y |Zs]) : extract(X, Y s, Zs).
44
CAPTULO 4. EJERCICIOS RESUELTOS. 45
4.1.3. permutation/2
permutation(L, P ) devuelve en P una permutacin de los ele-
El predicado
mentos de lista L.
Supongamos que la lista tiene n elementos, la idea es generar las permuta-
ciones los elementos extrayendo uno de ellos mediante extract/3 y generando
las permutaciones de orden inferior (n 1 elementos) a las que se aade por la
cabeza el elemento seleccionado con extract/3.
permutation(Xs, [Z|Zs]) : extract(Z, Xs, Y s), permutation(Y s, Zs).
permutation([], []).
4.1.4. length/2
El predicado length(L, N ) devuelve en N el nmero de elementos de la lista
L. Simplemente, de forma recursiva, va calculando la longitud de la misma lista
quitando un elemento en cada paso de la recursin.
length([ ], 0).
length([_|L], N ) : length(L, M ), N is M + 1.
4.1.5. append/3
El predicado append(L1, L2, L3) devuelve en L3 la concatenacin de L1 con
L2.
append([ ], L, L).
append([X|L1], L2, [X|L3]) : concat(L1, L2, L3).
4.1.6. member/2
En el apartado de listas en Prolog hemos visto un ejemplo dnde escribamos
un predicado miembro(X, L) para saber si un elemento X es un elemento de la
lista L. El predicado predenido member(X, L) tiene esta misma funcin.
member(X, [X|_]).
member(X, [_|L1]) : miembro(X, L1).
4.1.7. write/1 y nl
El predicado write(X) devuelve el valor de X .
El predicado nl escribe una lnea en blanco.
4.2. Fibonacci.
Se trata de escribir un predicado f ib(N, F ) que signique: F es el N-simo
nmero de Fibonacci para la N>0 dada. Denimos los nmeros de bonacci
como: f ib(1) = 1, f ib(2) = 1, f ib(N ) = f ib(N 1) + f ib(N 2).
f ib(1, 1).
f ib(2, 1).
f ib(N, F ) : N > 2, N 1 is N 1, N 2 is N 2, f ib(N 1, F 1), f ib(N 2, F 2), F is F 1+
F 2.
4.3. Ordenacin.
Programaremos un algoritmo de ordenacin de listas de nmeros basado en
elmerge sort. Est demostrado que es un algoritmo ptimo llegando a hacer
como mucho n logn comparaciones.
particion([ ], [ ], [ ]).
particion([A], [A], [ ]).
particion([A, B|R], [A|Ra], [B|Rb]) : particion(R, Ra, Rb).
ord_f us([ ], [ ]).
ord_f us([X], [X]).
ord_f us([X, Y |L], L3) : particion([X, Y |L], L1, L2), ord_f us(L1, L11),
ord_f us(L2, L22), f usion(L11, L22, L3).
f usion(L, [ ], L).
f usion([ ], L, L).
f usion([X|L1], [Y |L2], [X|L3]) : X =< Y, f usion(L1, [Y |L2], L3).
f usion([X|L1], [Y |L2], [Y |L3]) : X > Y, f usion([X|L1], L2, L3).
4.4. El jurado.
Un juez tiene que formar un jurado con N personas, de manera que ningn
miembro del jurado conozca a ningn otro miembro. Para eso dispone de M
personas candidatas (identicadas con nmeros de 1 a M) y de una lista de
aquellos pares de personas que no se conocen, expresada como un programa
Prolog formado por clusulas no_conoce(Pi , Pj )., donde 1 Pi < Pj M .
Una tabla precalculada (a partir de un mapa del pas) con las distancias
mnimas entre cada par de ciudades, representada mediante clusulas Pro-
log de la forma:
dist(gir, tar, 200).
dist(tar, gir, 200).
dist(tar, bcn, 100).
dist(bcn, tar, 100).
...
Ntese que el espacio de bsqueda es exponencial. En este caso hay 981 asigna-
ciones posibles.
La estrategia ingnua para resolver este tipo de problemas consiste en enu-
merar todas las posibles conguraciones y comprobar si alguna de ellas cumple
todas las restricciones (sera un algoritmo de fuerza bruta). Como es lgico,
se obtendra un coste computacional exponencial o superior.
Una notable mejora son los algoritmos de vuelta atrs, en los que se constru-
yen tupals parciales X1 , ..., Xj que cumplen las restricciones para las variables
involucradas. Si al aadir una nueva variable Xj+1 ms a la tubla con un cierto
valor se viola alguna restriccin, dicha tupla parcial no se completa y se ensaya
un nuevo valor para Xj+1 . Con ello se recorta bastante el espacio de bsqueda.
Los algoritmos de resolucin de restricciones suponen una mejora adicional
sobre las tcnicas de vuelta atrs debido a que mantienen siempre las restriccio-
nes en la forma ms simplicada posible y de forma que siempre sean satisfacti-
bles. Tienen adems diversas estrategias que les permiten ordenar las variables
y la enumeracin de valores de forma dinmica, buscando siempre podar al
mximo los estados a explorar.
Bibliografa
[2] R. Pea Mar.De Euclides a Java: Historia de los algoritmos y de los lengua-
jes de programacin. 1 edicin. Madrid: Nivola, 2006. ISBN-10: 84-96566-
14-5. ISBN-13: 978-84-96566-14-9.
51