Re: Curious weakness in Simplify with Assumptions
- To: mathgroup at smc.vnet.net
- Subject: [mg19033] Re: Curious weakness in Simplify with Assumptions
- From: Adam Strzebonski <adams at wolfram.com>
- Date: Tue, 3 Aug 1999 13:45:02 -0400
- References: <E11AbU1-0004ZX-0C@finch-post-12.mail.demon.net>
- Sender: owner-wri-mathgroup at wolfram.com
Andrzej Kozlowski wrote: > > Today I noticed a weakness in Simplify with assumptions. I tried > > In[1]:= > Simplify[Sqrt[x] \[Element] Reals, x >= 0] > Out[1]= > Sqrt[x] \[Element] Reals > The rule used to prove that a Power expression is real is too weak, namely a^b is real if (i) b is an integer and a is real and (b>0 or a!=0) or (ii) b is real and a>0. I will add (iii) b>0 and a>=0. Thanks for pointing this out. > This leads to the following curious situation: > > In[2]:= > Simplify[Sqrt[a^2 + b^2] \[Element] Reals, > a \[Element] Reals && b \[Element] Reals] > Out[2]= > 2 2 > Sqrt[a + b ] \[Element] Reals > > even though: > > In[3]:= > Simplify[Sqrt[a^2 + b^2] \[Element] Reals, (a \[Element] Reals) && (b > 0)] > Out[3]= > True > > In[4]:= > Simplify[Sqrt[a^2 + b^2] \[Element] Reals, (a \[Element] Reals) && (b < 0)] > Out[4]= > True > Here in both cases a^2+b^2>0 so rule (ii) can be used. > and > > In[5]:= > Simplify[Sqrt[a^2 + b^2] \[Element] Reals, (a \[Element] Reals) && (b == 0)] > Out[5]= > True > Here Sqrt[a^2+b^2] simplifies to Sqrt[a^2], and then to Abs[a], which Mathematica knows is real. > which covers all the possibilities. Surely this is something that ought to > be fixed quite easily? > The function arealq[a, assum] defined below gives True if it can prove that a is real and False otherwise. It uses the rule (iii) in addition to rules known to Simplify. In[1]:= arealq[a_^b_, assum_] := Experimental`ImpliesQ[assum, b>0 && a>=0 || Element[a^b, Reals]] In[2]:= arealq[a_Plus, assum_] := And@@(arealq[#, assum]&/@(List@@a)) In[3]:= arealq[a_Times, assum_] := And@@(arealq[#, assum]&/@(List@@a)) In[4]:= arealq[other_, assum_] := Experimental`ImpliesQ[assum, Element[other, Reals]] In[5]:= Unprotect[Simplify]; In[6]:= Simplify[Element[a_, Reals], assum_, ___] := True /; arealq[a, assum] In[7]:= Protect[Simplify]; In[8]:= Simplify[Sqrt[x] \[Element] Reals, x >= 0] Out[8]= True In[9]:= Simplify[Sqrt[a^2 + b^2] \[Element] Reals, a \[Element] Reals && b \[Element] Reals] Out[9]= True In[10]:= Simplify[Sqrt[x] \[Element] Reals, x \[Element] Reals] Out[10]= Sqrt[x] \[Element] Reals One can use Simplify[e, assum]===True instead of Experimental`ImpliesQ[assum, e] in the definition of arealq. The difference is that Experimental`ImpliesQ only tries to prove that e is True using assumptions assum, and gives False if it can't, while Simplify will try to put e in a simplest form even if it cannot show that e is True. In[2] and In[3] are added so that arealq can prove also some simple consequences of rule (iii), like In[11]:= Simplify[Element[Pi (E + 2 Sqrt[x]), Reals], x>=0] Out[11]= True Best Regards, Adam Strzebonski Wolfram Research