Kapitola 10: 4-portový model – Jak Prolog "chodí"

Když programujete v Javě nebo Pythonu, váš kód běží jako voda v potrubí – shora dolů, řádek po řádku. V Prologu je to jiné. Prolog je spíše jako myš v bludišti. Zkouší jednu cestu, narazí na zeď, vrátí se na křižovatku a zkusí jinou. Abychom pochopili, kde se Prolog právě nachází a proč nám dává (nebo nedává) odpovědi, používáme tzv. 4-portový model (Box Model). Je to mapa, podle které se Prolog orientuje.

10.1 Čtyři brány (The 4 Ports) – Vstupy a výstupy

Představte si každé pravidlo nebo cíl jako krabici (box), která má 4 dveře (porty). Prolog do ní může vstoupit a odejít různými způsoby. Je to jako návštěva u kamaráda, který hledá něco, co jste po něm chtěli.

Krabice se 4 dveřmi
Obrázek 10.1: 4-portový model Prologu. Každé pravidlo je krabice se čtyřmi dveřmi: CALL, EXIT, REDO, FAIL.
CALL (Volání) Vstupní brána. Klepete na dveře. Prolog poprvé zkouší splnit tento cíl. Říká: "Zkusím to vyřešit."
EXIT (Výstup/Úspěch) Výstupní brána úspěchu. Kamarád vás pustí dál. Cíl byl splněn! Prolog našel řešení a pokračuje k dalšímu cíli. Říká: "Mám to! Tady je výsledek."
REDO (Znovu/Návrat) Vstupní brána návratu. Někde dál to nevyšlo, nebo uživatel (vy) chce další řešení (zmáčkl středník ;). Vracíte se zpět do této krabice a ptáte se: "Nemáš ještě jiné řešení?" Říká: "Zkusím najít něco jiného."
FAIL (Selhání) Výstupní brána neúspěchu. Kamarád říká "Už nic nemám" nebo "To nejde". Všechny možnosti v této krabici selhaly. Prolog couvá dál dozadu (backtracking). Říká: "Tudy cesta nevede."

10.2 Příklad v praxi – Stopujeme Prolog

Prolog má nástroj zvaný trace, který nám umožní vidět tyto 4 stavy v přímém přenosu. Podívejme se na jednoduchý dotaz na rodiče.

[trace] ?- rodic(homer, X).
   Call: (8) rodic(homer, _G123) ?  <-- Vstupujeme do krabice 'rodic'. Hledáme někoho (_G123).
   Exit: (8) rodic(homer, bart) ?   <-- Úspěch! Našli jsme Barta. Vycházíme ven.
X = bart ;                          <-- Uživatel chce další řešení (zmáčkl středník).
   Redo: (8) rodic(homer, _G123) ?  <-- Vracíme se do krabice 'rodic'. Hledáme dál.
   Exit: (8) rodic(homer, lisa) ?   <-- Úspěch! Našli jsme Lisu.
X = lisa ;                          <-- Uživatel chce další.
   Redo: (8) rodic(homer, _G123) ?  <-- Vracíme se.
   Fail: (8) rodic(homer, _G123) ?  <-- Už žádné další děti nejsou. Selhání.
false.

Klíčový koncept: Backtracking (Zpětné navracení)

Port REDO je klíčem k mechanismu zvanému Backtracking. Když Prolog narazí na slepou uličku (FAIL) nebo když si vyžádáte další řešení, vrátí se po svých stopách k poslednímu rozhodnutí (poslední krabici, která má ještě jiné možnosti) a zkusí jinou cestu. Je to jako procházení bludištěm s pravidlem pravé ruky.

Otázky k zamyšlení

  1. Který port znamená, že Prolog začíná řešit úkol poprvé? (Call).
  2. Co se děje uvnitř "krabice" mezi porty CALL a EXIT? (Prolog prohledává svou databázi faktů a pravidel).
  3. Představte si, že hledáte klíče. Podíváte se do kapsy (CALL). Jsou tam (EXIT). Ale nejsou to ty správné. Vrátíte se myšlenkou zpět (REDO) a podíváte se do batohu. Jak byste tuto situaci popsali pomocí 4 portů?

🧪 Laboratoř: Hra na Prolog