Pokud jste někdy tvořili web nebo aplikaci, pravděpodobně jste narazili na databáze jako MySQL nebo PostgreSQL. Tyto systémy ukládají data do tabulek (jako v Excelu). Říkáme jim relační databáze a mluvíme s nimi jazykem SQL. Možná vás překvapí, že Prolog je sám o sobě velmi výkonná databáze. Ale místo tabulek používá logiku a vztahy. V této kapitole se podíváme na to, v čem je Prolog jiný a v čem je dokonce lepší než klasické SQL.
V klasické databázi (SQL) je svět rozdělen do přísných tabulek. Každá tabulka má sloupce a řádky. V Prologu máme predikáty. Je to skoro to samé, ale mnohem flexibilnější.
Srovnání: Uživatelé
SQL (Tabulka):
| ID | Jmeno | Vek |
|----|-------|-----|
| 1 | Petr | 25 |
| 2 | Jana | 22 |
Prolog (Fakta):
user(1, 'Petr', 25).
user(2, 'Jana', 22).
Jak získat data? V SQL píšeme příkazy, které říkají "VYBER mi TOHLE z TAMTOHO". V Prologu jen popíšeme vzor toho, co hledáme.
Úkol: Najdi jména uživatelů starších 20 let.
SQL:
SELECT Jmeno FROM users WHERE Vek > 20;
Prolog:
?- user(_, Jmeno, Vek), Vek > 20.
Všimněte si, jak je to podobné. Čárka , v Prologu funguje jako AND (a zároveň) v SQL.
Kde Prolog skutečně září, jsou vztahy. Představte si sociální síť. Chcete najít "přítele přítele přítele".
V SQL je to noční můra. Musíte spojovat tabulky (JOIN) stále dokola:
SELECT ... FROM friends AS f1 JOIN friends AS f2 ON ... JOIN friends AS f3 ON ...
Je to pomalé a složité.
V Prologu? Použijeme rekurzi, kterou už známe!
% Přátelství je obousměrné
pritel(X, Y) :- kamarad(X, Y).
pritel(X, Y) :- kamarad(Y, X).
% Cesta v grafu přátelství
spojeni(X, Y) :- pritel(X, Y). % Přímý přítel
spojeni(X, Y) :- pritel(X, Z), spojeni(Z, Y). % Přítel přítele...
Tento kód najde spojení mezi libovolnými dvěma lidmi, ať je řetěz jakkoliv dlouhý. V SQL byste museli napsat jiný dotaz pro délku 2, jiný pro délku 3 atd. Prolog to zvládne jedním pravidlem.
Zatímco SQL databáze je jako chytrá kartotéka, Prolog je jako detektiv s touto kartotékou v hlavě. Nejenže data ukládá, ale umí z nich okamžitě vyvozovat nové souvislosti (např. "kdo je přítel přítele"), aniž byste museli psát složité dotazy.
JOIN v SQL a čárkou , v Prologu? (V podstatě dělají to samé – spojují dvě podmínky).kniha(id, nazev, autor), pujceno(id_knihy, id_ctenare), ctenar(id, jmeno).
kniha(KnihaID, _, 'Capek'), pujceno(KnihaID, CtenarID), ctenar(CtenarID, Jmeno).