Re: Defining a function P[A_ | B_]:=f[A,B] overriding Alternatives
- To: mathgroup at smc.vnet.net
- Subject: [mg19258] Re: Defining a function P[A_ | B_]:=f[A,B] overriding Alternatives
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Thu, 12 Aug 1999 01:24:17 -0400
- References: <7oojvg$i35@smc.vnet.net> <7or3jp$o6@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Eckhard: Following your idea n the posting below: p[HoldPattern[Alternatives][A_ , B_]] := {A, B} DownValues[p] {HoldPattern[p[HoldPattern[Alternatives][A_, B_]]] :> {A, B}} p[a | b] {a, b} Allan --------------------- Allan Hayes Mathematica Training and Consulting Leicester UK www.haystack.demon.co.uk hay at haystack.demon.co.uk Voice: +44 (0)116 271 4198 Fax: +44 (0)870 164 0565 Eckhard Hennig <hennig at itwm.uni-kl.de> wrote in message news:7or3jp$o6 at smc.vnet.net... > > Peltio schrieb in Nachricht <7oojvg$i35 at smc.vnet.net>... > >Is there a general way to call a function with arguments separated not by > >commas but by user defined symbols (particularly Mathematica sacred > symbols) > >? > >_________________________________________________ > > > > > >Here's what I mean: > >I was willing to define a function for the calculation of the conditional > >probabilty, via the Bayes formula, and I wanted to define it in such a way > >that the function call would be: > > > >p[A|B] > > > >but Mathematica correctly interpreted the lhs of the definition > >p[A_|B_] as if there were two alternative arguments. > >I can unprotect Alternatives and clear it and that would work, > > > >Unprotect[Alternatives]; > >Clear[Alternatives]; > >p[A_|B_]:= {A,B} > > > >p[A|B] > > {A,B} > > > >but, is there a less traumatic way to achieve this without fully > sacrificing > >Alternatives? It would be fine to avoid its evaluation only when inside a > >[ ] function, by means of upvalues. But the following does not seems to > >work: > > > >Unprotect[Alternatives]; > >Alternatives /: p[A_|B_]:={A,B} > > > >And yet I wanted to be able to define my function without showing the > >Alternatives /: part. Is there a way to inhibit the Alternatives evaluation > >inside p[] in a single statement (that could be hidden in a initialization > >cell)? > > > After defining p[A_ | B_] you can manipulate the DownValues of p as follows > to prevent interpretation of the Alternatives pattern. > > > In[1]:= > p[A_ | B_] := {A, B} > > In[2]:= > DownValues[p] = DownValues[p] /. > Alternatives -> HoldPattern[Alternatives]; > > In[3]:= > p[C | D] > > Out[3]= > {C, D} > > > However, this requires applying the replacement rule from In[2] after > defining the pattern p[A_|B_]. The following piece of code performs this > replacement automatically; it can be put into an initialization cell. Note > that the SetDelayed pattern only works for the symbol p. The variable > SetDelayedFlag prevents infinite recursion. > > In[1]:= > SetDelayedFlag = True; > Unprotect[SetDelayed]; > SetDelayed[x_p, y_] /; SetDelayedFlag := > Block[{SetDelayedFlag = False}, > x := y; > DownValues[p] = DownValues[p] /. > {HoldPattern[Alternatives] -> HoldPattern[Alternatives], > Alternatives -> HoldPattern[Alternatives]}; > ]; > Protect[SetDelayed]; > > In[2]:= > p[ A_ | B_] := {A, B} > > (* No explicit manipulation of DownValues necessary here. *) > > In[3]:= > p[C | D] > > Out[3]= > {C, D} > > -- Eckhard > > ----------------------------------------------------------- > Dipl.-Ing. Eckhard Hennig mailto:hennig at itwm.uni-kl.de > Institut fuer Techno- und Wirtschaftsmathematik e.V. (ITWM) > Erwin-Schroedinger-Strasse, 67663 Kaiserslautern, Germany > Voice: +49-(0)631-205-3126 Fax: +49-(0)631-205-4139 > http://www.itwm.uni-kl.de/as/employees/hennig.html > > ITWM - Makers of Analog Insydes for Mathematica > http://www.itwm.uni-kl.de/as/products/ai > ----------------------------------------------------------- > > > >