
/* Primera version: fibonacci_1*/

fibonacci_1(0,1).
fibonacci_1(1,1).

fibonacci_1(N,R):-
      not(N=0),
      not(N=1),
	  N1 is N-1,
	  N2 is N-2,
	  fibonacci_1(N1,R1),
	  fibonacci_1(N2,R2),
	  R is R1 + R2.


/* 
 * Segunda version: fibonacci_2 
 * Si N es negativo entonces se le asigna el valor 1
 */

fibonacci_2(N,1):- N =< 1.

fibonacci_2(N,R):-
      not(N =< 1),
	  N1 is N-1,
	  N2 is N-2,
	  fibonacci_2(N1,R1),
	  fibonacci_2(N2,R2),
	  R is R1 + R2.
	

/*
 * Tercera version: fibonacci_3 
 * Versión equivalente a la versión 1 pero usando el corte
 */

fibonacci_3(0,1):-!.
fibonacci_3(1,1):-!.

fibonacci_3(N,R):-
	N1 is N-1,
	N2 is N-2,
	fibonacci_3(N1,R1),
	fibonacci_3(N2,R2),
	R is R1 + R2.


/* 
 * Cuarta version: fibonacci_4 
 * Versión equivalente a la versión 2 pero usando el corte
 *
 */

fibonacci_4(N,1):- N =< 1, !.

fibonacci_4(N,R):-
	N1 is N-1,
	N2 is N-2,
	fibonacci_4(N1,R1),
	fibonacci_4(N2,R2),
	R is R1 + R2.