# Proměnné a jejich vyhodnocování

## Přiřazování hodnot proměnným

CAS systémy jsou schopny pracovat s formulemi a řešit úlohy, ve kterých 
se vyskytují neznamé a parametry.

solve(a*x^2+b*x+c,x);

Zde a,b a c jsou parametry a x je neznámá. Jsou použity jako symboly. 
Toto použití "volných proměnných", které neukazují na žádnou hodnotu, 
kromě jejich vlastního jména, je charakteristické pro symbolické systémy.

Promennym prirazujeme hodnoty pomoci operatoru :. jmeno:vyraz

pol:9*x^3-37*x^2+47*x-19;

factor(pol);

x;pol;

x:19/9;

x;pol;

Narozdíl od Maplu zde nedochází k úplnému vyhodnocení!

ev(pol,x:19/9);

Příkaz ev(vyraz,podm1,podm2,....) vyhodnocuje vyraz za předpokladu 
platnosti zadaných podmínek.

kill(pol);

pol;

Příkaz kill(all) zruší nastavení všech proměnných.

kill(all);

ev(solve(a*x+b=0),x,a:3,b:12);

a;

Vidíme, že přiřazení hodnot proměnným a, b bylo jen lokální 
(v rámci příkazu ev). Vně příkazu nemá proměnná a přiřazenu 
žádnou hodnotu.

a:9/4;

exp(a);

ev(exp(a),float);

Příkaz values vraci jména proměnných, kterým byla přiřazena hodnota.

values;

[a];

kill(a);

Pravidlo pro vyhodnocování

[a,b,c];

c : a+b;

a : 10;

b : 6;

Pokud nyní necháme vyhodnotit c, jaký bude výsledek?

c;

Jakmile je proměnné přiřazena hodnota, nedochází k její změně dodatečným 
přiřazením (kromě další změny hodnoty této proměnné). V našem případě, 
pokud byla proměnné c přiřazena hodnota a+b, tak další přiřazení hodnot 
proměnným a, b nemění hodnotu proměnné c.

values;

[c,a,b];

Ale pokud teď zadáme znovu c : a+b; dostáváme

c : a+b;

protože nyní dojde k vyhodnocení proměnných a,b.

Úplného vyhodnocení u předchozího příkladu můžeme dosáhnout 
pomocí příkazu eval.

kill(a,b,c);

c : a + b;

a : 10;

b : 6;

c;

ev(c, eval);

Operator ' zamezuje vyhodnocování.

i : 2;

'i;

## Jména proměnných

Rezervovaná slova, která nepoužíváme pro označování proměnných:

integrate            next           from                 diff            
in                   at             limit                sum             
for                  and            elseif               then            
else                 do             or                   if              
unless               product        while                thru            
step   

Ve jménu proměnné se mohou vyskytovat písmena (rozlišuje se mezi velkými 
a malými), číslice a znaky % a _. Ostatní znaky musíme zadávat se znakem 
zpětné lomítko (backslash) před speciálním znakem.

%Obycejne_jmeno;

Odpoved\:;

Jmeno\ s\ mezerou;

## Funkce assume a forget

kill(all);

sqrt(a^2);

assume(a>0);

Příkazem assume(podm1,podm2,...) definujeme předpoklady. Tyto jsou 
platné (narozdíl od příkazu ev) až do té doby, než je zrušíme 
příkazem forget.

is (a>0);

sqrt(a^2);

forget(a>0);

sqrt(a^2);

Zmenu predpokladu muzeme provest az po jeho zruseni (forget).

Pomoci assume a forget muzeme zadat i vice predpokladu zaraz.

assume(n+1>0,m+1>0);

integrate(a*x^n+b*x^m, x);

## Příkaz declare

Příkaz declare(prom1,podm1,prom2,podm2,...) definuje předpoklad podm1 
pro proměnnou prom1, předpoklad podm2 pro proměnnou prom2, atd.

(-1)^(n+1);

Zavedem předpoklad, že n je liché číslo.

declare(n,odd);

(-1)^(n+1);

Stejně jako u assume musíme předpoklad nejdříve zrušit, abychom mohli 
zavést nový.

kill(n);

(-1)^(n+1);

declare(n,even);

(-1)^(n+1);