By the way, I am also +1 for all 4, based on my pull from your github
branch.

Aaron Meurer

On Jul 22, 11:00 am, "Aaron S. Meurer" <asmeu...@gmail.com> wrote:
> On Jul 22, 2009, at 1:10 AM, Fabian Pedregosa wrote:
>
>
>
>
>
>
>
> > Aaron S. Meurer wrote:
> >> How do you actually attach assumptions to variables?  The old style
> >> keyword argument to Symbol doesn't seem to work.  I know that you can
> >> pass Assume objects to query(), but is there a way to globally define
> >> x as positive?
> >> In [1]: x = Symbol('x', positive=True)
>
> > Hi Aaron. There is a way to define global assumptions, although I
> > haven't used it much:
>
> > In [1]: register_global_assumptions(Assume(x, positive=True))
>
> > In [2]: query(x, positive=True)
> > Out[2]: True
>
> I see.  Whenever we get this merged, will Symbol('x', positive=True)  
> call register_global_assumptions on x?  If so, that will be fine.
>
>
>
>
>
> > you can then clear them with clear_global_assumptions(). I'll add this
> > info to doc/src/modules/queries.txt
>
> >> In [2]: query(x, positive=True)
> >> <returns None>
>
> >> In [3]: Assume(x, positive=True)
> >> Out[3]: Assume(x, positive=True)
>
> >> In [4]: query(x, positive=True)
> >> <returns None>
>
> >> In [5]: sqrt(x**2)
> >> Out[5]: x
>
> >> In [6]: sqrt(y**2)
> >> Out[6]:
> >>    ⎽⎽⎽⎽
> >>   ╱  2
> >> ╲╱  y
>
> >> In [9]: Assume(y, positive=True)
> >> Out[9]: Assume(y, positive=True)
>
> >> In [10]: sqrt(y**2)
> >> Out[10]:
> >>    ⎽⎽⎽⎽
> >>   ╱  2
> >> ╲╱  y
>
> > The new system won't reduce expressions based on assumptions. This  
> > will
> > be done by a function called refine (see mathematica's Refine)
>
> >> So the reduction of sqrt(x**2) comes from the old assumptions, not  
> >> the
> >> new ones.  I realize that not everything is implemented yet, but it
> >> seems that at least [4] should return True.
>
> > Yes, the price to pay in exchange is a small sacrifice in speed.  
> > That is
> > why methods in the core should not use query() directly. They should
> > test properties based on class membership and leave assumption-related
> > simplification to refine().
>
> >> For example, in Maple, typing assume(x, positive) changes the  
> >> variable
> >> x to be positive everywhere.  You can also use "assuming" to only
> >> assume for one expression:
>
> >>> x;
> >>                                       x
> >>> assume(x, positive);
> >>> x;
> >>                                       x~ (the tilde indicates that x
> >> has an assumption on it)
> >>> is(x, positive);
> >>                                     true
> >>> coulditbe(x, negative);
> >>                                     false
> >>> sqrt(x**2)
> >>                                       x~
> >>> sqrt(y**2) assuming y::positive;
> >>                                       y
> >>> sqrt(y**2);
> >>                                       (1/2)
> >>                                   / 2\
> >>                                   \y /
>
> >> Seehttp://www.maplesoft.com/support/help/view.aspx?path=assumefor
> >> more info on the Maple assumptions system.
>
> >> The actual querying of facts seems to work well when you pass
> >> assumptions to query().
> >> In [1]: Assume(x, negative=True, positive=True)
> >> AssertionError: ('inconsitency between facts', {'real': True,
> >> 'nonzero': True, 'commutative': True, 'nonpositive': False,
> >> 'positive': True, 'negative': False, 'nonnegative': True, 'zero':
> >> False, 'complex': True, 'imaginary': False}, 'negative', True)
>
> >> In [2]: query(x, real=True, assumptions=Assume(x, positive=True)) #
> >> this always bothered me for not working in the old assumption system.
> >> Out [2]: True
>
> >> query() seems to be like the Maple is().  Will we also have something
> >> like Maple's coulditbe()?
>
> > I am not familiar with Maple, but since query() returns None when it
> > can't say, I think coulditbe() is just:
>
> See my link above for more info on Maple's assumptions system.
>
>
>
> > In [1]: def coulditbe(*args, **kwargs):
> >    ...:     _q = query(*args, **kwargs)
> >    ...:     if (_q is True) or (_q is None): return True
> >    ...:     return False
>
> > In [2]: register_global_assumptions(Assume(x, positive=True))
>
> > In [3]: coulditbe(x, negative=True)
> > Out[5]: False
>
> > If this is correct, then I don't think it is worth to implement  
> > coulditbe
>
> coulditbe() returns True if there are any values of the variables that  
> make the expression true.  Maple also has is(), which only returns  
> true if all values of the variables make the expression true. about()  
> will print the exact assumptions.
> For example in Maple:
>  > assume(x, integer);
>  > coulditbe(x/2, integer);
>                                      true
>  > is(x/2, integer);
>                                      false
>  > about(x);
> Originally x, renamed x~:
>    is assumed to be: integer
>
> In your branch, query seems to take a middle approach.  It returns  
> True if it is always True, but None if it is not always True, but not  
> always False either (or if it cannot determine), and False if it is  
> always False.  Is this correct.
>
> In [2]: query(x/2, integer=True, assumptions=Assume(x, integer=True))
> <returns None>
>
> It is also common have inequalities as arguments to coulditbe():
>  > assume(x, positive);
>  > coulditbe(x < 1);
>                                      true
>  > is(x < 1);
>                                      false
>  > coulditbe(x < 0);
>                                      false
>
> query() doesn't seem to support this yet, unless I am doing it wrong:
> In [3]: query(Ge(x, 1), assumptions=Assume(x, positive=True))
> KeyError: 'popitem(): dictionary is empty'
>
> I'm trying to think of an example of something that Maple could give  
> your more information with its two functions than your single query()  
> function.  The only thing I can think of is the overloading of None in  
> query to mean both that it cannot determine and that it could be True  
> or False for different values.  What do you think?
>
> Aaron Meurer
>
>
>
>
>
> > Regards,
>
> >> Aaron Meurer
> >> On Jul 21, 2009, at 2:02 PM, Fabian Pedregosa wrote:
>
> >>> In this    series of 4 patches, I implement a new query system.
>
> >>> You can    also pull from my repo, branch master:
>
> >>> git pullhttp://fseoane.net/git/sympy.gitmaster
>
> > --
> >http://fseoane.net/blog/
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sympy-patches" group.
To post to this group, send email to sympy-patches@googlegroups.com
To unsubscribe from this group, send email to 
sympy-patches+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sympy-patches?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to