derivatives of Max() and Min() using Heaviside()

modified:   sympy/functions/elementary/miscellaneous.py
modified:   sympy/functions/elementary/tests/test_miscellaneous.py

* added fdiff for Min() and Max()
* added diff Min() and Max()
* implement simple tests of Max().diff and Min().diff
* use ArgumentIndexError for assertions in fdiff
Include SympifyError in __init__.py
Bidirectional facts between (non)negative, (non)positive, and (non)zero.

We already have, in sympy/core/assumptions.py:

real        == negative | zero | real
nonpositive == real & !positive
nonnegative == real & !negative
nonzero     == !zero

(Note that either nonnegative or nonpositive imply real.)

From these we can derive the following bidirectional facts between
negative, positive, zero and nonnegative, nonpositive, nonzero:

negative == nonpositive & nonzero
positive == nonnegative & nonzero
zero     == nonnegative & nonpositive

With the addition of the above bidirectional facts for negative, positive
and zero to sympy/core/assumptions.py we now correctly obtain the truth
value when setting some assumptions to False, for example:

>>> Symbol("x", positive=False, real=True).is_nonpositive
True
>>> Symbol("x", nonpositive=False, real=True).is_positive
True
Don't return None from inequalities.

Fixes issue 3564.
Implement is_bounded, is_finite, is_zero for Float().

Float always returns a Float, with the exception of Float('fnan')
which returns S.NaN. This is in contrast to e.g. Rational, which
returns instances of S.Zero, S.Infinity, and so on, given the args.
Thus we can have a zero float or a infinite float. This should be
reflected when we check the assumptions on these objects.

Fixes issue 2486.
More tests for inequalities.
Avoid chaining nontransitive comparisons. Use `and` instead.
Rely on .is_unbounded rather than comparing to S.(Negative)Infinity

Fixes a pypy failure:

dirac:~/git/sympy  $ cat my/pypy.py
from sympy import Float, S

print Float('+inf') in (S.Infinity,)
dirac:~/git/sympy  $ python my/pypy.py
True
dirac:~/git/sympy  $ pypy my/pypy.py
False
Merge pull request #1707 from zanzibar7/Max_and_Min_Derivatives

derivatives of Max() and Min() using Heaviside()
Merge pull request #1727 from asmeurer/SympifyError

Include SympifyError in __init__.py
Merge pull request #1743 from jrioux/assumptions

Assumptions