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.
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.
;). 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."
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.
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.
otec(X,Y) :- rodic(X,Y), muz(X).). To už budou dvě krabice propojené za sebou!