[Maxima] Non-exclusive pattern matching? e.g. distributiveness of a function, was: Predictable pattern matching?
Robert Dodier
robert.dodier at gmail.com
Wed Dec 24 22:50:45 CST 2008
On 12/23/08, Martin Schönecker <ms_usenet at gmx.de> wrote:
> (1) int[a_ + b_, x] := int[a, x] + int[b, x]
> (2) int[c_ f_, x] := c int[f, x] /; FreeQ[c, x]
> (3) int[x^n_, x] := 1/(n + 1) * x^(n + 1) /; n != -1
> (4) int[c_, x] := c x /; FreeQ[c, x]
matchdeclare (aa, all, xx, symbolp);
defrule (r1, foo (aa, xx), block ([xx% : xx], apply1 (foo (aa, xx),
r2, r4, r5)));
matchdeclare (cc, freeof (xx), yy, lambda ([e], not freeof (xx, e)));
defrule (r2, foo (cc * yy, xx%), cc * foo (yy, xx));
matchdeclare (zz, lambda ([e], e = 0), nz, lambda ([e], e # 0));
defrule (r3, foo (zz + nz, xx), map (lambda ([e], foo (e, xx)), nz));
matchdeclare (nn, integerp);
defrule (r4, foo (xx%^nn, xx%), if nn = -1 then log(xx%) else xx^(nn +
1)/(nn + 1));
defrule (r5, foo (cc, xx%), cc * xx);
apply_foo_rules (e) := apply1 (e, r3, r1);
Examples:
apply_foo_rules (foo (1, u))
=> u
apply_foo_rules (foo (u + 1, u))
=> u^2/2+u
apply_foo_rules (foo (10 * u, u))
=> 5*u^2
apply_foo_rules (foo (10 * %pi * u^2 * sin(u), u))
=> 10*%pi*foo(u^2*sin(u),u)
apply_foo_rules (foo (1/u - %pi * u^3 * v^3, u))
=> log(u)-%pi*u^4*v^3/4
apply_foo_rules (foo (- %pi - 10 * cos(u) + sin(u), u))
=> foo(sin(u),u)-10*foo(cos(u),u)-%pi*u
Note that r1 captures the variable of integration for the benefit of
other rules. That's clumsy; it would be better to make the rule
processing smarter.
Could have written these as tellsimp or tellsimpafter rules so that
they would be applied automatically.
The numbers r1, r2, ... don't correspond to your (1), (2), ....
Hope this helps,
Robert
More information about the Maxima
mailing list