cambia el codigo de prolog para que la serie fibonacci tenga un tope, que si pongo por ejemplos 50, que me de toda la seria hasta topar con 50, como parametros se debe de pasar el numero de tope y el nombre de la lista resultante fibonai(0,0). fibonai(1,1). fibonai(N,X) :- N > 1, N1 is N-1, fibonai(N1,X1), N2 is N-2, fibonai(N2,X2), X is X1+X2. i(N1,X1), N2 is N-2, fibonai(N2,X2), X is X1+X2.
Aquí tienes una versión modificada del código Prolog para calcular la serie de Fibonacci hasta un tope dado y almacenarla en una lista resultante:
fibonacci(0, [0]) :- !. fibonacci(1, [0, 1]) :- !. fibonacci(N, Result) :- N > 1, fibonacci(N, [0, 1], Result). fibonacci(2, [X1, X2], [X1, X2]) :- !. fibonacci(N, [X1, X2 | Tail], Result) :- N1 is N - 1, N2 is X1 + X2, fibonacci(N1, [N2, X1, X2 | Tail], Result). fibonacci(N, Result) :- N > 2, fibonacci(N, [0, 1], Result).
Para usar este código, simplemente llama a fibonacci
con el número de tope y el nombre de la lista resultante que deseas obtener. Por ejemplo, si deseas encontrar la serie de Fibonacci hasta el número 50 y almacenarla en la lista "Resultado", puedes hacerlo de la siguiente manera:
?- fibonacci(50, Resultado).
Esto generará la lista "Resultado" con la serie de Fibonacci hasta el tope de 50.
me salen estas advertencias Warning: c:/prolog/e2.pl:13: Warning: Clauses of fibonacci/2 are not together in the source-file Warning: Earlier definition at c:/prolog/e2.pl:1 Warning: Current predicate: fibonacci/3 Warning: Use :- discontiguous fibonacci/2. to suppress this message y al intentar ejecutar tengo los errores: ?- fibonacci(50, Resultado). ERROR: Stack limit (1.0Gb) exceeded ERROR: Stack sizes: local: 1Kb, global: 0.9Gb, trail: 0Kb ERROR: Stack depth: 144,832, last-call: 100%, Choice points: 4 ERROR: In: ERROR: [144,832] system:is(_230074748, <compound (+)/2>) ERROR: [144,831] user:fibonacci(-144770, [length:144,822], _230074778) ERROR: [10] user:fibonacci(50, _230074804) ERROR: [9] '$toplevel':toplevel_call('<garbage_collected>') ERROR: [8] '$toplevel':stop_backtrace('<garbage_collected>', _230074842) ERROR: ERROR: Use the --stack_limit=size[KMG] command line option or ERROR: ?- set_prolog_flag(stack_limit, 2_147_483_648). to double the limit.
El problema que estás enfrentando es debido a la recursividad de la función, que está superando el límite de la pila de Prolog. Te recomendaría usar un enfoque iterativo en lugar de recursivo para calcular la serie de Fibonacci.
Además, Prolog pone todas las cláusulas con la misma aridad (número de argumentos) juntas. Tienes definiciones diferentes de fibonacci/2
en tu programa, lo que está causando las advertencias.
Aquí tienes una versión modificada del código Prolog que debería funcionar para calcular la serie de Fibonacci hasta un número de tope dado y almacenarla en una lista resultante:
fib_to_limit(Limit, List) :- fib(Limit, [_, 1], [1, 0], List). fib(Limit, [A, _], _, [A]) :- A =< Limit, !. fib(Limit, [A, B], [C, D], List) :- Next is B + A, ( Next =< Limit -> fib(Limit, [Next, A], [B, A], Remaining), List = [A | Remaining] ; List = [A] ).
usar este código, simplemente llama a fib_to_limit
con el número de tope y el nombre de la lista resultante que deseas obtener. Por ejemplo, si deseas encontrar la serie de Fibonacci hasta el número 50 y almacenarla en la lista "Resultado", puedes hacerlo de la siguiente manera:
?- fib_to_limit(50, Resultado). ` Esto generará la lista "Resultado" con la serie de Fibonacci hasta que algún elemento exceda el número .
2.10 Suma parcial de una lista el codigo solo considera numeros enteros, modificarlo para que puede resivir listas suma_parial_1(L1,X,L2) :- subonjunto(L1,L2), suma_lista(L2,X).
Para que tu código también pueda manejar listas que contienen números decimales, necesitas asegurarte de que la función que suma la lista (suma_lista
) puede manejar adecuadamente los números decimalesAquí hay una versión del código que debería funcionar con números enteros y decimales:
suma_parial_1(L1,X,L2) :- subonjunto(L1,L2), suma_lista(L2,X). sum_list([], 0). sum_list([H|T], Sum) :- sum_list(T, Rest), Sum is H + Rest. subconjunto([], []subconjunto([E|Tail], [E|NTail]):- subconjunto(Tail, NTail). subconjunto([_|Tail], NTail):- subconjunto(Tail, NTail).
La función suma_lista
aquí debería sumar correctamente los números enteros y decimales. En cuanto a las funciones suma_parial_1
y subonjunto
, permanecen igual ya que su funcionalidad no cambia si los números de la lista son enteros o decimales.