Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PROLOG
Prolog1: Hechos y Reglas
1. El siguiente fragmento incluye un conjunto de declaraciones bsicas sobre
una familia y una regla que indica si X es progenitor de Y:
progenitor(fernando ,juan).
progenitor(luisa ,juan).
progenitor(luisa ,maria).
progenitor(luisa ,diego).
progenitor(fernando ,pepe).
progenitor (pepe , pedro ).
progenitor(pedro ,ana).
progenitor (pedro , belen ).
hombre(juan ).
hombre(fernando ).
hombre ( pepe ) .
hombre( diego ).
hombre(pedro ).
mujer( luisa ).
mujer ( pepa ) .
mujer( belen ).
mujer(ana).
Compilar el programa y realizar las siguientes consultas:
a) Se cumple que fernando es el progenitor de pepe?
b) Hay alguien que sea progenitor de ana?
c)Hay alguien que sea progenitor de fernando?
d) Hay alguien que sea a la vez progenitor de pepe y de juan?
Prolog2: Listas
Una lista est vacia o est compuesta por un primer elemento
(head) y una cola la cual es una lista adems.. En Prolog
representamos la lista vacia por el tomo [] y una lista no vaca por
el trmino [H|T] donde H denota la cabeza y T denota la cola.
1.01 (*) Encontrar el ultimo elemento de una lista.
Ejemplo:
?- my_last(X,[a,b,c,d]).
X=d
1.02 (*) Encontrar el penultimo elemento de una lista.
1.03 (*) Encontrar el K-esimo elemento de una lista.
El primer elemento en la lista es el nmero 1.
Ejemplo:
?- element_at(X,[a,b,c,d,e],3).
X=c
1.04 (*) Encontrar el nmero de elementos de una lista.
1.05 (*) Invertir una lista.
1.06 (*) Descubrir si una lista es un palindrome.
Un palindrome puede ser leido de adelante hacia atras o atrs hacia
adelante
; p.e. [x,a,m,a,x].
1.07 (**) Aplanar una lista de listas.
Transformar una lista, posiblemente manteniendo listas como
elementos dentro de una lista plana, reemplazando cada lista con
2
LABORATORIO NRO 02 3
LABORATORIO NRO 02 5
?- range(4,9,L).
L = [4,5,6,7,8,9]
1.23 (**) Extraer un nro dado de elementos seleccionados al
azar de una lista.
Los items seleccionados deben ser colocados en la lista resultado.
Ejemplo:
?- rnd_select([a,b,c,d,e,f,g,h],3,L).
L = [e,d,a]
Tip: Use el generador de nros aleatorios random y los resultados
del problema 1.20.
1.24 (*) Lotto: Dibuje N diferentes nros aleatorios de un
conjunto 1..M.
Los nros seleccionados deben ser colocados en la lista resultado.
Ejemplo:
?- rnd_select(6,49,L).
L = [23,1,17,33,21,37]
Tip: Combine las soluciones de los problemas 1.22 y 1.23.
1.25 (*) Genere una permutacion aleatoria de elementos de una
lista.
Ejemplo:
?- rnd_permu([a,b,c,d,e,f],L).
L = [b,a,d,c,e,f]
Tip: Use la solucion del problema 1.23.
1.26 (**) Genere las combinaciones de K distintos objectos
escogidos de N elementos de una lista.
En cuantas formas puede un comit de 3 ser escogido de un grupo
de 12 personas? Todos sabemos que hay C(12,3) = 220
posibilidades (C(N,K) denota el conocido coeficiente polinomial).
Para los matemticos este resultado puede ser maravilloso. Pero
nosotros queremos generar todas las posibilidades (via
backtracking).
Ejemplo:
?- combination(3,[a,b,c,d,e,f],L).
L = [a,b,c] ;
L = [a,b,d] ;
6
LABORATORIO NRO 02 7
L = [a,b,e] ;
...
1.27 (**) Agrupe los elementos de un conjunto en subconjuntos
disjuntos.
a) En cuantas maneras puede un grupo de 9 trabajar en 3
subgrupos disjuntos de 2, 3 y 4 personas? Escribe un predicado que
genere todas las posibilidades via backtracking.
Ejemplo:
?- group3([aldo,beat,carla,david,evi,flip,gary,hugo,ida],G1,G2,G3).
G1 = [aldo,beat], G2 = [carla,david,evi], G3 = [flip,gary,hugo,ida]
...
b) Generalice el predicate de la parte a) de tal forma que podamos
especificar una lista de tamaos de grupos y el predicado retorne
una lista de grupos.
Ejemplo:
?- group([aldo,beat,carla,david,evi,flip,gary,hugo,ida],[2,2,5],Gs).
Gs = [[aldo,beat],[carla,david],[evi,flip,gary,hugo,ida]]
...
Note que no queremos permutaciones de miembros del grupo; es
decir [[aldo,beat],...] es la misma solucion que [[beat,aldo],...]. Sin
embargo, hacemos una diferencia entre [[aldo,beat],[carla,david],...]
y [[carla,david],[aldo,beat],...].
Encontraras mas sobre problemas combinatorios en un buen libro
de matematicas discretas bajo el trmino coeficientes
multinomiales.
1.28 (**) Ordenar una lista de listas de acuerdo a la longitud de
las sublistas
a) Suponemos que una lista (InList) contiene elementos que son
tambien listas. El objetivo es ordenar los elementos de InList de
acuerdo a su longitud.
Por ejemplo, las listas cortas al inicio, las mas largas luego, o vice
versa.
Ejemplo:
?- lsort([[a,b,c],[d,e],[f,g,h],[d,e],[i,j,k,l],[m,n],[o]],L).
L = [[o], [d, e], [d, e], [m, n], [a, b, c], [f, g, h], [i, j, k, l]]
7
Prolog3: Aritmtica
2.01 (**) Determinar si un nmero entero dado es primo.
Ejemplo:
?- is_prime(7).
Yes
2.02 (**) Determinar los factores primos de un entero positivo
dado.
Construya una lista plana que contenga los factores primos en
rden ascendente.
Ejemplo:
?- prime_factors(315, L).
L = [3,3,5,7]
2.03 (**) Determinar los factores primos de un entero positivo
dado (2).
Construya una lista que contenga los factores primos y su
multiplicidad.
Ejemplo:
?- prime_factors_mult(315, L).
8
LABORATORIO NRO 02 9
L = [[3,2],[5,1],[7,1]]
Tip: La solucion del problema 1.10 puede ser de ayuda.
2.04 (*) Una lista de nmeros primos.
Dado un rango de enteros por sus lmites inferior y superior,
construya una lista de todos los nmeros primos en este rango.
2.05 (**) La conjetura de Goldbach.
La conjetura de Goldbach dice que cada nmero positivo par mayor
a 2 es la suma de 2 nmeros primos. Ejemplo: 28 = 5 + 23. Es uno
de los ms Famosos hechos en la teoria de nmeros que no ha
podido ser probado en el caso general. Ha sido numricamente
confirmado hasta un nmero bastante grande (mucho mayor que
lo que podemos calcular con el Prolog). Escribir un predicado para
allar 2 nros primos que sumen un nmero entero par dado.
Ejemplo:
?- goldbach(28, L).
L = [5,23]
2.06 (**) Una lista de las composiciones Goldbach.
Dado un rango de enteros por sus lmites inferior y superior,
imprimir una lista de todos los nmeros pares y su composicin
Goldbach.
Ejemplo:
?- goldbach_list(9,20).
10 = 3 + 7
12 = 5 + 7
14 = 3 + 11
16 = 3 + 13
18 = 5 + 13
20 = 3 + 17
En la mayora de los casos, si un nmero par est escrito como la
suma de 2 nmeros primos, uno de ellos es bastante pequeo.
Raramente los primos son ambos grandes mayores digamos que
50. Trata de hallar cuantos de esos casos hay en el rango de
1..2000.
Ejemplo (para un lmite de 50):
?- goldbach_list(1,2000,50).
992 = 73 + 919
9
1382 = 61 + 1321
1856 = 67 + 1789
1928 = 61 + 1867
2.07 (**) Determinar el MCD de 2 enteros positivos.
Use el algoritmo de Euclides.
Ejemplo:
?- gcd(36, 63, G).
G=9
Defina gcd como una funcin aritmtica; as puedes usarla de esta
manera:
?- G is gcd(36,63).
G=9
2.08 (*) Determinar si 2 nmeros enteros positivos son
coprimos.
Dos nmeros son coprimos si su MCD es 1.
Ejemplo:
?- coprime(35, 64).
Yes
2.09 (**) Calcular la funcin totient de Euler phi(m).
La funcin de Euler's es definida como el nmero de enteros
positivos r (1 <= r < m) que son coprimos con m.
Ejemplo: m = 10: r = 1,3,7,9; as phi(m) = 4. Note el caso especial:
phi(1) = 1.
?- Phi is totient_phi(10).
Phi = 4
Descubra cual es el valor de phi(m) si m es un nmero primo. La
funcin totient de Euler juega un importante rol en uno de los ms
amplios mtodos criptogrficos de clave pblica (RSA). En este
ejercicio debes usar el mtodo ms primitivo para calcular esta
funcin. Hay una manera interesante que deberas usar al resolver
el problema 2.10.
2.10 (**) Calcula la funcin totient de Euler phi(m) (2).
Mira el problema 2.09 para la definicin de la funcin totient de
Euler. Si la lista de factores primos de un nmero m es conocida en
la forma del problema 2.03 entonces la funcin phi(m) puede ser
10
1
LABORATORIO NRO 02 1
1
LABORATORIO NRO 02 3
13