MathGroup Archive 2002

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Simplifying inequalities

  • To: mathgroup at smc.vnet.net
  • Subject: [mg36811] Re: [mg36790] Simplifying inequalities
  • From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
  • Date: Fri, 27 Sep 2002 04:15:04 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

On second thoughts I realized that there seems to be an inherent  
ambiguity about what one could mean by using alternatives (statements  
joned by Or) assumptions. In fact it now seems to me that the  
reasonable intertpretation for ImpliesQ and FullSimplify ought to  
perhaps be different. It seems to me that ImpliesQ[Or[a,b],c] ought to  
return True if aand only if ImpliesQ[a,c] and ImpliesQ[b,c] both return  
True. If so this could be acomplished by adding the rule
ImpliesQ[Or[a,b],c] = And[ImpliesQ[a,c],ImpliesQ[b,c]]. That could then  
be used in proving that the two answers to the system of inequalities  
that of Vincent's original posting are equivalent. On the other hand  
probably FullSimplify[a, Or[p,q]] ought to return  
Or[FullSimplify[a,p],FullSimplify[a,q]] (or do nothing as it doe snow).  
The first approach would seem to be consistent with the way  
FullSimplify works with domain specifications but would however have  
the strange effect of returning True if just one of the alternatives  
were true  and the other false. So perhaps after all it is best to  
leave FullSimplify as it is. However, it seems to me that ImpliesQ  
shoud be able to handle such cases (?)

Andrzej Kozlowski
Toyama International University
JAPAN




On Thursday, September 26, 2002, at 03:06 PM, Andrzej Kozlowski wrote:

> The modification to FullSimplify that I sent earlier works correctly  
> only for assumptions of the form Or[a,b] (and even then not is not  
> always what one would like). For what it's worth here is a better (but  
> slow) version:
>
> In[1]:=
> Unprotect[FullSimplify];
>
> In[2]:=
> FullSimplify[expr_, x_ || y__] := FullSimplify[
>     FullSimplify[expr, x] || FullSimplify[expr, Or[y]]];
>
> In[3]:=
> Protect[FullSimplify];
>
> For example:
>
> In[4]:=
> FullSimplify[Sqrt[(x - 1)^2] + Sqrt[(x - 2)^2] +
>    Sqrt[(x - 3)^2], x > 1 || x > 2 || x > 3]
>
> Out[4]=
> -1 + x + Abs[-3 + x] + Abs[-2 + x] ||
>   -3 + 2*x + Abs[-3 + x] || 3*(-2 + x)
>
> Andrzej Kozlowski
> Toyama International University
> JAPAN
>
>
>
> On Thursday, September 26, 2002, at 11:14 AM, Andrzej Kozlowski wrote:
>
>> The reason why InequalitySolve returns it's answer in what sometimes  
>> turns out to be unnecessarily complicated form is that the underlying  
>> algorithm, Cylindrical Agebraic Decomposition (CAD) returns its  
>> answers in this form.   Unfortunately it seems to me unlikely that a  
>> simplification of the kind you need can be can be accomplished in any  
>> general way. To see why observe the following. First of all:
>>
>> In[1]:=
>> FullSimplify[x > 0 || x == 0]
>>
>> Out[1]=
>> x >= 0
>>
>> This is fine. However:
>>
>> In[2]:=
>> FullSimplify[x > 0 && x < 2 || x == 0 && x < 2]
>>
>> Out[2]=
>> x == 0 || 0 < x < 2
>>
>> Of course what you would like is simply 0 <= x < 2. One reason why  
>> you can't get it is that while Mathematica can perform a  
>> "LogicalExpand", as in:
>> In[3]:=
>> LogicalExpand[(x > 0 || x == 0) && x < 2]
>>
>> Out[3]=
>> x == 0 && x < 2 || x > 0 && x < 2
>>
>> There i no "LogicalFactor" or anything similar that would reverse  
>> what LogicalExpand does. if there was then you could perform the sort  
>> of simplifications you need for:
>>
>> In[4]:=
>> FullSimplify[(x > 0 || x == 0) && x < 2]
>>
>> Out[4]=
>> 0 <= x < 2
>>
>> However, it does not seem to me very likely that such "logical  
>> factoring" can be performed by a general enough algorithm (though I  
>> am no expert in this field). In any case, certainly Mathematica can't  
>> do this.
>>
>> I also noticed that Mathematica seems unable to show that the answer  
>> it returns to your problem is actually equivalent to your simpler  
>> one. In fact this looks like a possible bug in Mathematica. Let's  
>> first try the function ImpliesQ from the Experimental context:
>>
>> << Experimental`
>>
>> Now Mathematica correctly gives:
>>
>> In[6]:=
>> ImpliesQ[y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6,
>>   y4 == -1 && y6 >= -1 && y5 == y6 || y4 > -1 && y6 >= -1 && y6 <= y5  
>> <= 1 + y4 + y6]
>>
>> Out[6]=
>> True
>>
>> However:
>>
>> In[7]:=
>> ImpliesQ[y4 == -1 && y6 >= -1 && y5 == y6 || y4 > -1 && y6 >= -1 &&
>>     y6 <= y5 <= 1 + y4 + y6, y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 +  
>> y4 + y6]
>>
>> Out[7]=
>> False
>>
>> That simply means that ImpliesQ cannot show the implication, not that  
>> it does not hold. ImpliesQ relies on CAD, as does FullSimplify.  
>> Switching to FullSimplify we see that:
>>
>>
>>
>> In[8]:=
>> FullSimplify[y4 == -1 && y6 >= -1 && y5 == y6 || y4 > -1 && y6 >= -1  
>> &&
>>     y6 <= y5 <= 1 + y4 + y6, y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 +  
>> y4 + y6]
>>
>> Out[8]=
>> True
>>
>> while
>>
>> In[9]:=
>> FullSimplify[y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6,
>>   y4 == -1 && y6 >= -1 && y5 == y6 || y4 > -1 && y6 >= -1 && y6 <= y5  
>> <= 1 + y4 + y6]
>>
>> Out[9]=
>> y4 >= -1 && y6 <= y5 <= 1 + y4 + y6
>>
>> On the other hand, taking just the individual summands of Or as  
>> hypotheses;
>> In[10]:=
>> FullSimplify[y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6,
>>   y4 > -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6]
>>
>> Out[10]=
>> True
>>
>> In[11]:=
>> FullSimplify[y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6,
>>   y4 == -1 && y6 >= -1 && y5 == y6 ]
>>
>> Out[11]=
>> True
>>
>> In fact FullSimplify is unable to use Or in assumptions, which can be  
>> demonstrated on an abstract example:
>>
>>
>> In[12]:=
>> FullSimplify[C,(A||B)&&(C)]
>>
>> Out[12]=
>> True
>>
>> In[13]:=
>> FullSimplify[C,LogicalExpand[(A||B)&&(C)]]
>>
>> Out[13]=
>> C
>>
>> This could be fixed by modifying FullSimplify:
>>
>> In[14]:=
>> Unprotect[FullSimplify];
>>
>> In[14]:=
>> FullSimplify[expr_,Or[x_,y__]]:=Or[FullSimplify[expr,x],FullSimplify[e 
>> xpr,y]];
>>
>> In[15]:=
>> Protect[FullSimplify];
>>
>> Now at least we get as before:
>>
>> In[16]:=
>> FullSimplify[y4 == -1 && y6 >= -1 && y5 == y6 || y4 > -1 && y6 >= -1  
>> &&
>>     y6 <= y5 <= 1 + y4 + y6, y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 +  
>> y4 + y6]
>>
>> Out[16]=
>> True
>>
>> but also:
>>
>> In[17]:=
>> FullSimplify[y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6,
>>   y4 == -1 && y6 >= -1 && y5 == y6 || y4 > -1 && y6 >= -1 && y6 <= y5  
>> <= 1 + y4 + y6]
>>
>> Out[17]=
>> True
>>
>> This seems to me a possible worthwhile improvement in FullSimplify,  
>> though of course not really helpful for your problem.
>>
>>
>> Andrzej Kozlowski
>> Toyama International University
>> JAPAN
>>
>>
>> On Wednesday, September 25, 2002, at 02:51 PM, Vincent Bouchard wrote:
>>
>>> I have a set of inequalities that I solve with InequalitySolve. But  
>>> then
>>> it gives a complete set of solutions, but not in the way I would  
>>> like it
>>> to be! :-) For example, the simple following calculation will give:
>>>
>>> In[1]:= ineq = {y4 >= -1, y5 >= -1, y6 + y4 >= y5 - 1, y5 >= y6, y6  
>>> >= -1};
>>> 	InequalitySolve[ineq,{y4,y6,y5}]
>>>
>>> Out[1]:= y4 == -1 && y6 >= -1 && y5 == y6 ||
>>>   y4 > -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6
>>>
>>> the result is good, but I would like it to be in the simpler but
>>> equivalent form
>>>
>>>   y4 >= -1 && y6 >= -1 && y6 <= y5 <= 1 + y4 + y6
>>>
>>> How can I tell InequalitySolve to do that? It is simple for this  
>>> example,
>>> but for a large set of simple inequalities InequalitySolve gives  
>>> lines and
>>> lines of results instead of a simple result.
>>>
>>> Thanks,
>>>
>>> Vincent Bouchard
>>> DPHil student in theoretical physics in University of Oxford
>>>
>>>
>>>
>>>
>>
>>
>
>



  • Prev by Date: Request for Mathematica Programming help.
  • Next by Date: Re: Simplifying inequalities
  • Previous by thread: Re: Simplifying inequalities
  • Next by thread: Re: Simplifying inequalities