#!/usr/bin/python

def factorial (n):
          
    def factorial_tr (n, p): # n > 0
        # INV: n_0 >= 0 /\ n_0! = n!*p
        if n == 0:
            return p
        else:
            return factorial_tr (n-1, n*p)
    # def factorial_tr ends here
    
    if isinstance(n, int):
        if n < 0:
            print 'Factorial undefined for negative integers'
            return None
        elif n == 0:
            return 1
        else: # n:int > 0
            return factorial_tr (n, 1)
    else: # n is not an integer
        print 'Factorial not defined for reals'
        return None

print factorial (5)
