Re: pattern matching against the Dt function?
- To: mathgroup at smc.vnet.net
- Subject: [mg85280] Re: pattern matching against the Dt function?
- From: "Adam M." <adamm at san.rr.com>
- Date: Tue, 5 Feb 2008 06:03:42 -0500 (EST)
- References: <fo6h46$r20$1@smc.vnet.net> <47A738A7.4040408@gmail.com>
Thank you to everyone. I understand what's going on now. And I'm glad to
find out about Trace[].
Thank you again!
-- Adam
Jean-Marc Gulliet wrote:
> Adam M. wrote:
>> Hello,
>>
>> I'm having trouble matching the Dt function with a pattern, even
>> though it works for all other functions I've tried.
>>
>> (*It doesn't match Dt[b] here.*)
>> In[101]:= {f[a], Dt[b]} /. Dt[n_]->n
>> Out[101]= {f[a], Dt[b]}
>>
>> (*But it matches f[a] with no problem.*)
>> In[100]:= {f[a], Dt[b]} /. f[n_]->n
>> Out[100]= {a, Dt[b]}
>>
>> (*In a process of elimination, I tried another built-in function, D,
>> and it worked fine.*)
>> In[99]:= {f[a], D[b]} /. D[n_]->n
>> Out[99]= {f[a], b}
>>
>> (*I tried another function more than one character long, Sin, and that
>> works.*)
>> In[102]:= {f[a], Sin[b]} /. Sin[n_]->n
>> Out[102]= {f[a], b}
>>
>> (*The full forms all seem to follow the same pattern.*)
>> In[103]:= Sin[b] // FullForm
>> Out[103]//FullForm= Sin[b]
>>
>> In[104]:= Dt[b] // FullForm
>> Out[104]//FullForm= Dt[b]
>>
>> In[105]:= f[b] // FullForm
>> Out[105]//FullForm= f[b]
>>
>> (*I thought it might be related to the evaluation of the Dt function,
>> so I tried Holding it. No luck.*)
>> In[111]:= {f[a], Hold[Dt[b]]} /. Dt[n_]->n
>> Out[111]= {f[a], Hold[Dt[b]]}
>>
>> (*However, it has no problem matching f[a] in a Hold.*)
>> In[112]:= {Hold[f[a]], Dt[b]} /. f[n_]->n
>> Out[112]= {Hold[a], Dt[b]}
>>
>> (*I tried looking at the attributes to find out if there was something
>> special about the Dt function, but it doesn't seem like it...*)
>> In[116]:= Attributes[Sin]
>> Out[116]= {Listable, NumericFunction, Protected}
>>
>> In[117]:= Attributes[D]
>> Out[117]= {Protected, ReadProtected}
>>
>> In[118]:= Attributes[Dt]
>> Out[118]= {Protected}
>>
>> I've read every section on pattern matching in the documentation
>> center, and I'm at a complete loss to explain why I can't seem to
>> match the Dt function with the Dt[n_] pattern when I can match these
>> other functions. I know I can use the _Dt pattern to match it, but
>> then I don't get control over matching the arguments...
>>
>> Thank you.
>>
>> Very curious,
>> -- Adam M.
>>
>
> Hi Adam,
>
> For some reason the total derivative function Dt[n_] is expanding by the
> pattern matcher as the product of the symbol Dt by the first partial
> derivative of the pattern n_. No wonder that it cannot find Dt[b] after
> that! You can see the expansion by using either FullForm or Trace, as in
> the following example:
>
> In[1]:= FullForm[Dt[n_]]
>
> Out[1]//FullForm= Times[Dt[n], Derivative[1, 0][Pattern][n,
>
> Blank[]]]
>
> In[2]:= {f[a], Dt[b]} /. Dt[n_] -> n // Trace
>
> Out[2]=
> (1,0)
> {{{Dt[n_], Dt[n] Pattern [n, _]},
>
> (1,0)
> Dt[n] Pattern [n, _] -> n,
>
> (1,0)
> Dt[n] Pattern [n, _] -> n},
>
> {f[a], Dt[b]} /.
>
> (1,0)
> Dt[n] Pattern [n, _] -> n,
>
> {f[a], Dt[b]}}
>
> In[3]:= $Version
>
> Out[3]= 6.0 for Mac OS X x86 (64-bit) (June 19, 2007)
>
> Regards,