miércoles, 23 de enero de 2008

Cálculos Numéricos con Listas en Lenguaje Prolog (Primos, MCD, Combinatorios, ..)

%%%%%%%%%%%%%% CALCULOS NUMERICOS CON LISTAS %%%%%%%%%%%%%%%%

% Lista de naturales

lnat([0]).
lnat([A,B|C]):-lnat([B|C]),A is B+1.

%-----------------------------------------------------

% Ejercicio 3.2. Lista infinita de a's.

lia([a]).
lia([a|R]):-lia(R).

%-----------------------------------------------------

% Ejercicio 3.3. Lista de negativos.

l3([-1]).
l3([A,B|C]):-l3([B|C]), A is B-1.

%-----------------------------------------------------

% Ejercicio 7.7. Lista de multiplos

lmul(N,[N]).
lmul(N,[A,B|C]):-lmul(N,[B|C]),A is B + N.

%-----------------------------------------------------

% Ejercicio 3.12. N-esimo numero triangular

e312(N,M):-lnat([H|T]), len(T,N), sumalist([H|T],M).

sumalist([],0).
sumalist([H|T],N):-sumalist(T,M),N is H + M.

% o bien

e3122(0,0):-!.
e3122(X,Y):-X1 is X-1, e3122(X1,Y1), Y is Y1+X.

%-----------------------------------------------------

% Ejercicio 7.8. Lista de fibonaccis

lfib([1]).
lfib([1,1]).
lfib([A,B,C|R]):-lfib([B,C|R]), A is B+C.

% Para obtener un numero de fibonacci hay dos metodos ineficientes.

fib(0,1).
fib(1,1).
fib(N,M):-N>1,N1 is N-1, N2 is N-2, fib(N1,M1),fib(N2,M2),M is M1 + M2.

% o bien

fib2(N,M):-lfib([M|L]),len(L,N).

% La version eficiente es

fib3(N,M):-auxfib(N,M,_).

auxfib(0,1,_).
auxfib(1,1,1).
auxfib(N,M,M1):-N1 is N-1, auxfib(N1,M1,M2), M is M1+M2.

%-----------------------------------------------------

%Ejercicio 3.4 . Lista de numeros Primos


nat(0).
nat(X):-nat(Y), X is Y +1.

nodiv(_,[]).
nodiv(N,[H|T]):-X is N mod H,X\==0,nodiv(N,T).

sigprimo([H|T],N):-nat(R),N is H + R,nodiv(N,[H|T]),!.

primos([2]).
primos([A,B|T]):-primos([B|T]),sigprimo([B|T],A).


% Factores Primos de un numero

factores(N,L):-factores(N,[2],L).

factores(N,_,[]):-(N=0;N=1;N=1.0),!.
factores(N,[H|T],[H|L]):- 0 is N mod H,!,N1 is N / H,factores(N1,[H|T],L).
factores(N,[H|T],L):-sigprimo([H|T],H1),factores(N,[H1,H|T],L).


% maximo comun divisor de dos numeros

mcd(N1,N2,N3):-factores(N1,L1),factores(N2,L2),mcd(L1,L2,N3,1).

mcd([],_,N,N).
mcd(_,[],N,N).
mcd([H|T1],[H|T2],N,M):-M1 is M*H, mcd(T1,T2,N,M1).
mcd([H1|T1],[H2|T2],N,M):-H1mcd([H1|T1],[H2|T2],N,M):-H2
%-----------------------------------------------------

% Ejercicio 2.14. Numeros combinatorios y triangulo de Pascal.

% a)

c(_,0,1):-!.
c(M,M,1):-!.
c(M,N,R):-M1 is M-1, N1 is N-1,c(M1,N,A),c(M1,N1,B),R is A+B.

% b)

tr([X],[X]).
tr([X,Y|L],[H|T]):-H is X+Y,tr([Y|L],T).

f(0,[1]):-!.
f(M,[1|L]):- M1 is M-1, f(M1,L1), tr(L1,L).

% Version mas eficiente porque no se repiten calculos

c2(M,N,R):-f(M,L), ele(N,L,R).
ele(0,[H|_],H).
ele(N,[_|T],X):- N>0,N1 is N-1, ele(N1,T,X).

1 comentario:

Anónimo dijo...

no sirva factor primo, saludos!