MathGroup Archive 2004

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

Search the Archive

Re: Re: Redefining the minus operator

  • To: mathgroup at
  • Subject: [mg52655] Re: [mg52046] Re: Redefining the minus operator
  • From: Ben Kovitz <bkovitz at>
  • Date: Tue, 7 Dec 2004 04:09:42 -0500 (EST)
  • References: <cmkkn6$j99$> <>
  • Sender: owner-wri-mathgroup at

On Nov 8, 2004, at 12:13 AM, David Bailey wrote:

> I would be interested to know what you want to do with this code - as
> there may be better ways to solve your problem.

Thanks for your quick reply, David--and apologies for my slow reply.  
You saved me from getting into what looks like a very prickly place in 

Here's what I'm trying to do:  derive theorems mechanically in 
Mathematica.  I'd like to be able to take, say, a trig theorem and a 
few arithmetic theorems (like a + a == 2a), and see what other theorems 
those generate.  Hopefully I could also make a visualization of the 
graph of logical implication and equivalence relations.

For this purpose, I need to turn off *all* of Mathematica's 
simplification code, and invoke just the pattern-matching code.  I'd 
also like the results to look nice, but you've shown me that it's far 
simpler to just define a PLUS function and not even bother trying to 
talk Mathematica out of its normal interpretation of +.

I'm thinking of making an ever-growing list of theorems and just taking 
Cases or another pattern-matching function on it.  A potential problem 
with this is just that it could get slow.  I don't think DispatchTable 
would be of much use, since the list produced is static, and my list of 
theorems will grow and grow.

Any thoughts?  Is there some undocumented function for making a hash 
table that's capable of growing?

Ben Kovitz
Humboldt State University

> Ben Kovitz wrote:
>> Is there a way in Mathematica to redefine the minus sign to stand for 
>> a
>> function of your choosing?
>> For example, I'd like to be able to do something like this:
>> In[1]:= Subtract[a_, b_] := MINUS[a, b]
>> In[2]:= FullForm[x - y]
>> Out[2]:= MINUS[x, y]
>> In[3]:= 1 - 0
>> Out[3]:= MINUS[1, 0]
> This is definitely an unwise thing to do unless it is just for interest
> or you have a very specialised application in mind. However, the first
> thing to realise is that you don't want to redefine Plus - that is too
> late in the translation process and also extremely disruptive to the
> rest of Mathematica. What you need to do is add extra definitions to
> MakeExpression to change the translation from BoxForm. The following
> code is designed to work in StandardForm:
> restructure[{a_}] := a;
> restructure[{a_, "+", b_, c___}] :=
> restructure[{RowBox[{"PLUS", "[", a, ",", b, "]"}], c}];
> restructure[{a_, "-", b_, c___}] :=
>           restructure[{RowBox[{"MINUS", "[", a, ",", b, "]"}], c}];
> restructure[{"+", b_, c___}] :=
> restructure[{RowBox[{"PLUS", "[", b, "]"}], c}];
> restructure[{ "-", b_, c___}] :=
> restructure[{RowBox[{"MINUS", "[", b, "]"}], c}];
> MakeExpression[RowBox[s : {___, "+" | "-", ___}],
>          StandardForm] := MakeExpression[restructure[s], StandardForm]
> Notice that this code will also translate +a into PLUS[a] and -a into
> MINUS[a]. Also 1+2 is translated into PLUS[1,2]
> I would be interested to know what you want to do with this code - as
> there may be better ways to solve your problem.
> Please note that this is a rather unusual piece of code, so TEST IT 
> before you rely on it.
> David Bailey

  • Prev by Date: Re: web Mathematica /tomcat request
  • Next by Date: Re: Algebraic simplification and speed
  • Previous by thread: Re: Algebraic simplification and speed
  • Next by thread: Re: Redefining the minus operator