Sie sind auf Seite 1von 2

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. Poner todos los números entre 2 y N en la “criba”.
2. Seleccionar y quitar el menor número que quede en la criba.
3. Incluir dicho número en la lista de números primos.
4. Retirar de la criba todos los múltiplos de ese número.
5. 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, 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–
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–

Das könnte Ihnen auch gefallen