# Interní reprezentace a substituce

## Interní reprezentace

pol: x^4+x^3-x^2-x;

op(pol);

Pomocí nterms získáme počet sčítanců.

nterms(pol);

length(pol);

inpart(pol,0);

Vrací operátor (stejně jako příkaz op).

inpart(pol,4);

part(pol,4);

part a inpart vracejí podvýrazy daného výrazu, přičemž inpart se zaměřuje na 
interní reprezentaci výrazu (ta může být odlišná od té zobrazené).

inpart(pol,4,1);inpart(pol,4,2);

[part(pol,0), part(pol,1), part(pol,2), part(pol,3), part(pol,4)];

dpart(pol,2);

Označuje podvýraz.

listofvars(pol);

dispform(pol);

Vrací seznam proměnných, obsažených v zadaném výrazu.

nterms(pol);

op(pol);

op(x^4);

op(-x^2);

op(x^2*y^3*z^4);

r: (y^2-1)/(y-1);

op(r);

r:(sin(x)^2-1)/(sin(x)-1);

op(r);

rat(r);

## Substituce

Substituce se provádí příkazem subst(a,b,c), který má tři povinné parametry.
Nahrazuje b pomocí a ve výrazu c.

subst(0,x, cos(x)*(sin(x)+x^2+1));

Subst je čistě syntaktická substituce, a, b musí být buď proměnné nebo 
kompletní podvýrazy.

Ekvivalentí zápis je i tento

subst(x=0, cos(x)*(sin(x)+x^2+1));

a tento

cos(x)*(sin(x)+x^2+1), x=0;

expression:1+tan(x)^2;

subst(sin(x)/cos(x),tan(x), expression);

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

ratsimp(%);

Posloupnost substitucí - program provede první substituci a ve výsledku pak další
substituci. Substituce píšeme do hranatých závorek a oddělujeme je čárkou.
V tomto případě můžeme použít pouze zápis s rovnítkem.

subst([tan(x)=sin(x)/cos(x), sin(x)^2=1-cos(x)^2], expression);

ratsimp(%);

Paralelní posloupnost substitucí provádí příkaz psubst:

psubst ([a^2=b, b=a], sin(a^2) + sin(b));

subst ([a^2=b, b=a], sin(a^2) + sin(b));

Paralelní (současná) substituce:

psubst([x=y, y=z], x*y^2);

Posloupnost substitucí:

subst([x=y, y=z], x*y^2);

subst([a=b, b=c, c=a], a+2*b+3*c);

psubst([a=b, b=c, c=a], a+2*b+3*c);

subst(x+1=y, 3*(x+1)^2+x+1);

V tomto případě se syntaktická substituce neprovedla,
použijeme příkaz ratsubst, který si všímá matematického významu výrazu.

ratsubst(y,x+1,3*(x+1)^2+x+1);

Zde je možné použít pouze tento typ zápisu.

subst([a=b, b=c, c=a], a+2*b+3*c);

load("lrats");

lratsubst([a=b, b=c, c=a], a+2*b+3*c);

fullratsubst([a=b, b=c, c=a], a+2*b+3*c);

Lze provádět substituce i za části výrazů. Podmínkou je, že Maxima
interně rozezná podvýraz (výstup procedury part).

expr1:x*y+z; expr2:x*y*z; expr3:(x*y)^2;

subst(soucin,x*y, expr1);

subst(soucin,x*y, expr2);

subst(soucin,x*y, expr3);

length(expr1);

[part(expr1,1), part(expr1,2)];

length(expr2);

[part(expr2,1),part(expr2,2),part(expr2,3)];

length(expr3);

[part(expr3,1),part(expr3,2)];

Ratsubst (narozdíl od subst) si všímá i matematického významu výrazu.

ratsubst(soucin,x*y, expr2);

ratsubst(soucin,x*y, expr3);

vyraz:a+b+c;

subst(d,a+b, vyraz);

ratsubst(d,a+b, vyraz);

p:a+2*b+3*c;

ratsubst(d,a+b,p);

Pro substituci za operandy výrazu můžeme použít příkaz substpart.

vyraz : x^2+x+1/x;

substpart(y,vyraz,3);

Třetí operand byl nahrazen y.

Opsubs provádí substituci pouze za operátory.

load ("opsubst");

opsubst(f,g,g(g(x)));

opsubst([f=g,g=h],f(x));

Použití substitucí při úpravách výrazů.

soucin:(x^2+y^2+2*x*y) * ((x+y)^2+1);

factor(soucin);

substpart(factor(part(soucin,1)),soucin,1);

Zjednodušení z předcházejícího příkladu je možné provést i takto:

subst(x+y=z, soucin);

factor(%);

subst(z=x+y, %);

vyraz:(x^2+2*x+1)^2+(x^2-2*x+1)^2;

factor(vyraz);

map(factor, vyraz);

Substitucí často používáme při zjednodušování výrazů

vyraz:(x+y)^2+1/(x+y)^2;

rat(vyraz);

Chceme výraz transformovat na tvar čitatel/jmenovatel bez expanze (x+y)^2.
Dočasně nahradíme x+y pomocí např. z, použijeme příkaz rat a konečně provedeme
zpětnou substituci.

subst(x+y=z, vyraz);

rat(%);

subst(z=x+y,%);