Vítejte v laboratoři Prologu! V předchozích kapitolách jsme si povídali o tom, jak Prolog "myslí" a jak rozlišuje data od znalostí. Teď je čas začít mluvit jeho jazykem. Nebojte se, není to tak složité jako latina, ale má svá přísná pravidla. Představte si, že se učíte gramatiku nového, velmi logického jazyka. Pokud uděláte chybu v tečce nebo velkém písmenu, Prolog vám prostě nebude rozumět. V této kapitole se naučíme základní stavební kameny: jak pojmenovávat věci (atomy) a jak o nich tvrdit pravdu (fakta).
Atom je základní stavební kámen Prologu. Je to konkrétní věc, kterou už dál nedělíme. Jméno, číslo, objekt. Představte si ho jako **jedinečnou nálepku** pro něco ve vašem světě. Když napíšete karel, myslíte tím konkrétního člověka jménem Karel. Není to proměnná, která by mohla nabývat různých hodnot. Karel je prostě karel. Atomy jsou "slova" v Prologu.
⚠️ Důležité pravidlo: Atomy v Prologu začínají vždy malým písmenem. Pokud napíšete slovo s velkým písmenem, Prolog si bude myslet, že je to proměnná (o těch v další kapitole). To je častá chyba začátečníků!
karel (správně - je to atom, jméno)jablko (správně - je to atom, předmět)Karel (ŠPATNĚ - toto je proměnná! Prolog si myslí, že hledáte "nějakého Karla")'Karel Novák' (správně - pokud je text v jednoduchých uvozovkách, může obsahovat velká písmena, mezery nebo speciální znaky. Je to stále atom, ale "složený".)Samotné atomy jsou nudné. karel a jablko nám nic neřeknou. Potřebujeme vyjádřit vztah mezi nimi nebo popsat jejich vlastnosti. K tomu slouží predikáty. Predikát je jako **sloveso** nebo **přídavné jméno** v běžné řeči. Popisuje vlastnost atomu nebo vztah mezi atomy.
Zápis: predikát(objekt1, objekt2).
⚠️ Pozor: Každý fakt musí končit tečkou! Tečka v Prologu znamená "konec věty" nebo "konec příkazu". Bez tečky Prolog čeká, že budete pokračovat, a to může vést k chybám.
muz(homer). % Homer je muž (Vlastnost - fakt)
zena(marge). % Marge je žena (Vlastnost - fakt)
rodic(homer, bart). % Homer je rodičem Barta (Vztah - fakt)
ma_rad(bart, pizza). % Bart má rád pizzu (Vztah - fakt)
Vidíte? Prostě popisujeme svět, jako bychom psali encyklopedii pravd.
V Prologu často uvidíte zápis jako rodic/2 nebo muz/1. Číslo za lomítkem říká, kolik má predikát argumentů (kolik věcí je v závorce). Představte si to jako **počet "rolí"**, které vztah vyžaduje. "Být mužem" vyžaduje jednu roli (kdo je muž). "Být rodičem" vyžaduje dvě role (kdo je rodič, koho je rodičem).
To je důležité, protože pro Prolog jsou predikáty se stejným jménem, ale různým počtem argumentů, úplně jiné věci. rodic/2 a rodic/3 jsou pro Prolog dva naprosto odlišné predikáty, které spolu nemají nic společného!
muz(homer). má aritu 1 (jeden argument: homer).rodic(homer, bart). má aritu 2 (dva argumenty: homer a bart).datum(1, leden, 2024). má aritu 3 (den, měsíc, rok).Dobrý programátor píše komentáře, aby ostatní (a on sám za týden) pochopili kód. Komentáře jsou texty, které počítač ignoruje, jsou jen pro lidi. Je to jako psát si poznámky do učebnice – počítač je nečte, ale vám pomohou.
% - Jednořádkový komentář. Vše za procentem až do konce řádku se ignoruje./* ... */ - Víceřádkový komentář. Může být přes několik řádků.Někdy atom nestačí. Potřebujeme popsat složitější objekt, který má více částí. Třeba knihu. Kniha má autora, název a rok vydání. V Prologu to můžeme zabalit do jednoho balíčku, kterému říkáme struktura. Představte si to jako **krabici**, která obsahuje další menší krabice nebo nálepky (atomy).
kniha(autor(capek), nazev('R.U.R.'), rok(1920)).
Zde je kniha hlavní funktor (název velké krabice) a uvnitř má další struktury (autor, nazev, rok), které obsahují atomy. Je to jako složka v počítači, ve které jsou další složky s dokumenty.
kniha
/ | \
autor nazev rok
| | |
capek 'RUR' 1920
Pojďme si to vyzkoušet na něčem, co znáte. Vytvoříme malou databázi postav z Harryho Pottera. Definujeme, kdo je kouzelník a kdo je mudla. To jsou naše "fakta" o světě Harryho Pottera.
% Fakta o postavách ze světa Harryho Pottera
kouzelnik(harry).
kouzelnik(ron).
kouzelnik(hermiona).
mudla(dursley).
% Vlastnosti postav
ma_jizvu(harry).
ma_bryle(harry).
ma_zrzave_vlasy(ron).
Teď se můžeme ptát (v konzoli Prologu). Představte si, že se ptáte svého "Prolog detektiva":
?- kouzelnik(harry).true. (Ano, to je pravda, máme to v naší databázi faktů).?- kouzelnik(dursley).false. (Ne, v naší databázi je Dursley veden jako mudla, ne kouzelník. Prolog předpokládá, že ví všechno, takže pokud něco nenajde, považuje to za nepravdu.)?- ma_bryle(ron).false. (V naší databázi není fakt, že Ron má brýle, takže Prolog odpoví "ne".)V této kapitole jsme se naučili, jak Prologu "říct", co je pravda. Pomocí atomů pojmenováváme konkrétní věci a pomocí faktů (složených z predikátů a atomů) popisujeme jejich vlastnosti a vztahy. Takto postupně budujeme "znalostní bázi" – svět, ve kterém se Prolog bude orientovat a hledat odpovědi na naše otázky.
muz/1, zena/1, rodic/2, ma_rad/2. Nezapomeňte na malá písmena pro jména a tečky na konci! Přidejte komentáře, aby bylo jasné, co který fakt znamená.porazi(kamen, nuzky). Zapište všechny kombinace, kdo koho porazí. Jak byste zapsali, že "kamen" neporazí "papir"?