Re: Generating inverse functions
- To: mathgroup at smc.vnet.net
- Subject: [mg3527] Re: Generating inverse functions
- From: wagner at bullwinkle.cs.Colorado.EDU (Dave Wagner)
- Date: Wed, 20 Mar 1996 02:51:21 -0500
- Organization: University of Colorado, Boulder
- Sender: owner-wri-mathgroup at wolfram.com
In article <4ifhjk$518 at ralph.vnet.net>,
T. Daniel Crawford <crawdad at zopyros.ccqc.uga.edu> wrote:
>I was wondering if anyone out there has any advice for me on the
>construction of the inverse of a function supplied by the user.
>These functions have only symbolic arguments. For example,
>
>The user provides us with:
>
>func[i] = 1; func[j] = 2; func[k] = 3; func[l] = 4;
>
>We would like to automatically construct the inverse function:
>
>funcInverse[1] = i;
>funcInverse[2] = j;
>funcInverse[3] = k;
>funcInverse[4] = l;
First of all, you can access the stored values of a function using:
(Local) In[29]:=
DownValues[func]
(Local) Out[29]=
{Literal[func[i]] :> 1, Literal[func[j]] :> 2,
Literal[func[k]] :> 3, Literal[func[l]] :> 4}
Now it turns out to be quite hard to match the elements of this list
using a pattern. The problem is that if you use "Literal[func[x_]]",
the pattern matcher thinks that what you want to match is the stuff
*inside* of the Literal. If you use "Literal[Literal[func[x_]]", the
pattern matcher figures you are persistent but stupid and removes the
"redundant" Literal. I have found that the following trick does the
job (note the placement of the square brackets carefully):
(Local) In[30]:=
DownValues[func] /.
(Literal[Literal][func[x_]] :> y_) :> {x,y}
(Local) Out[30]=
{{i, 1}, {j, 2}, {k, 3}, {l, 4}}
By the way, it was necessary to surround the pattern with parentheses
to force the correct parsing of the :> operators.
Here's the full solution:
(Local) In[31]:=
DownValues[func] /.
(Literal[Literal][func[x_]] :> y_) :> (inversefunc[y] := x)
(Local) Out[31]=
{Null, Null, Null, Null}
(Local) In[32]:=
?inversefunc
Global`inversefunc
inversefunc[1] := i
inversefunc[2] := j
inversefunc[3] := k
inversefunc[4] := l
Dave Wagner
Principia Consulting
(303) 786-8371
dbwagner at princon.com
http://www.princon.com/princon
==== [MESSAGE SEPARATOR] ====