Re: Defining a function P[A_ | B_]:=f[A,B] overriding Alternatives
- To: mathgroup at smc.vnet.net
- Subject: [mg19221] Re: Defining a function P[A_ | B_]:=f[A,B] overriding Alternatives
- From: Eckhard Hennig <hennig at itwm.uni-kl.de>
- Date: Wed, 11 Aug 1999 02:06:42 -0400
- Organization: ITWM
- References: <7oojvg$i35@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
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
-----------------------------------------------------------