/*
  Primera versión
 
  factorial_1(N,R)

  Predicado que comprueba si R es el factorial de N, es decir, R = N!

  Notas:
     Se usa la negación not
     No controla los valores negativos de N
 
  Argumentos
  + N:
    - Significado: número natural
    - Tipo: entrada

  + R:
    - Significado: número natural
    - Tipo: entrada y salida

  Variable locales:
  + N1:
     - Significado: número natural
  + R1:
     - Significado: número natural

 Predicados relacionados
 factorial_2, factorial_3, factorial_4
*/

factorial_1(0, 1).

factorial_1(N,R):- 
		not(N = 0),
		N1 is N - 1,
    	  	factorial_1(N1,R1),
      		R is N * R1.
      	


/*
  Segunda versión
 
  factorial_2(N,R)

  Predicado que comprueba si R es el factorial de N, es decir, R = N!

  Notas:
      Si N es no positivo entoces R vale 0
      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
  + R1:
     - Significado: número natural


 Predicados relacionados
 factorial_1, factorial_3, factorial_4
*/

factorial_2(N, 1):- N =< 0.

factorial_2(N,R):- 
		not(N =< 0),
		N1 is N - 1,
    		factorial_2(N1,R1),
      		R is N * R1.

      	



/*
  Tercera versión
 
  factorial_3(N,R)

  Predicado que comprueba si R es el factorial de N, es decir, R = N!

  Notas:
       Esta versión es equivalente a la primera, pero utiliza el corte
       No controla los valores negativos de N

  Argumentos
  + N:
    - Significado: número natural
    - Tipo: entrada

  + R:
    - Significado: número natural
    - Tipo: entrada y salida


  Variable locales:
  + N1:
     - Significado: número natural
  + R1:
     - Significado: número natural


 Predicados relacionados
 factorial_1, factorial_2, factorial_4
*/
factorial_3(0,1):-!.

factorial_3(N,R):- 
		N1 is N - 1,
		factorial_3(N1,R1),
		R is N * R1.



/*
  Cuarta versión
 
  factorial_4(N,R)

  Predicado que comprueba si R es el factorial de N, es decir, R = N!

  Notas:
       Esta versión es equivalente a la segunda, pero utiliza 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
  + R1:
     - Significado: número natural


 Predicados relacionados
 factorial_1, factorial_2, factorial_4
*/

factorial_4(N, 1):- N =< 0, !.  

factorial_4(N,R):- 
		N1 is N - 1,
    	factorial_4(N1,R1),
      	R is N * R1.

