Deklarativní programování

Deklarativní programování se zabývá tím co se počítá a neřeší jak se to počítá (Např. u logického programování definujeme v kódu výrazy a vztahy a pak se dotazujeme na další klauzule, které z toho vyplývají. Jak probíhá samotné vyhodnocení klauzulí se neřeší.). Program je chápan jako funkce, která na základě vstupů vrátí výstup. Stejná funkce se stejnými argumenty dává u deklarativního prog. vždy stejný výsledek (vyhýbají se používání globálních proměnných).

Opakem tohoto principu je imperativní programování popisující jednotlivé úkony pomocí algoritmů. Zjednodušeně to lze popsat tak, že imperativní programy obsahují algoritmy, kterými se dosáhne chtěný cíl, zatímco deklarativní jazyky specifikují cíl a algoritmizace je ponechána programu (interpretu) daného jazyka.

Deklarativní programovaní se dělí na funkcionální a logické.

Funkcionální programování

Výpočet můžeme chápat jako vyhodnocení matematických funkcí. Funkcionální programování je založené na výpočetním modelu λ-kalkul. 

Lambda kalkul je výpočetní model který používá funkce jako metodu výpočtu, ne jako zobrazení. Dá se chápat jako nejjednodušší univerzální programovací jazyk s výpočetní silou srovnatelnou s Turingovy stroji.

Výpočtem funkcionálního programu je posloupnost vzájemně ekvivalentních výrazů, které se postupně zjednodušují až dosáhnou normální formy.

Funkcionální dělíme na typové, jejich zástupcem je Haskell a netypové mezi které patří Lips, Scheme.

Haskell

Je funkcionální jazyk používající zkrácené vyhodnocování. Vyžaduje přísné typování proměnných, podporuje práci se soubory a dodržuje referenční transparentnost (stejný výraz v různých místech kódu má stejnou hodnotu). 

Více o Haskellu najdete v tomto tutoriálu. Další příklady Haskellu:

- Binární strom
- Aritmetické vyrazy
- Třída

Ukázka zdojového kódu Haskellu (Test.hs):

 

> a = 5
> b = (6, "Hello")
> square x = x * x
> fact :: Integer -> Integer
> fact 0 = 1
> fact n = n * fact (n-1)
> spoj [] ys = ys
> spoj (x:xs) ys = x : (spoj xs ys).
Dotazy na program v Hugsu:

Prelude> load Test.hs
Test> a
5
Test> b
(6,"Kello")
Test> square 4
16
Test> fact 4
24

Logické programování a Prolog

Logické programování je založené na výrokové logice, tedy na vyhodnocování daných tvrzení. Příkladem programovací jazyk Prolog. Prolog je založen na predikátové logice prvního řádu. Program funguje na dokazování zadaných klauzulí. Takže v Prologu definujeme nějaké tvrzení na které se pak dotazujeme:

Ve skutečnosti to umí ještě trochu víc, třeba přepisovat svůj kód (retract), takže s tím jdou robit zajímavé věci:

- Piškvorky
- Dláždění

Ukázka zdojového kódu Prologu:

muz(emil).
muz(jan).
matka(anna,emil).
zena(X) :- matka(X,_).
syn (A,B) :- matka (B, A), muz(A).
Dotazy na program:

?- zena(anna).
yes. 
?- muz(X).
X = emil;
X= jan;
no.
?- syn(emil,X).
X=anna. 
Kam dál?