Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Acumuladores
Captulo 8, The Art of Prolog
ACUMULADORES
Acumuladores
Iteracin y recursin
Prolog utiliza la recursin para especificar algoritmos iterativos y recursivos. Recursin:
Mantenimiento del stack frame por cada llamada recursiva inconclusa. N llamadas requieren un espacio de memoria de orden N.
Iteracin:
Utiliza espacio de memoria constante independiente del nmero de iteraciones.
Acumuladores
Iteracin y recursin
Prolog maneja variables lgicas, no variables de almacenamiento. Para implementar algoritmos iterativos, que guardan resultados intermedios, se agregan nuevos argumentos a los procedimientos: acumuladores. Uno de los valores intermedios constituye el resultado de la iteracin. Este valor unifica con la variable resultado en la clusula unitaria del procedimiento.
Programacin Lgica | InCo | FIng | UDELAR
Acumuladores
Iteracin y recursin
Factorial iterativo:
factorial(N); I is 0; T is 1; while I < N do I is I + 1; T is T * I; end; return T.
Factorial en Prolog:
% factorial(+N, ?F) % F es el factorial % del entero N. factorial(N, F) :factorial(0,N,1,F). factorial(I,N,T,F) :I < N, I1 is I+1, T1 is T*I1, factorial(I1,N,T1,F). factorial(N,N,F,F).
Acumuladores
Iteracin y recursin
Factorial en Prolog:
Fase de inicializacin. La reduccin de cada objetivo corresponde a una iteracin del loop while.
% factorial(+N, ?F) % F es el factorial % del entero N. factorial(N, F) :factorial(0,N,1,F). factorial(I,N,T,F) :I < N, I1 is I+1, T1 is T*I1, factorial(I1,N,T1,F). factorial(N,N,F,F).
Acumuladores
Acumuladores
Acumuladores
Acumuladores
tr u e
Output: N=2
Acumuladores
tr u e
Output: N=2
Acumuladores
Acumuladores
Producto interno
Producto interno sin acumuladores:
inprod([X|Xs],[Y|Ys],IP) :inprod(Xs,Ys,IP1), IP is X*Y+IP1. inprod([],[],0).
Acumuladores
Fibonacci
Fibonacci sin acumuladores:
fib(1,1). fib(2,2). fib(N,M) :N1 is N-1, N2 is N-2, fib(N1,M1), fib(N2,M2), M is M1+M2.
Acumuladores
Fibonacci
Fibonacci iterativo:
fib(N); if N == 1 return(1); else if N == 2 return(2); else A = 1; B = 2; for I = 1 to N aux = A+B; A = B; B = aux; end return(B); end
Acumuladores
h i
Acumuladores
Acumuladores
path(X,X,[X]). path(X,Y,[X|P]) :- edge(X,N), path(N,Y,P). ?- path(a,i,X). X = [a,c,f,h,i] ; X = [a,c,f,i] ; false. Programacin Lgica | InCo | FIng | UDELAR
Acumuladores
Acumuladores
Acumuladores
Acumuladores
Acumuladores
Acumuladores
{P=[x|_G235]}
path(x,u,[x],_G235)
{_G235=[_G236|_G237]}
edge(x,_G236), notmember(_G236,[x]), path(_G236,u,[_G236|[x]],_G237)
{_G236=y}
path(y,u,[y,x],_G237)
{_G237=[_G238|_G239]}
edge(y,_G238), notmember(_G238,[y,x]), path(_G238,u,[_G238|[y,x],_G239)
{_G238=z}
path(z,u,[z,y,x],_G239)
{_G238=u}
path(u,u,[u,y,x],_G239)
{_G239=[_G240|_G241]}
edge(z,_G240), notmember(_G240,[z,y,x]), path(_G240,u,[_G240|[z,y,x]],_G241)
{_G239=[]}
path(u,u,[u,y,x],[])
{_G240=x}
notmember(x,[z,y,x]) f
{_G240=v}
path(x,u,[v,z,y,x],_G241) f
tr u e
Output: P=[x,y,u]