Gratuluji! Dostali jste se až na konec. Už nejste jen studenti, jste začínající softwaroví inženýři. A jako inženýři víte, že napsat kód je jen polovina práce. Druhá polovina je zajistit, aby ten kód byl použitelný, udržovatelný a srozumitelný pro ostatní. V této závěrečné kapitole vytvoříme kompletní projekt: Vlastní verzi aplikace IDOS. Ale tentokrát to nebude jen o kódu. Naučíme se psát profesionální dokumentaci.
Cíl: Vytvořit systém pro vyhledávání vlakových spojení.
Požadavky:
Zde využijeme vše, co umíme: fakta pro mapu, rekurzi pro hledání cesty a aritmetiku pro výpočty.
/**
* Prolog-Express: Vyhledávač spojení.
* Autor: Váš Jméno
* Verze: 1.0
*/
% --- Databáze spojů ---
% spoj(Odkud, Kam, Cena, CasMinuty).
spoj(praha, brno, 200, 150).
spoj(brno, ostrava, 150, 60).
spoj(praha, plzen, 100, 90).
spoj(plzen, cheb, 50, 45).
spoj(brno, bratislava, 180, 90).
spoj(ostrava, kosice, 40, 30).
% Obojsměrnost (vlaky jezdí i zpět)
linka(X, Y, Cena, Cas) :- spoj(X, Y, Cena, Cas).
linka(X, Y, Cena, Cas) :- spoj(Y, X, Cena, Cas).
% --- Logika hledání ---
% cesta(Start, Cil, SeznamMest, Cena, Cas).
% Základní případ: Přímé spojení
cesta(Start, Cil, [Start, Cil], Cena, Cas) :-
linka(Start, Cil, Cena, Cas).
% Rekurzivní krok: Přestup
cesta(Start, Cil, [Start | DalsiMesta], CelkovaCena, CelkovyCas) :-
linka(Start, Prestup, Cena1, Cas1),
cesta(Prestup, Cil, DalsiMesta, Cena2, Cas2),
Start \= Cil, % Prevence cyklu (jednoduchá)
CelkovaCena is Cena1 + Cena2,
CelkovyCas is Cas1 + Cas2.
Kód bez dokumentace je jako mapa bez názvů měst. Nikdo se v něm nevyzná. Profesionální dokumentace má dvě části:
Tato část je pro lidi, kteří neumí programovat. Musí být jednoduchá a jasná.
1. Spuštění: Otevřete soubor vlaky.pl v programu SWI-Prolog.
2. Hledání spojení: Do konzole napište dotaz ve tvaru:
?- cesta(mesto_start, mesto_cil, Trasa, Cena, Cas).
3. Příklad: Chci jet z Prahy do Ostravy.
?- cesta(praha, ostrava, T, C, Time).
Výstup: T = [praha, brno, ostrava], C = 350, Time = 210.
Tato část je pro vaše kolegy (nebo pro vás za půl roku). Popisuje, jak to funguje uvnitř. V Prologu se často používá styl komentářů podobný Javadoc (Pldoc).
/**
* cesta(+Start, +Cil, -Trasa, -Cena, -Cas)
*
* Hledá vlakové spojení mezi dvěma městy.
*
* @param Start Atom, název výchozího města.
* @param Cil Atom, název cílového města.
* @param Trasa Seznam atomů, posloupnost měst.
* @param Cena Číslo, celková cena v Kč.
* @param Cas Číslo, celkový čas v minutách.
*/
Proč píšeme dokumentaci? Představte si "Bus Factor": Kolik členů týmu musí srazit autobus, aby projekt zkrachoval, protože nikdo jiný neví, jak funguje? Pokud je Bus Factor 1 (ví to jen jeden člověk), je to riskantní. Dokumentace zvyšuje Bus Factor a dělá projekt nesmrtelným.
README.txt (nebo .md). Napište do něj:
Gratulujeme! Prošli jste cestu od "co je to atom" až po vytvoření vlastního inteligentního systému s dokumentací. Prolog vás naučil myslet jinak. Naučil vás, že programování není jen o příkazech, ale o logice, vztazích a pravdě.
Tato kniha je jen začátek. Svět umělé inteligence je obrovský a vy teď máte klíč k jeho logickým dveřím.
Hodně štěstí při dalším studiu!