Possible incongruence in Sympy when assuming positive numbers
Question: Using Sympy package version 1.0 on Python 2.7.11 I found what (to me) is an
incongruence. This is the code I'm using:

    
    
    import sympy as sy
    from sympy.stats import Normal, density
    from sympy.assumptions import assuming, Q, ask
    
    sy.init_printing()
    
    a = sy.symbols('a', real=True)
    with assuming(Q.positive(a)): 
        print ask(Q.positive(a))
        N = Normal('N', 0, a)
    

What I got is

    
    
    True
    

from the first print as expected but an exception when creating the Normal
object

    
    
    ValueError: Standard deviation must be positive
    

Can anyone, please, explain if it is intended to be like this and why? Thanks!

PS: I'm aware that I could declare the symbols to be positive


Answer: The problem is simple: there are two assumptions systems in SymPy, called the
old-style and new-style assumptions. They don't interact quite well, yet.

The old-style assumptions define predicates on symbols, e.g.

    
    
    x = Symbol("x", positive=True)
    

deduction is then performed on generic expressions with methods such as
`.is_positive`

    
    
    >>> x.is_positive
    True
    

The latest version of SymPy has linked the old-style assumptions to the new-
style ones, so you can now query

    
    
    >>> ask(Q.positive(x))
    True
    

Older versions of SymPy would return `None`, as the two assumptions systems
were not linked at all.

The problem is that this relation is **not yet** reciprocal: the old-style
assumptions system is not aware of assumptions defined with the new-style
assumptions system. You can verify it yourself:

    
    
    >>> with assuming(Q.positive(y)):
    ...    print y.is_positive    
    None
    

The random variable _Normal_ requires the standard deviation parameter to be
positive, verification is done with the old-style assumptions. Therefore your
case fails.

Note that the positivity condition on the standard deviation is likely to get
relaxed to a non-negativity condition in the next SymPy version (that is,
allow the positivity-indefinite case to be accepted).

