Představte si, že se zeptáte kamaráda: "Má Karel auto?" Kamarád odpoví: "Nevím." To je normální lidská odpověď. Ale Prolog není člověk. Prolog je jako velmi přísný byrokrat nebo vyhazovač v klubu. Pokud se ho zeptáte na něco, co nemá ve svých papírech, neřekne "nevím". Řekne striktní "NE" (false). Tento rozdíl je zásadní pro pochopení toho, jak Prolog vnímá pravdu a lež.
Prolog žije v bublině. Věří, že jeho databáze obsahuje veškerou pravdu o světě. Cokoliv, co v databázi není (nebo se z ní nedá odvodit), je automaticky považováno za nepravdu. Tomuto principu říkáme Předpoklad uzavřeného světa.
Představte si to jako seznam hostů na VIP párty. Přijde někdo ke dveřím. Vyhazovač (Prolog) se podívá na seznam.
V Prologu používáme pro negaci ("není pravda, že...") operátor \+ (nebo někdy not). Ale pozor! Tento operátor neznamená "je to lež". Znamená to "nepodařilo se mi dokázat, že je to pravda".
\+ X je pravdivý, pokud se Prologu nepodaří dokázat X.
Příklad: Kdo je sirotek?
rodic(homer, bart).
sirotek(X) :- \+ rodic(_, X).
Čteme: X je sirotek, pokud se mi nepodaří najít nikoho, kdo je jeho rodičem.
?- sirotek(bart). -> Prolog zkusí najít rodiče Barta. Najde Homera. Takže rodic(_, bart) uspěje. Negace \+ to otočí na false. Bart není sirotek.?- sirotek(batman). -> Prolog zkusí najít rodiče Batmana. V databázi nic není. Hledání selže. Negace \+ to otočí na true. Batman je sirotek (podle naší databáze!).⚠️ Nebezpečná negace: Nikdy nepoužívejte negaci s proměnnou, která ještě nemá hodnotu!
?- \+ rodic(X, bart).
Prolog se snaží dokázat: "Existuje někdo, kdo je rodičem Barta?" Ano, Homer. Takže důkaz uspěl. Negace z toho udělá false. Výsledek je "false". Prolog vám neřekne "kdo není rodičem Barta". Jen řekne "není pravda, že nikdo není rodičem Barta".
V reálném světě absence důkazu není důkazem neexistence (to, že jsem neviděl mimozemšťana, neznamená, že neexistují). V Prologu (CWA) absence důkazu JE důkazem neexistence. To je obrovská síla, ale i past, na kterou si musíte dát pozor.
?- \+ muz(X). (Kdo není muž?)? Co by Prolog udělal? (Zkusil by najít někoho, kdo JE muž. Pokud by ho našel, řekl by false).sirotek(X). Funguje to?neni_muz(X).
neni_muz(X) :- \+ muz(X). Zkuste se zeptat ?- neni_muz(X). Co se stane?neni_muz(X) :- osoba(X), \+ muz(X). (Nejdřív musíme říct, kdo je X, a teprve pak ověřit, že to není muž). Vyzkoušejte to!