2
$\begingroup$

I'm trying to add custom downvalues for GeneratingFunction, and to do so I thought I just had to Unprotect it. However, that doesn't work:

Unprotect[GeneratingFunction]
{"GeneratingFunction"}
GeneratingFunction[2] = 3
During evaluation of In[3]:= Set::write: Tag GeneratingFunction in 
GeneratingFunction[2] is Protected. >>

 3
GeneratingFunction[2]
During evaluation of In[4]:= GeneratingFunction::argmu: GeneratingFunction
called with 1 argument; 3 or more arguments are expected. >>

GeneratingFunction[2]

I'm running Mathematica 9 64 bit on Linux. What do I need to do to really remove protection from this symbol?

$\endgroup$
8
$\begingroup$

GeneratingFunction by default is not a function: it is a stub which loads corresponding .mx package. You can see this with the following:

ClearAttributes[GeneratingFunction,{Protected,ReadProtected}]
OwnValues@GeneratingFunction

{HoldPattern[GeneratingFunction] :>
System`Dump`AutoLoad[Hold[GeneratingFunction], Hold[GeneratingFunction, GenerateConditions`TopLevelCode], "Discrete`GeneratingFunction`"] /; System`Dump`TestLoad}

The functions ClearAttributes and OwnValues have Hold* attributes and so the above code does not evaluate GeneratingFunction. After first evaluation it's Attributes and Options are redefined by the loaded package:

GeneratingFunction;
Attributes[GeneratingFunction]
Options[GeneratingFunction]

{Protected, ReadProtected}

{Assumptions :> $Assumptions, GenerateConditions -> False, Method -> Automatic, VerifyConvergence -> True}

I do not know why we can't see any top-level code for GeneratingFunction with Information, but Tracing its evaluation reveals a bunch of top-level functions it uses:

Trace[GeneratingFunction[1, n, x], TraceInternal -> True]

For the original discussion of this issue see this answer by Sasha (Wolfram Research) with comments under it.

$\endgroup$
3
$\begingroup$

I do not know why Unprotectdoes not work (bug, feature?). The following does work though:

ClearAttributes[GeneratingFunction, Protected]
GeneratingFunction[2] = 3
GeneratingFunction[2]

3

$\endgroup$
  • $\begingroup$ hmm, that's not working for me $\endgroup$ – Andrew Sep 17 '13 at 22:37
  • 1
    $\begingroup$ clearing the attribute, attempting to set a value, receiving an error, then clearing the attribute again and setting a value seems to work though $\endgroup$ – Andrew Sep 17 '13 at 22:39
  • 2
    $\begingroup$ @Andrew May be the situation is similar to this? $\endgroup$ – Alexey Popkov Sep 18 '13 at 2:11
  • 1
    $\begingroup$ @AndrewMacFie: You need to run it twice so Wolfram can confirm your intentions with absolute certainty. ;-) On a serious note, what kind of "feature" is that?! $\endgroup$ – Hector Sep 18 '13 at 3:49
  • $\begingroup$ @AlexeyPopkov ah yes... this question is very similar to that one $\endgroup$ – Andrew Sep 18 '13 at 20:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.