Představte si, že máte hromadu cihel (fakta). Jsou užitečné, ale dům z nich sám nevyroste. Potřebujete plány, maltu a postupy, jak cihly spojit. V Prologu jsou těmito plány Pravidla. Zatímco fakta nám říkají, co je, pravidla nám říkají, co z toho vyplývá. Díky pravidlům se Prolog mění z obyčejné databáze na inteligentní stroj, který umí "myslet" a odvozovat nové informace, které jste mu nikdy přímo neřekli. Vítejte v továrně na logiku!
Pravidlo je v podstatě podmíněná věta. V běžném životě je používáte neustále: "Když bude pršet, vezmu si deštník." V Prologu to jen otočíme: "Vezmu si deštník, POKUD prší."
:-.
Zápis:
Hlava :- Tělo.
:-: Čteme jako "pokud" (if). Je to stylizovaná šipka směřující doleva (<-). Říká: "To vlevo platí, pokud platí to vpravo."V těle pravidla můžeme kombinovat více podmínek:
, znamená A ZÁROVEŇ (AND). Musí platit všechno.; znamená NEBO (OR). Stačí, když platí jedno.💡 Tip pro experty: I když Prolog podporuje středník ; (nebo), programátoři ho nemají rádi, protože kód je pak nepřehledný. Místo toho raději napíšeme dvě samostatná pravidla se stejnou hlavou pod sebe. Prolog automaticky zkusí první, a když neuspěje, zkusí druhé. To funguje jako "nebo".
Pojďme naučit počítač chápat rodinu. Máme tato fakta (cihly):
muz(jan).
muz(pavel).
zena(jana).
rodic(jan, pavel). % Jan je rodičem Pavla
rodic(jana, pavel). % Jana je rodičem Pavla
Počítač ví, kdo je rodič. Ale neví, kdo je "otec". My víme, že otec je rodič, který je muž. Naučíme to Prolog pomocí pravidla.
V češtině: "Někdo (X) je otcem někoho (Y), pokud X je rodičem Y a zároveň X je muž."
V Prologu:
otec(X, Y) :- rodic(X, Y), muz(X).
A co prarodič? To je složitější. Prarodič je rodič mého rodiče. Potřebujeme "prostředníka" – toho rodiče uprostřed (např. vašeho tátu). V pravidle si pro něj vytvoříme pomocnou proměnnou, třeba Z.
prarodic(X, Y) :- rodic(X, Z), rodic(Z, Y).
Čteme: X je prarodičem Y, POKUD existuje nějaké Z takové, že X je rodičem Z A ZÁROVEŇ Z je rodičem Y.
Příklad 5.1: Kdo je zločinec?
Vraťme se k našemu detektivovi. Máme seznam zlodějů a seznam krádeží.
zlodej(petr).
ukradl(petr, auto).
ukradl(pavel, kolo).
% Pravidlo: Zločinec je ten, kdo je zloděj A ZÁROVEŇ ukradl auto.
zlocinec(X) :- zlodej(X), ukradl(X, auto).
Teď se zeptáme: ?- zlocinec(petr).
Jak Prolog přemýšlí:
zlocinec(petr).zlocinec(X) platí, pokud zlodej(X) a ukradl(X, auto).petr za X.zlodej(petr) pravda? Ano, mám to ve faktech.ukradl(petr, auto) pravda? Ano, mám to ve faktech.Zkuste se zeptat na Pavla: ?- zlocinec(pavel).
zlodej(pavel) pravda? Ne (ve faktech o zlodějích Pavel není, i když něco ukradl). -> FAIL.false.Dedukce je proces, kdy z obecných pravidel a konkrétních faktů vyvozujeme nové, konkrétní závěry. Prolog je mistr dedukce. Vy mu dáte střípky informací (fakta) a návod, jak je spojit (pravidla), a on vám postaví celou mozaiku odpovědí.
rodic/2?plnolety(X), pokud máte fakta o věku vek(X, N)? (Nápověda: N musí být větší nebo rovno 18).sestra(X, Y): X je sestra Y (X je žena, mají společného rodiče, X není Y).stryc(X, Y): X je strýc Y (X je bratr rodiče Y).student(jmeno), znamka(jmeno, predmet, hodnota).propada(Student) :- Student má z nějakého předmětu známku 5.vyznamenani(Student) :- Student má samé jedničky (tohle je těžší, zkuste zatím jen pro jeden předmět).