Tellsimp and stack overflow.



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