tellsimp ..... 簡易化の規則を定義する

Maxima は asin(1 / 2) が π/6 であることを知っている:

(%i1) asin(1/2);

                                 %pi
(%o1)                            ---
                                  6
しかし、asin(1/sqrt(2)) が π/4 であることは知らない:
(%i2) asin(1/sqrt(2));

                                    1
(%o2)                       asin(-------)
                                 sqrt(2)

Maxima の知らない簡易化規則を定義するのが tellsimp であり、書式

tellsimp(複雑な式, 簡単な式)

で用いる。

(%i3) tellsimp(asin(1/sqrt(2)), %pi/4);

(%o3)                  [asinrule1, simp-%asin]

(%i4) asin(1/sqrt(2));

                                 %pi
(%o4)                            ---
                                  4

定義した簡易化規則を削除する(デフォルトに戻す)には kill を使う:

(%i5) kill(asinrule1);

(%o5)                           done

(%i6) asin(1/sqrt(2));

                                    1
(%o6)                       asin(-------)
                                 sqrt(2)

全ての規則を削除する場合は kill(rules) を実行する。変数 rules には現在定義されている規則の名前が代入されている:

(%i7) rules;

(%o7) [trigrule0, trigrule1, trigrule2, trigrule3, trigrule4,
htrigrule1, htrigrule2, htrigrule3, htrigrule4, asinrule1,
asinrule2, asinrule3, asinrule4, acosrule1, acosrule2, acosrule3,
acosrule4, atanrule1, atanrule2, atanrule3, atanrule4]

それぞれの簡易化規則を表示するには disprule を用いる:

(%i8) disprule(trigrule0);

                                          sin(a)
(%o8)               trigrule0 : tan(a) -> ------
                                          cos(a)

例えば、三角関数の計算において cos(x)^2 = 1 - sin(x)^2 と簡易化するためには matchdeclare を併用する必要がある:

(%i9) matchdeclare(x, true);

(%o9)                           done

(%i10) tellsimp(cos(x)^2, 1 - sin(x)^2);

(%o10)                   [^rule1, simpexpt]

(%i11) cos(x)^2;

                                    2
(%o11)                       1 - sin (x)

(%i12) cos(y)^2;

                                    2
(%o12)                       1 - sin (y)
そうしない(matchdeclare(x, false) の)場合、cos(y)^2 など(変数が x 以外)は簡易化されない。なお、^ で始まる規則を削除する場合は引用符で囲む必要がある(kill("^rule1"))。

補足 方程式 t^2 = t + 1 に従って簡易化するために、

(%i1) tellsimpafter(t^2, t + 1);

(%o1)                    [^rule1, simpexpt]
としても上手くいかない:
(%i2) t^2;

(%o2)                           t + 1

(%i3) t^3;

                                  3
(%o3)                            t
このような目的のためには tellrat を使う。