Deklarativní programování je založeno na myšlence programování aplikací pomocí definic co se má udělat, a ne jak se to má udělat. 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í programování se snaží programátora ušetřit vytváření chyb, které běžně vznikají při tvorbě v imperativních jazycích. V imperativních jazycích je běžné mít proměnné globálního charakteru, do kterých zapisují ostatní funkce a metody. Toto je zdrojem mnoha chyb. Deklarativní jazyky se tento problém snaží řešit. Proměnné jsou v nich používány velmi střídmě, protože hodnoty se nejčastěji předávají ve formě návratové hodnoty určité funkce. Deklarativní jazyky také neobsahují prostředky, jak provést cyklus známý jako do-while nebo for. Vše je řešeno pomocí rekurze.
K deklarativnímu programování lze přistupovat dvojím způsobem. Tím prvním je použití jazyka ze skupin programovacích jazyků, které byly navrženy přímo pro deklarativní programování. Jsou to jazyky patřící mezi funkcionální programovací jazyky, logické programovací jazyky a programovací jazyky s omezujícími podmínkami. V těchto jazycích se zpravidla definuje množina funkčních závislostí nebo pravidel. Po spuštění takového programu jsou vyhodnocovány vstupy těmito podmínkami. V programech nebývá důležité přesné pořadí jednotlivých pravidel, protože kód nebývá zpracováván lineárně tak, jak tomu bývá u imperativních programovacích jazyků.
Druhým přístupem je použití imperativního jazyka s knihovnou pro podporu deklarativního programování. Jde vlastně jen o skrytí imperativních částí programového kódu a vlastní použití takovéto knihovny je v duchu deklarativního programování. Příkladem mohou být unit testy, např. JUnit, NUnit…
Další skupinu jazyků řazené mezi deklarativní jazyky tvoří doménově specifické jazyky neboli jazyky pro řešení konkrétního problému. Tyto jazyky bývají typicky turingovsky neúplné. Příkladem může být jazyk SQL pro manipulaci s daty v databázi, regulární výrazy nebo třeba jazyk XSL pro manipulaci s XML daty.
Deklarativní programovací jazyk, jako každý programovací jazyk, musí mít syntax a sémantiku. Z tohoto důvodu do této skupiny nelze zařadit obecné XML bez definovaného doctype (významu dat).
SELECT firstname, lastname FROM users ORDER BY lastname ASC;
Provede dotaz a vybere všechna jména a příjmení uživatelů z tabulky users a seřadí je vzestupně podle příjmení.
(define (faktorial n)
(if (= n 0)
1
(* n (faktorial (- n 1))))))
a jeho zavolání
(faktorial 5)
% Ladislav je rodičem Adriany
rodic(ladislav, adriana).
% Ladislav je rodičem Lubomíra
rodic(ladislav, lubomir).
% Šárka je rodičem Lubomíra
rodic(sarka, lubomir).
% definice sourozence
sourozenec(Sourozenec, X) :- rodic(Y, X), rodic(Y, Sourozenec), \+(Sourozenec = X).
pokud se pak potřebujeme zeptat jaké má Adriana sourozence, zapíšeme:
sourozenec(adriana, X).
Výstupem pak bude
X = lubomir ;
No
nebo jací jsou rodiče Lubomíra:
rodic(X, lubomir).
výsledkem bude:
X = ladislav ;
X = sarka ;
No