From: Richard F. <fa...@be...> - 2014-02-19 21:09:40
|
On 2/19/2014 11:52 AM, Mark wrote: > On 02/19/2014 08:13 PM, Robert Dodier wrote: >> On 2014-02-19, Mark <zei...@ya...> wrote: >> >>> Apart from the maxima manual, is there any other recommended how-to >>> documentation for using rules and patterns in Maxima? >> No, but feel free to post any questions about rules & patterns to the mailing list. >> >>> I tried working with the 2nd eds. of Macsyma's user guide, but there are >>> differences between Macsyma and Maxima for me right away. E.g. if I >>> simply copy-cut-and-paste the famous example to implement the factorial >>> using rules (pg. 220), then, tellsimpafter() is not applied recursively, >>> but only once. 1. I wrote the pattern matcher circa 1969 at MIT. 2. WGD changed it, substituting his own version, in the Symbolics version in 1986. (according to comments not in the Maxima code) 3. Apparently the semantics in this case differ. I do not know if this was intentional or not. 4. The use of tellsimpafter shown in the user manual is not how it is intended to be used. It might be too strong to say the example is a bug, but perhaps it is. I do not know who wrote the user manual, but the IDEA behind tellsimpafter is that it should be used when there is some perhaps quite powerful built-in simplification mechanism in Macsyma that you don't want to coerce or over-ride, but that you wanted to advise in a kind of final checkup. That is, if the built-in simplifier left some form unchanged, then you could turn to your own program. e.g. tellsimpafter(integrate(EXP,x), f(x)) would be used only if the built-in integrate command did not work, but you knew how to integrate EXP. Tellsimpafter COULD be used to modify a simplifier that you constructed yourself with layers of tellsimp() and perhaps tellsimpafter() interlayered. Sounds like a bad design, but in the case here, where the rule set strictly defines the domain (positive integers vs anything else), the ordering of the rules doesn't matter! The use of tellsimpafter to define a new function is inappropriate generally. The use of tellsimpafter to modify the simplification of function foo, where the replacement contains foo is an invitation to disaster -- or at least it seemed to me, in 1969. So I disallowed re-simplification. Allowing re-simplification is probably a change of a dozen characters or so, and WGD presumably did that, realizing that my fear was not especially well founded, and that potentially infinite recursion could be stopped by appropriate ordering of rules. I assume that WGD also modernized the code in various ways. To me, the appropriate code for a rule-based factorial that just leaves non-integers or negative numbers hanging would be posintp(n):=is(integerp(n) and n>0)$ matchdeclare(int,posintp)$ tellsimp(fact(0),1)$ tellsimp(fact(int),int*fact(int-1))$ There is no reason to use tellsimpAFTER here. Why did the user-guide author use it? >> That sounds interesting, but as I don't have the Macsyma user guide at >> hand, I can't try out that example. Care to post the code in question? > Before I do that, may I ask if you would think that the docs for the > pattern matcher in Macsyma should be one-to-one usable also for Maxima? I would have thought so. It could be that WGD introduced other differences. I noticed one, which is that tellsimp(exp1,exp2,cond) is acceptable. the third argument cond is a conditional which is evaluated, and if false, inhibits the rule. So any examples that you encounter that use that feature will not work in Maxima currently. I haven't spotted any examples in the Macsyma user manual and its on-line help system neglects to mention this feature. In the Macsyma system then, only one rule would be needed... matchdeclare(int,true); tellsimp(fact(int),int*fact(int-1), integerp(int) and int>0); this is not acceptable to Maxima. > > This is the code from pg. 220 of Macsyma User's Guide 2nd. Ed. (Google > tells you to get it from > http://www.cs.berkeley.edu/~fateman/macsyma/docs/userg.pdf) Yes, that's a place to find it. You can also find the reference manual in that directory. Nice of Google to find it for you. > > (c1) posintp(n):=is(integerp(n) and n>0)$ > (c2) matchdeclare(int,posintp)$ > (c3) tellsimpafter(fact(0),1)$ > (c4) tellsimpafter(fact(int),int*fact(int-1))$ > (c5) fact(-1) > (d5) fact(- 1) > (c6) fact(0.5) > (d6) fact(0.5) > (c7) fact(0) > (d7) 1 > (c8) fact(5) > (d8) 120 > > This makes sense to me, if I should think of tellsimpafter() to work > recursively until the rule cannot be applied any more. As far as I can recall, that's not the way the original author thought it should work, but it is the way WGD changed it (Bill Dubuque, where are you?) > > Now this is what happens if I (, admittedly, completely blindly) type in > the same lines into a freshly started Maxima > > <snip>; > > (%i9) fact(5); > (%o9) 5*fact(4) > > (d8) vs. (%o9) is what I was asking about. > > Mark > > |