[Date Index]
[Thread Index]
[Author Index]
Re: Re: Re: Rule-based programming: declare variables to be a number
*To*: mathgroup at smc.vnet.net
*Subject*: [mg80858] Re: [mg80822] Re: [mg80797] Re: Rule-based programming: declare variables to be a number
*From*: Andrzej Kozlowski <akoz at mimuw.edu.pl>
*Date*: Tue, 4 Sep 2007 03:48:22 -0400 (EDT)
*References*: <fb83lf$82d$1@smc.twtelecom.net> <200709020651.CAA25850@smc.twtelecom.net> <200709031012.GAA09453@smc.vnet.net> <DFA3206A564B80499B87B89B49BCD31301BB5408@EXCHANGE3.campus.tue.nl>
I understand these arguments since quite a long time ago I thought
about them myself (I even sent a "puzzle" to the list asking where
the "DownValue" of the definition NumericQ[a]=True is stored but the
only "answer" I got referred to a story by Stanislaw Lem) but since I
have long since convinced myself that this behaviour is intentional
and extremely useful I believe them to be mistaken.
First of all a practical remark: of course is no problem at all with
"undoing" since one can easily undo
NumericQ[a] = True
with
NumericQ[a] = False
False
Not only that but this is the logical and sensible thing to do.
Having considered this matter quite carefully (and quite a long time
ago) I do not agree with any of Fred's points about the "basic
principles of Mathematica" in this particular case. NumericQ is
simply special and there is no reason why some functions should not
be special. To start with, without any user definitions, we have:
NumericQ[a]
False
and yet False is not a DownValue of NumericQ. It seems quite natural
for me therefor that
NumericQ[a]=True simply changes the above "built-in" behaviour and
does not create any DownValue either. Therefore it does not make any
sense to me to try Clear[NumericQ]. Note also another very important
fact. NumericQ is Protected yet you can define NumericQ[a]=True,
which seems to contradict a "basic principle of Mathematica". But,
and this is the key point, you can't make NumericQ[a] to be anything
you like. Just try:
NumericQ[a] = 3
NumericQ::set:Cannot set NumericQ[a] to 3; the lhs argument must be a
symbol and the rhs must be True or False. >>
In fact, I consider this message the key to the whole issue and in my
opinion it refutes all of David's and Fred's objections to this use
of NumericQ. This "error message" is precisely the missing part of
the documentation. In fact, not having this message in the
documentation is the only thing that I find "regrettable" about
NumericQ. Not only is the function itself not regrettable but I would
go as far as to say that (after GroebnerBasis) it is my second
favourite function in Mathematica, which I have used without problems
for many years (and in quite many of my past post to the MathGroup )
and would find it almost irreplaceable.
I have ignored Fred's point about Dynamic because I can't possibly
imagine any practical situation in whcih this kind of use of Dynamic
might be encountered and, in my opinion, the most basic principle of
Mathematica, which overrides all other prinicples, is that "problems"
should be taken seriously only if there is some possibility that they
could be encountered in a practical context and were not simply
artificially manufactured to score a debating point or for some other
"academic" reason.
Andrzej Kozlowski
Since this is not an O
On 3 Sep 2007, at 15:59, Simons, F.H. wrote:
> I have very mixed feelings about NumericQ. I agree with Andrzej
> that it
> is a very useful function.
>
> But for quite another reason I also agree with David Bailey. The
> function NumericQ has attribute Protected, so I did not even get the
> idea to try the command NumericQ[a]= True. This command should not
> work,
> it violates basic principles of Mathematica.
>
> As David states, unprotecting a Mathematica function and adding some
> extra definitions is usually not a good idea. Instead, it is much
> better
> to use TagSet, as Carl Woll did.
>
> The other thing I do not like is that I have no idea where the
> definition of NumericQ[a]= True is stored. It is not in the downvalues
> of NumericQ, nor in the upvalues of a. So undoing this definition
> cannot
> be done with Clear[NumericQ] or with UpValues[a]={}, both very natural
> commands.
>
> Finally, due to the mysterious implementation, Dynamic does not
> work as
> expected:
>
> Consider Dynamic[NumericQ[a]]
>
> It shows False. Assigning a numeric value to a changes it to True, and
> unassigning a changes it back to False. That is correct. The command
> NumericQ[a] returns True, but the display of Dynamic incorrectly
> remains
> False. Then do a=3, followed by a=., and Dynamic shows True. Now give
> the command NumericQ[a]=.. Then the Dynamic object still shows True.
>
> One of the very, very strong points of Mathematica is its uniform
> structure. NumericQ seems to be a very regrettable and, as far as I
> can
> see, unnecessary exception, despite the fact that the function works
> fine.
>
>
>
> Fred Simons
> Eindhoven University of Technology
>
> -----Original Message-----
> From: Andrzej Kozlowski [mailto:akoz at mimuw.edu.pl]
> Sent: maandag 3 september 2007 12:13
> To: mathgroup at smc.vnet.net
> Subject: [mg80822] Re: [mg80797] Re: Rule-based programming: declare
> variables to be a number
>
>
> On 2 Sep 2007, at 08:51, David Bailey wrote:
>
>> As others have commented, it is not a good idea to write code like
>> NumericQ[g]=True because this changes the basic operation of
>> Mathematica. For example, such code might work OK until you try to
>> combine it with some more code that needs NumericQ for something
>> else!
>>
>> David Bailey
>> http://www.dbaileyconsultancy.co.uk
>
>
> Who are the "others"?
> Anyway, I completely disagree with this statement in this particular
> context.
>
> NumericQ has clearly been designed with this in mind. Note, for
> example, that althou NumericQ is Protected, a definition like
>
> NumericQ[a]=True
>
> does not require unprotecting NumericQ. Moreover, it does not add a
> DownValue to NumericQ.
>
> NumericQ[g] = True;
> DownValues[NumericQ]
> {}
>
>
> There are plenty of other reasons to believe that all all
> theseproperties of NumericQ are designed precisely for this type of
> use.
> Besides, I have another reason to think that no probems of the kind
> you
> are imagining would happen in this case: I have been using NumericQ
> inprecisly this way for about 10 years in numerous notebooks
> without any
> problems.
>
> Note alo the post from Carl Woll which, I think, can be regarded as an
> "offcial" WRI authorization for this kind of usage ;-)
>
> (However, note also that using Carl's definition:
>
> In[19]:= g /: NumericQ[g] = True;
>
> Dos not actually add an UpValue to g:
>
> UpValues[g]
> {}
>
> and I don't think it has any advantage over the more straightforward
>
> NumericQ[g] = True;
>
>
> I am sure all this is deliberate design, and even though it may not be
> easy to explain, it is very convenient.
>
> Andrzej Kozlowski
>
Prev by Date:
**Re: Re: Re: Rule-based programming: declare variables to be a number**
Next by Date:
**weights diagram of a representation**
Previous by thread:
**Re: Re: Re: Rule-based programming: declare variables to be a number**
Next by thread:
**Re: Rule-based programming: declare variables to be a number**
| |