Paulo Grahl wrote:
> great!
> I am now facing the following problem:
>
> declare(sym_matrix,feature);
> sym_matrixp(expr):=
> if atom(expr) then featurep(expr,sym_matrix)
> else if member(part(expr,0),["+","-","."]) then
> every(sym_matrixp,args(expr))
> else if part(expr,0)="^^" then sym_matrixp(first(expr))
> else if is(equal(part(expr,0),d)) then every(sym_matrixp,args(expr))
> else false$
>
> matchdeclare([C,D],sym_matrixp);
> declare(d,linear);
> block([simp:false], tellsimp(d(C.D),d(C).D + C.d(D)));
> declare(d,linear);
> block([simp:false], tellsimp(d(C.D),d(C).D + C.d(D)));
>
> declare([x,y],sym_matrix);
>
> When I type
> (%i8) d(y.x);
> (%o8) d(y) . x + y . d(x)
> OK
> (%i10) d(y.(x+y));
> (%o10) d(y) . (y + x) + y . (d(y) + d(x))
> OK
> BUT,
> (%i15) d(x.x);
> (%o15) d(x^^2)
>
> Any idea on how I can evaluate the function d() before x.x is
> simplified to x^^2?
>
You write additional rules for xx^^n . or actually, d(xx^n).
> Also I cannot yet get d(x.y.z) to work, even though x.y is recognized
> as sym_matrix.
>
That is because x.y.z is a multiplication of 3 items. it is not
(x.y).z or x.(y.z).
> How do I change the rule tellsimp(d(C.D),d(C).D + C.d(D)) to make it
> work with arbitrary number of elements ?
>
try something like this:
matchdeclare(manydots,manydotsp),
defrule(d(manydots), .... whatever the result is supposed to be...)
manydotsp(r):= if (not(atom(r)) and op(r)=".") then true;
> Thanks again. Please feel free to guide me to some texts over the web
> where I can dig deeper into using rules and patterns to avoid
> bothering too much my list colleagues.
>
You might look at
http://www.cs.berkeley.edu/~fateman/papers/partition.pdf
Also, you can write about your experience to help others!
RJF