MathGroup Archive 1998

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

Search the Archive

Subscript and the Sorcerer's Apprentice

The Players

The Sorcerer:      Mathematica
The Apprentice:    me
The Broom:         Subscript

Act I

I frequently subscript symbols to mimic common mathematical notation. A
subscripted symbol x\_a in the Front End becomes the expression
Subscript[x,a] in the Kernel. Set (=) and SetDelayed (:=) assign a
definition of Subscript[x,a] to the System symbol Subscript

Within a Module, I declare x and a to be local to the Module. Every time
I execute this Module, another definition is assigned to Subscript.
Thus, after three executions of

\!\(Module[{x, a}, x\_a = 1]\)

I might see the following three DownValues added to Subscript:

\!\({HoldPattern[x$3\_a$3] \[RuleDelayed] 1, 
     HoldPattern[x$4\_a$4] \[RuleDelayed] 1, 
     HoldPattern[x$5\_a$5] \[RuleDelayed] 1}\)

assuming that $ModuleNumber was 3, 4, and 5 when this module was
executed. These DownValues do not disappear when the Module goes out of

Version 3.0 provides a neat way to avoid these useless DownValues:
Utilities`Notation`Symbolize, whereby x\_a is translated not into
Subscript[x,a] but instead a single symbol (like x_a but with a fancier
underscore). Alas, I am addicted to the ability to manipulate
subscripts, and I am (true to my role!) stubborn besides, so I don't
use Symbolize much.

These useless DownValues of Subscript can accumulate quickly. From time
to time, I amuse myself with the awful response from the Kernel when


Act II

I am running larger problems. The Kernel is awash in these useless
subscripts. From time to time, it abruptly quits, proclaiming "Out of
memory", owing, I suspect, to these subscripts.  I am no longer amused.

These foul subscripts must go! The simplest step, Clear[Subscript],
would be too drastic. Instead, I execute the following function from
time to time

cleanSubscript[] := 
  DownValues[Subscript] = 
    HoldPattern[L_ :> R_] /; 
     StringMatchQ[ToString[L], "*$*"]]

to clear out DownValues that appear to be useless. If I fail to call
this function often enough, I'm in trouble. This function is imperfect.


I would like Act III to be more agreeable. How to avoid this mountain of
subscripts in the first place? One approach is to have each module
clean up after itself: 

\!\(x\_a =. \)

Alas, this solution is tedious when there many subscripted symbols, and
I am (again, true to my role) lazy. So I don't do this much.

Another approach is ask Mathematica to assign the definition to the
local variable x. Neither of the following Modules leaves subscripts

\!\(Module[{x, a}, x /: x\_a  = 1]\) \!\(Module[{x, a},      x\_a ^=

Alas, this approach often unavailable, because x and a are too far

\!\(x /: x\_a[1] = 2\)
   Tag x in x [1] is too deep for an assigned rule to be

The same error occurs when assigning a list or matrix of subscripted

Set and SetDelayed assign such definitions to Subscript, but not as any
kind of Value that I recognize. They show up in response to ??:

InputForm[Subscript[x, a][1] = 2]

but I cannot interact with this output. 

Would anyone out there care to write me a happy Act III?


  • Prev by Date: Re: Help please: Summing a list
  • Next by Date: RE: Back issues of Mathematica Journal plus software
  • Previous by thread: Re: Help please: Summing a list
  • Next by thread: Subscript and the Sorcerer's Apprentice 2