# simply_full for expressions with exponents

Hello,

I am new to sage and I am trying to simplify some expression. If I try:

var('a'); h = 2^(a - 2) * 3^(a + 3) / 6^a; h.simplify_full();

I get 27 / 4 which is right. However if I try

var('a'); h = (2^(a - 2) * 3^(a + 3) / 6^a == 27 / 4); h.simplify_full();

I get (27/4) == (27/4). I don't understand why I do not get the answer True in this case.

edit retag close merge delete

Sort by » oldest newest most voted

This is because of the way the Sage type system works. When you ask Sage to simplify an equation, it tries to do just that: it tries to find a simpler expression. It doesn't change an equation into a boolean truth value. In this case, the fact you're using the symbol "h" for both a (non-relational) expression and a relation is confusing things a bit, I think.

You have the variable a, which is an Expression:

sage: a = var("a")
sage: type(a)
<type 'sage.symbolic.expression.Expression'>


h, which is also an Expression:

sage: h = 2^(a - 2) * 3^(a + 3) / 6^a
sage: type(h)
<type 'sage.symbolic.expression.Expression'>


but isn't an equation or inequality:

sage: h.is_relational()
False


and which simplifies as you note.

sage: h.simplify_full()
27/4


Now we write the equation:

sage: eq = h == 27/4
sage: type(eq)
<type 'sage.symbolic.expression.Expression'>


This is also an Expression, but now it's a little different:

sage: eq.is_relational()
True


If you want to find out if the equation is true, you convert the equation to a boolean value:

sage: bool(eq)
True


In this case you don't even need to simplify it. Does that make sense? Expressions can get simplified, but in general they don't simplify to truth values. You have to ask for that explicitly if that's what you want.

Warning: bool(eq) doesn't mean what you think it might!

Sage inherits the convention that while bool(eq)==True means that the expression is true (subject to whatever assumptions are in effect), bool(eq) == False doesn't mean the expression is (necessarily) false! It only means it couldn't figure out how to prove it.

more

Thank you for your answer. It was certainly useful. I have expected that my second expression, which is an equation (var('a'); h = (2^(a - 2) * 3^(a + 3) / 6^a == 27 / 4)) to be simplified directly to true. But I can use bool(h.simplify_full()) to check if the relation is true. However it still feels strange because if you just type the expression 27/4 == 27/4 then the system returns true and h.simplify_full() is just 27/4 == 27/4. The problem seems more acute when something is not necessarily true. If you test bool(a == b) for a, b variables you get false and not a == b as you would get when using simplification. On the other hand you would not be able to simplify an expression h as before to true, just using simplify_full.

( 2011-04-19 04:00:28 -0500 )edit

Here it is another example: ((2^(a - 2) * 3^(a + 3) / 6^a == 27 / 4) and a == a).simplify_full() this is simplified to a == a. Why here not 27/4 == 27 / 4 and a == a? The expression (a == a and (2^(a - 2) * 3^(a + 3) / 6^a == 27 / 4)).simplify_full() returns 27/4 == 27/4. Why terms in a conjunction are simplified away if they are true, except the last term?

( 2011-04-19 04:07:12 -0500 )edit