On Tue, Jun 22, 2010 at 11:04 AM, Grigory Sarnitskiy
<sargrigory at yandex.ru> wrote:
> Imagine I need a function f, such that
>
> f(a*b) = f(g(a) * g(b))
>
> I don't want maxima to evaluate it ad infinitum, only n steps
>
> so if
>
> n = 1 then f(a*b) = f(g(a) * g(b))
> n = 2 then f(a*b) = f(g(g(a)) * g(g(b)))
> n = 3 then f(a*b) = f(g(g(g(a))) * g(g(g(b))))
OK, how about this? Hope it's clear enough.
Bear in mind I didn't think too much about it ....
(%i1) apply_n (f, x, n) := if integerp(n) then block ([fx : apply (f,
[x])], for i thru n - 1 do fx : apply (f, [fx]), fx) else 'apply_n (f,
x, n);
(%o1) apply_n(f, x, n) := if integerp(n)
then block([fx : apply(f, [x])], for i thru n - 1 do fx : apply(f, [fx]), fx)
else 'apply_n(f, x, n)
(%i2) g_n (x) := apply_n (g, x, n);
(%o2) g_n(x) := apply_n(g, x, n)
(%i3) matchdeclare (aa, all);
(%o3) done
(%i4) simp:false;
(%o4) false
(%i5) tellsimpafter (foo("*"(aa)), foo(map (g_n, aa)));
(%o5) [foorule1, false]
(%i6) simp:true;
(%o6) true
(%i7) a*b;
(%o7) a b
(%i8) foo(a*b);
(%o8) foo(apply_n(g, a, n) apply_n(g, b, n))
(%i9) n:3;
(%o9) 3
(%i10) foo(a*b);
(%o10) foo(g(g(g(a))) g(g(g(b))))
best
Robert Dodier