Re: Curious weakness in Simplify with Assumptions

• To: mathgroup at smc.vnet.net
• Subject: [mg19033] Re: Curious weakness in Simplify with Assumptions
• 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.

(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,