So, how would you do my example, oo + 3 => oo, with pattern matching?

Aaron Meurer

On Wed, Jul 3, 2013 at 2:48 PM, Aaron Meurer <[email protected]> wrote:
> Brian, I think you dropped off list. Forwarding to sympy.
>
> Aaron Meurer
>
> On Wed, Jul 3, 2013 at 2:29 PM, Brian Granger <[email protected]> wrote:
>> I think that having multiple dispatch is something that is needed within
>> SymPy.  Multiple people have run into the difficulties with providing custom
>> Add/Mul logic for their new types.  In quantum, we just punted and used the
>> builtin Add/Mul logic, but it was a bad compromise to make.
>>
>> For this, I think looking at Mathematica is really important.  This is
>> handled by Mathematica's Rules and Patterns which are documented here:
>>
>> http://reference.wolfram.com/mathematica/guide/RulesAndPatterns.html
>> http://reference.wolfram.com/mathematica/tutorial/Introduction-Patterns.html
>>
>> If we don't have first class, nested and general pattern matching, we can't
>> do multiple dispatch.  The case in point is classes that accept *args such
>> as Add and Mul.  Good fast pattern matching would also allow us to do much
>> of the logic in Add/Mul constructors using patterns:
>>
>> Add(x_, x_) -> 2*x_
>> Mul(x_, x_)  -> x**2
>>
>> etc.
>>
>> Summary - simple type based dispatch won't do - we need full blown pattern
>> matching and transformation logic.
>>
>> Cheers,
>>
>> Brian
>>
>>
>> On Wednesday, July 3, 2013 10:27:19 AM UTC-7, Aaron Meurer wrote:
>>>
>>> No, Add(x, y, z, t) is not just used for fast construction. Any
>>> algorithm that recurses through an expression tree and rebuilds things
>>> will rebuild an Add in that way, using expr.func(*expr.args).
>>>
>>> Aaron Meurer
>>>
>>> On Wed, Jul 3, 2013 at 12:22 PM, Ondřej Čertík <[email protected]>
>>> wrote:
>>> > On Wed, Jul 3, 2013 at 11:15 AM, Aaron Meurer <[email protected]> wrote:
>>> >> I don't think it's so easy, because Add has *args.
>>> >
>>> > If you are talking about things like:
>>> >
>>> > In [2]: Add(x, x, x, y, x, x)
>>> > Out[2]: 5⋅x + y
>>> >
>>> > Then those are of course needed for fast construction many terms into
>>> > on Add, but this not really exposed to user's code and it is used
>>> > inside things like expand(). As such, we can provide a special static
>>> > method or function for doing the same. On the other hand, if you
>>> > write:
>>> >
>>> > x + x + x + y + x + x
>>> >
>>> > in Python, then Python itself will call Symbol.__add__ etc., so this
>>> > would work well with our new dispatch.
>>> >
>>> > --
>>> > You received this message because you are subscribed to the Google
>>> > Groups "sympy" group.
>>> > To unsubscribe from this group and stop receiving emails from it, send
>>> > an email to [email protected].
>>> > To post to this group, send email to [email protected].
>>> > Visit this group at http://groups.google.com/group/sympy.
>>> > For more options, visit https://groups.google.com/groups/opt_out.
>>> >
>>> >

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to