/*
  Primera versión
 
  fibonacci_1(N,R)

  Predicado que comprueba si R es el N-ésimo número de Fibonacci

  Notas:
     Se usa la negación not
 
  Argumentos
  + N:
    - Significado: número natural
    - Tipo: entrada

  + R:
    - Significado: número natural
    - Tipo: entrada y salida

  Variable locales:
  + N1:
     - Significado: número natural
  + N2:
     - Significado: número natural

  + R1:
     - Significado: número natural
  + R2:
     - Significado: número natural

 Predicados relacionados
 fibonacci_2, fibonacci_3, fibonacci_4 
*/

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 versión
 
  fibonacci_2(N,R)

  Predicado que comprueba si R es el N-ésimo número de Fibonacci

  Nota:
     Si N es negativo entonces R toma el valor 1
 
  Argumentos
  + N:
    - Significado: número natural
    - Tipo: entrada

  + R:
    - Significado: número natural
    - Tipo: entrada y salida

  Variable locales:
  + N1:
     - Significado: número natural
  + N2:
     - Significado: número natural

  + R1:
     - Significado: número natural
  + R2:
     - Significado: número natural

 Predicados relacionados
 fibonacci_1, fibonacci_3, fibonacci_4 
*/
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 versión
 
  fibonacci_3(N,R)

  Predicado que comprueba si R es el N-ésimo número de Fibonacci

  Nota:
     Versión equivalente a la versión 1 pero usando el corte "!"
 
  Argumentos
  + N:
    - Significado: número natural
    - Tipo: entrada

  + R:
    - Significado: número natural
    - Tipo: entrada y salida

  Variable locales:
  + N1:
     - Significado: número natural
  + N2:
     - Significado: número natural

  + R1:
     - Significado: número natural
  + R2:
     - Significado: número natural

 Predicados relacionados
 fibonacci_1, fibonacci_2, fibonacci_4
*/
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 versión
 
  fibonacci_4(N,R)

  Predicado que comprueba si R es el N-ésimo número de Fibonacci

  Nota:
     Versión equivalente a la versión 2 pero usando el corte "!"
 
  Argumentos
  + N:
    - Significado: número natural
    - Tipo: entrada

  + R:
    - Significado: número natural
    - Tipo: entrada y salida

  Variable locales:
  + N1:
     - Significado: número natural
  + N2:
     - Significado: número natural

  + R1:
     - Significado: número natural
  + R2:
     - Significado: número natural

 Predicados relacionados
 fibonacci_1, fibonacci_2, fibonacci_3 
*/
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.
