fixD:= proc(g::procedure) options `Maple Advisor Database 1.02 for Maple 6`, `Copyright (c) 2001 by Robert B. Israel. All rights reserved`; local cands; cands:= select(t -> type(t,procedure) and has(eval(g),t) and not type(cat(`diff/`,t),procedure), [anames()]); map(makediff,cands); NULL end; makediff:= proc(g::symbol, vlist::{list,set}) options `Maple Advisor Database 1.02 for Maple 6`, `Copyright (c) 2001 by Robert B. Israel. All rights reserved`; local vars, dvars, n, dgname, dgname2, r, i, v, V, Q, x,t; if not type(g,procedure) then error "Function %1 has not been defined", g fi; vars:= op(1,eval(g)); n:= nops([vars]); if n = 0 then # maybe there really is one vars:= x; n:= 1 fi; if nargs = 2 then dvars:= vlist else dvars:= [vars] fi; dgname:= cat(`diff/`,g); userinfo(2,{fixD,makediff},"Defining",dgname); try assign(dgname, unapply(add(diff(g(vars),v) *subs(V=v,'diff(V,t)'),v=dvars),vars,t)); catch: r:= 0; for v in dvars do if not member(v,[vars],'i') then error "%1 is not a member of %2",v,[vars]; fi; r:= r + Q[i](vars)*di(v,t); dgname2[i]:= cat(dgname,`/`,i); assign(dgname2[i], eval(D[i](g))); od; assign(dgname, subs(seq(Q[i]=dgname2[i],i = 1..n),di=diff, unapply(r,vars,t))) end try; if eval(dgname) = eval(diff) then assign(dgname,proc(v,t) diff(v,t) end) fi; end;