MathGroup Archive 2011

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

Search the Archive

Re: pattern bugs and comment on intuitive syntax for the New Year

Well, I guess it's time for a little "summing up" of my own ;-)

First, I concede that while replying to your post I (briefly) forgot 
that you wanted to recognize  polynomials of degree exactly two rather 
than at most two and that your two line code was fine (except for the 
lack of Collect). My excuse is that I amused to dealing with spaces of 
both kinds of polynomials (the latter is a vector space, the former 
isn't) so I sometimes refer to both kinds as "quadratics". Also, since I 
have almost never found anything new of useful in your posts (except, 
perhaps, for one or two book references), there is a clear limit on the 
time I can devote to replying to them.

However, this "concession" cannot hide the following facts:

1. That you failed to understand the basic fact: that  a patter like x_. 
can refer to a single default value, which is 0 for addition and 1 for 
multiplication, which made you try to use it to do what obviously can't 
be done.

2. That you than tried to use BlankNullSequence[], which is completely 
un-appropriate in this context.

3. That having observed behaviour involving BlankNullSequence[] in 
pattern matching that you could not understand you declared it a "bug" 
and attributed to the presence of the Flat attribute in Plus, without 
checking that it actually has nothing to do with the Flat attribute and 
is part of the general behaviour of  BlankNullSequence[] in pattern 

4. That after your "investigation" you "discovered" what is pointed out 
several times every year on this forum: that pattern matching is not 
intended to be a tool solving of problems of algebraic nature, and that 
they almost always can be done much more efficiently by different means. 
That does not mean pattern matching is useless; there is no better way 
(In Mathematica of course, it is always in Mathematica!) to deal with 
exceptions, anticipating user errors and so on. Pattern matching is also 
an excellent tool for certain type of mathematical programming - 
cellular automata, for example, but not for general problems of 
algebraic nature.

5. Concerning my program:

quadp[f_, x_] /; PolynomialQ[f, x]&&  Exponent[f, x] == 2 :=
 qq @@ CoefficientList[f, x]

which I claim to be the right way to solve your problem, your objection 
based on the example (x^3+x)/x carries no weight.  The built in function 
PolynomialQ is deliberately designed to recognize only explicit 
polynomials. Since it is impossible to actually recognize all "implicit" 
polynomials, it is up to the user to modify it to include the cases that 
the user wants to include. Thus, if you want the function to work with 
rational functions such as your "counter-example" (which are not 
considered polynomials for some purposes) then you need to modify quadp 
as follows:

quadp[f_, x_] /; PolynomialQ[Cancel[f], x] && Exponent[f, x] == 2 :==

 qq @@ CoefficientList[f, x]

This will not work with "implicit polynomials" such as 
(Cos[x]^2+Sin[x]^2) x and lots of others of this type. If you wish to 
recognize the largest class of "implicit" polynomials you could use:

quadp[f_, x_] /; PolynomialQ[FullSimplify[f], x] && Exponent[f, x] == 
2 :=
 qq @@ CoefficientList[f, x]

but that will also inevitable fail in complicated cases.

Finally this:

> Obviously my meaning was that in Mathematica in most cases
> a procedural program can be replaced by a more compact and,
>  to most people, more elegant looking, "functional" one.
>  Of course we know that generally >>>>they<<<< are both something
>  else, but the latter kind tend to be more elegant and more
>  efficient (without compiling, of course, which can't be
> used for programs that perform symbolic computation
>  - an obvious thing that somehow you decided to forget).
> "
> I have marked >>>>they<<<<..  
> I thought that the pronoun "they"  meant "procedural and functional 
> You intended the pronoun to mean Mathematica programs in versions 8 
and earlier,
> and "the latter"  to be what you call Mathematica functional programs 
in version 8 and earlier, and
> the parenthetical remark to pertain to non-"functional" Mathematica 
> which you claim can't be compiled if they perform symbolic 
computation, and therefore
> can't be made more efficient.)

I think nothing shows better the pointlessness of discussing anything 
with you here. Let me make it clear: when I write a "program" I always, 
unless explicitly stated otherwise, mean: "Mathematica program in 
versions 8 and earlier" and so does almost everyone else here with of 
course one exception. All of the discussion of Lisp, the meaning of 
"compiled" outside of Mathematica etc. etc., beside consisting of stuff 
that is well known to anyone with a cursory knowledge of programing and 
computers, is utterly irrelevant on this forum and  introduced by you 
only for purposes of your own, which have nothing to do with the reasons 
why others participate in this forum.

Andrzej Kozlowski

  • Prev by Date: Re: Combining Slider and SetterBar in Manipulate
  • Next by Date: FillingStyle -> Striped ?
  • Previous by thread: Re: pattern bugs and comment on intuitive syntax for the New Year
  • Next by thread: Re: pattern bugs and comment on intuitive syntax for the New Year