MathGroup Archive 1999

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

Search the Archive

RE: Defining a function P[A_ | B_]:=f[A,B] overriding A lternatives

  • To: mathgroup at smc.vnet.net
  • Subject: [mg19249] RE: [mg19205] Defining a function P[A_ | B_]:=f[A,B] overriding A lternatives
  • From: "Ersek, Ted R" <ErsekTR at navair.navy.mil>
  • Date: Wed, 11 Aug 1999 02:06:57 -0400
  • Sender: owner-wri-mathgroup at wolfram.com

Peltio wrote:
------------------
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:

----[Peltio]----
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}

---[Ted Ersek]---
Are you sure?  That isn't what I get, and it isn't what I expect.  For one
thing your definition above is associated with (p) not Alternatives.  So
unprotecting Alternatives makes no difference.  By default Alternatives has
no assigned values, so 
Clear[Alternatives] makes no difference either. 

Instead consider the example below.  By 
the way as a matter of style I avoid using 
single letter capitals since the kernel uses 
some of them (I, C, D, ...).

In[1]:=
Unprotect[Alternatives];
Clear[p,Alternatives];
p[a_|b_]:={{a},{b}}

In[4]:=
p[s|t]

Out[4]=
{{s|t},{}}


At In[4] above (a_|b_) means some pattern called (a) or some other pattern
called (b).  When In[4] is evaluated the expression
(s|t) fits the bill for "some pattern called (a)".
Then (Null) which is Mathematica jargon for nothing is assigned to (b).
Finally {{a},{b}} evaluates to {{a|b},{}} as we have in Out[4].

---[Peltio]----
<snip>
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}

---[Ted Ersek]---
Using UpValues doesn't prevent evaluation of the arguments.  To prevent
evaluation of the arguments you would give (p) the HoldAll attribute.

I think you have the use of upvalues confused. I will provide what I think
is a good demonstration of upvalues, but I want to resolve some subtle
details first.  In several days I should have this resolved and I will send
another email.


To solve your problem you can use (Verbatim).  The usage message for
Verbatim is given below.

In[5]:=
?Verbatim

Verbatim[expr] represents expr in pattern matching, requiring that expr be
matched exactly as it appears, with no substitutions for blanks or other
transformations.

-------------

What you want to do is say that (p) will take one argument with the head
(Alternatives).   
Verbatim will ensure the meaning of Alternatives is ignored by the pattern
matcher. Then inside the head Alternatives you want two arguments, and you
are using named patterns for the two arguments.

In[6]:=
Clear[p]
p[Verbatim[Alternatives][a_,b_]]:={a,b}


In[8]:=
p[s|t]

Out[8]=
{s,t}


In[9]:=
{p[s],p[s,t]}

Out[9]=
{p[s], p[s, t]}

-----------------------
I think this is what you wanted.
At Out[8] the definition is used for p[s,t].
At Out[9] the definition isn't used because it doesn't apply.


At first one might be tempted 
to use the definition below.
At Out[12] we see this definition 
is only used when the argument of (p) is 
literally (a_|b_).

In[10]:=
Clear[p];
p[Verbatim[a_|b_]]:={a,b}


In[12]:=
{p[s|t],p[s_|t_],p[a_|b_]}

Out[12]=
{p[s|t], p[s_|t_], {a, b}}

------------
Regards,
Ted Ersek


  • Prev by Date: Re: Transient Heat Transfer
  • Next by Date: Cleanslate -- where to find it?
  • Previous by thread: Re: Short Doesn't Work
  • Next by thread: Cleanslate -- where to find it?