sagemath / sage

Main repository of SageMath
https://www.sagemath.org
Other
1.43k stars 479 forks source link

Operands and Operator of symbolic expressions #10169

Open simon-king-jena opened 14 years ago

simon-king-jena commented 14 years ago

I think that for all symbolic expression s should hold

sage: s == s.operator()(*s.operands())

That currently does not work, for two reasons.

  1. There may be no operator at all:
sage: print x.operator()
None
sage: x.operands()
[]

I believe there should instead be an identity operator.

  1. The list of operands may be longer than what the operator accepts:
sage: s = 0.001*x^2+0.01*x+0.1*sin(1.01*x)+1
sage: s.operands()
[0.00100000000000000*x^2, 0.0100000000000000*x,
0.100000000000000*sin(1.01000000000000*x), 1]
sage: s.operator()(*s.operands())
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call
last)

/home/king/<ipython console> in <module>()

TypeError: op_add expected 2 arguments, got 4 

Compare this thread at sage-devel.

CC: @eviatarbach

Component: symbolics

Keywords: operator operands symbolics

Issue created by migration from https://trac.sagemath.org/ticket/10169

simon-king-jena commented 14 years ago

Description changed:

--- 
+++ 
@@ -33,3 +33,4 @@
 TypeError: op_add expected 2 arguments, got 4 

+Compare this thread at sage-devel.

eviatarbach commented 11 years ago
comment:4

Note to self: after this is fixed (or at least just the arithmetic operators), simplify_hypergeometric should be added to simplify_full. Now it cannot be added because it will sometimes raise errors due to this bug.

eviatarbach commented 11 years ago
comment:5

Burcin, is there a problem with setting the sum operator to Expression.add, for example? I don't understand why we have to define new functions representing the arithmetic operators.

rwst commented 9 years ago
comment:10

This will not work with some symbolic functions because they may have been called with the hold=True keyword, and calling them again doesn't know about it. See also #17849. The solution of that ticket in line with this one would be to make keywords into operands (strings?, a dedicated class OperatorKeyword?).

Another possible solution would be to abandon the hold keyword and introduce a hold context, see #10035.