Kapitola 5: Logická továrna – Pravidla a dedukce

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!

5.1 Anatomie pravidla – Jak naučit počítač "Když..., tak..."

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ší."

PRAVIDLO (RULE) Konstrukce, která definuje nový vztah na základě jiných vztahů. Skládá se z hlavy a těla, oddělených symbolem :-.

Zápis:
Hlava :- Tělo.

V těle pravidla můžeme kombinovat více podmínek:

💡 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".

5.2 Příklad: Rodinné vztahy a "prostředník"

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.

Rodokmen s mimozemšťany
Obrázek 5.1: Rodokmen ukazující vztah prarodiče, rodiče (prostředníka Z) a vnuka.

Řešené příklady: Detektivní kancelář v akci

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í:

  1. Chci ověřit zlocinec(petr).
  2. Mám pravidlo: zlocinec(X) platí, pokud zlodej(X) a ukradl(X, auto).
  3. Dosadím petr za X.
  4. Podmínka 1: Je zlodej(petr) pravda? Ano, mám to ve faktech.
  5. Podmínka 2: Je ukradl(petr, auto) pravda? Ano, mám to ve faktech.
  6. Obě podmínky platí -> Pravidlo platí. Petr je zločinec.

Zkuste se zeptat na Pavla: ?- zlocinec(pavel).

  1. Podmínka 1: Je zlodej(pavel) pravda? Ne (ve faktech o zlodějích Pavel není, i když něco ukradl). -> FAIL.
  2. Prolog okamžitě končí a odpovídá false.

Klíčový koncept: Dedukce (Odvozování)

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í.

Otázky k zamyšlení

  1. Vymyslete pravidlo pro "sourozence". Kdy jsou dva lidé sourozenci? (Nápověda: Mají stejného rodiče). Jak byste to zapsali v Prologu pomocí predikátu rodic/2?
  2. Proč používáme v pravidlech proměnné (velká písmena)? Co by se stalo, kdybychom tam napsali konkrétní jména (atomy)?
  3. Jak byste definovali pravidlo plnolety(X), pokud máte fakta o věku vek(X, N)? (Nápověda: N musí být větší nebo rovno 18).

🧪 Laboratoř: Pravidla školního života