Programación Declarativa – Curso 2008-09 I.T. Informática de Gestión - Universidad de Jaén Ejemplos en PROLOG Ejemplo 2: Cribar los doses y cribar los treses. Críbense los doses y críbense los treses; es la criba de Eratóstenes, cuando los múltiplos se subliman, son primos los números que quedan. Anónimo
Un número primo es un número que no tiene divisores enteros excepto el 1 y él mismo. Por ejemplo, 5 es primo, pero 15 no lo es porque tiene como divisor el número entero 3. Un método para generar números primos se llama la Criba de Eratóstenes . Este método, para cribar números primos hasta el entero N, funciona de la siguiente manera: 1. 2. 3. 4. 5.
Poner todos los números entre 2 y N en la “criba”. Seleccionar y quitar el menor número que quede en la criba. Incluir dicho número en la lista de números primos. Retirar de la criba todos los múltiplos de ese número. Si la criba no está vacía, repetir los pasos 2 al 5.
Para traducir estas reglas a PROLOG, definimos el predicado enteros para generar una lista de enteros, un predicado criba para examinar cada elemento de la criba, y un predicado retirar para crear una nueva criba sin los múltiplos del número seleccionado en la criba. Esta nueva criba se devuelve a criba. El predicado primos es el objetivo de nivel superior, de forma que primos(N, L) instancia L a la lista de primos entre 1 y N, ambos inclusive:
primos(Limite, Ps) :enteros(2, Limite, Es), criba(Es, Ps). enteros(Bajo, enteros(Bajo, Alto, [Bajo | Resto]) :Bajo =< Alto, !, M is Bajo + 1, enteros(M, Alto, Resto). enteros(_, _, [ ]). criba([ ], [ ]). criba([E | Es],[E | Ps]) :- retirar(E, Es, Nueva), criba(Nueva, Ps). retirar(P, [ ], [ ]). retirar(P, [E | Es], [E | Nes]) :not (0 is E mod P), !, retirar(P, Es, Nes). retirar(P, [E | Es], Nes) :0 is E mod P, !, retirar(P, Es, Nes).
– 1 – 1 –
Continuando con el tema aritmético, he aquí unos programas en PROLOG para la formulación recursiva de los algoritmos de Euclides para encontrar el máximo común divisor y el mínimo común múltiplo de un par de enteros. El objetivo mcd(I, J, K) se cumple cuando el máximo común divisor de I y J es
K. El objetivo mcm(I, J, K) se cumple cuando el mínimo común múltiplo de I y J es K.
mcd(I, 0, I). mcd(I, J, K) :- R is I mod J, mcd(J, R, K). mcm(I, J, K) :- mcd(I, J, R), K is (I * J)/R. Obsérvese que, debido a la forma de calcular los restos, estos predicados no son “reversibles”, es decir, las variables I y J deben estar instanciadas para que los predicados funcionen.
– 2 –