Implementación de Algoritmos Clásicos en Prolog: Triángulo de Pascal, Conjetura de Goldbach y Manipulación de Listas

Clasificado en Matemáticas

Escrito el en español con un tamaño de 5,02 KB

Colección de Predicados Fundamentales en Prolog

Este documento presenta una colección de implementaciones en Prolog para resolver problemas clásicos de matemáticas y manipulación de estructuras de datos (listas), utilizando la potencia de la programación lógica y la recursividad.

Implementación del Triángulo de Pascal

Predicados para generar el nivel N del Triángulo de Pascal.

nivel_pascal(1, [1]).
nivel_pascal(2, [1, 1]).
nivel_pascal(N, Nivel) :-
    N > 2,
    N1 is N - 1,
    nivel_pascal(N1, NivelAnterior),
    siguiente_nivel(NivelAnterior, Nivel).

siguiente_nivel([1], [1, 1]).
siguiente_nivel([X|T], [1|R]) :-
    siguiente_nivel_aux([X|T], R).

siguiente_nivel_aux([1], [1]).
siguiente_nivel_aux([X,Y|T], [S|R]) :-
    S is X + Y,
    siguiente_nivel_aux([Y|T], R).

fila(N, Fila) :-
    nivel_pascal(N, Fila).

Operaciones de Conjuntos: Cálculo de la No Intersección

Predicados para encontrar los elementos que no son comunes entre dos listas (diferencia simétrica implícita, calculada en dos pasos).

Verificación de Pertenencia

miembro(X,[X|_]).
miembro(X,[_|Y]):-
    miembro(X,Y).

Cálculo de la No Intersección

nointer([],_,[]).
nointer([X|Y],L2,[X|R]):-
    \+miembro(X,L2),
    nointer(Y,L2,R).
nointer([X|Y],L2,R):-
    miembro(X,L2),
    nointer(Y,L2,R).

nointercomp(L1,L2,R):-
    nointer(L1,L2,R1),
    nointer(L2,L1,R2),
    concatenar(R1,R2,R).

Teoría de Números y Predicados Primos

Conjetura de Goldbach

Implementación para encontrar dos números primos (P1 y P2) cuya suma sea igual a un número par N (mayor que 2).

goldbach(N,P1,P2):-
    N>2,
    0 is N mod 2,
    P2aux is N-2,
    auxgoldbach(N,P1,P2,2,P2aux).

auxgoldbach(N,P1,P2,P1aux,P2aux):-
    primo(P1aux),
    primo(P2aux),
    P1 is P1aux,
    P2 is P2aux.

auxgoldbach(N,P1,P2,P1aux,P2aux):-
    P1aux2 is P1aux+1,
    P2aux2 is P2aux-1,
    P2aux2>=2,
    auxgoldbach(N,P1,P2,P1aux2,P2aux2).

Verificación de Números Primos

primo(X):-
    X>1,
    nodiv(2,X).

nodiv(N,N).
nodiv(N,X):-
    0 =\= X mod N,
    N1 is N+1,
    nodiv(N1,X).

Obtener Primos por Debajo de un Número

primos(N,X):-
    es_primo(2,N,X).

es_primo(I,S,X):-
    I=

Reducción de Cadenas (Run-Length Encoding)

Predicado redcad para comprimir una lista de elementos consecutivos, indicando el elemento y su conteo (similar a la codificación Run-Length Encoding).

redcad([],[]).
redcad([X],[X,1]).
redcad([X,X|Y],[X,C|Y2]):-
    redcad([X|Y],[X,C1|Y2]),
    C is C1+1.
redcad([X,Y|Z],[X,1|R]):-
    X\=Y,
    redcad([Y|Z],R).

Implementación de la Sucesión de Collatz

Predicados para calcular la longitud de la secuencia de Collatz para un número dado o para un rango de números.

collatz(S,S,S,NP):-
    conjetura(S,0,NP).
collatz(I,S,N,NP):-
    I1,
    0 is N mod 2,
    D is N/2,
    C1 is Cont+1,
    conjetura(D,C1,R).
conjetura(N,Cont,R):-
    N>1,
    D is (3*N)+1,
    C1 is Cont+1,
    conjetura(D,C1,R).

Predicados Fundamentales para la Manipulación de Listas

Concatenación de Listas

concatenar([],L,L).
concatenar([X|L1],L2,[X|L3]):-
    concatenar(L1,L2,L3).

Obtener Primeros Elementos (Todos menos el Último)

primeros([_],[]).
primeros([X|Y],[X|Y2]):-
    primeros(Y,Y2).

Obtener Último Elemento de una Lista

ultimo([X],X).
ultimo([_|X],U):-
    ultimo(X,U).

Eliminación de Elementos Repetidos de una Lista

borrar_repes([],[]).
borrar_repes([X|Y],[X|L]):-
    borrartodos(X,Y,L1),
    borrar_repes(L1,L).

borrartodos(X,[],[]).
borrartodos(X,[X|Y],Y2):-
    borrartodos(X,Y,Y2).
borrartodos(X,[Y|Z],[Y|Y2]):-
    X\=Y,
    borrartodos(X,Z,Y2).

Aplanar una Lista

Nota: Esta implementación parece incompleta o incorrecta para aplanar listas anidadas de forma general, ya que la segunda cláusula aplanar([X|Y],[X|Y]) detiene la recursión prematuramente.

aplanar([],[]).
aplanar([X|Y],[X|Y]).
aplanar([L,Y|L1],C):-
    concatenar(L,[Y],C),
    aplanar(L1,C).

Prefijos y Sufijos de una Lista

Predicados para generar o verificar prefijos y sufijos.

Prefijos

prefijo([_|_],[]).
prefijo([X],[X]).
prefijo([X|Y],[X|Y2]):-
    prefijo(Y,Y2).

Sufijos

sufijo([_],[]).
sufijo([X|Y],[X|Y]).
sufijo([_|Y],L):-
    sufijo(Y,L).

Rotación de Listas N Posiciones a la Derecha

rotarNderecha(L,0,L).
rotarNderecha(L,1,R):-
    rotar_derecha(L,R).
rotarNderecha(L,N,R):-
    N>1,
    N1 is N-1,
    rotar_derecha(L,R1),
    rotarNderecha(R1,N1,R).

rotar_derecha(L,R):-
    primeros(L,P),
    ultimo(L,U),
    concatenar([U],P,R).

Entradas relacionadas: