Add is_real functionality for factorial, Fix issue #8658

Factorial function don't have the is_real functionality (check or real) to check this Assumption.
factorial(x) is not known to be real when  'x' is non-negative.

With this PR, user can check if the given factorial is real or not.
Fixes #8658 

The main Reason for so many if's and elif is to deal with the case of not None (which returns True.)
I think we don't have a bool to check not integer.

If we check (not integer and negative) then:
if integer returns none and negative returns True then : (not None and True) is equivalent to (True and True) = True, and this gives wrong result.