Náš logický detektiv Prolog je skvělý v odvozování pravd a hledání souvislostí. Ale co když potřebujeme spočítat, kolik je 2 + 2, nebo zjistit, jestli je jedno číslo větší než druhé? I když Prolog není primárně kalkulačka, umí pracovat s čísly. Musíme mu ale ukázat, jak na to, protože jeho "matematika" se trochu liší od toho, na co jste zvyklí z jiných programovacích jazyků. Zde se často chybuje, protože studenti očekávají, že symbol = znamená "vypočítej" nebo "přiřaď hodnotu". Ale jak už víme z kapitoly o unifikaci, v Prologu je všechno o pravdě a shodě!
is – Když Prolog potřebuje kalkulačkuV Prologu nemůžeme napsat X = 1 + 1 a očekávat, že X bude 2. Proč? Protože symbol = v Prologu znamená **unifikaci** (shodu tvaru), nikoli aritmetické vyhodnocení. Pro Prolog je 1 + 1 jen **struktura** (term), která se skládá z operátoru `+` a dvou argumentů `1` a `1`. Není to automaticky číslo `2`.
is
Speciální predikát v Prologu, který slouží k aritmetickému vyhodnocení výrazu. Levá strana (proměnná) se unifikuje s číselnou hodnotou výrazu na pravé straně.
Představte si to jako ve škole:
X = 1 + 1 je jako když učitel napíše příklad na tabuli. Je to jen text příkladu, nikdo ho ještě nepočítal. Prolog jen řekne: "Dobře, X se unifikuje s termem `1 + 1`."X is 1 + 1 je jako když žák příklad vypočítá a napíše výsledek do sešitu. Prolog řekne: "Aha, `1 + 1` je `2`, takže X se unifikuje s `2`."?- X = 1 + 1.
X = 1 + 1. % Prolog jen opsal výraz, nepočítal. X je teď term '+(1, 1)'.
?- X is 1 + 1.
X = 2. % Prolog výraz vyhodnotil. X je teď číslo 2.
⚠️ Častá chyba: Nikdy nepoužívejte X is Y, pokud proměnná Y (nebo jakákoli proměnná v aritmetickém výrazu na pravé straně) ještě nemá hodnotu! Prolog neumí počítat s neznámými. Musí znát všechna čísla na pravé straně, aby mohl výraz vyhodnotit.
Kromě počítání často potřebujeme čísla porovnávat. Je 5 větší než 3? Je teplota nad nulou? Pro tyto účely má Prolog speciální **aritmetické porovnávací operátory**.
X > Y (větší než)X < Y (menší než)X >= Y (větší nebo rovno)X =< Y (menší nebo rovno - POZOR! Píše se to takto, ne <=, to by Prolog nepochopil. Je to kvůli tomu, aby se to nepletlo se šipkou.)X =:= Y (aritmetická rovnost - vypočítá obě strany a porovná výsledky. Např. `1 + 1 =:= 2` je `true`.)X =\= Y (aritmetická nerovnost - vypočítá obě strany a porovná výsledky. Např. `1 + 1 =\= 3` je `true`.)Tyto operátory fungují jako malé "logické testy". Pokud je porovnání pravdivé, predikát uspěje (vrátí `true`), jinak selže (vrátí `false`).
Příklad 6.1: Převod teploty
Napišme pravidlo, které převede stupně Celsia na Fahrenheita. Vzorec je F = C * 1.8 + 32.
c_to_f(C, F) :-
F is C * 1.8 + 32.
Dotaz: ?- c_to_f(100, X).
Prolog: "Aha, chci převést 100 stupňů Celsia. Vezmu 100, vynásobím 1.8, přičtu 32. Výsledek je 212.0. Takže X je 212.0."
Odpověď: X = 212.0.
Příklad 6.2: Je číslo kladné?
Jednoduché pravidlo, které zjistí, zda je číslo větší než nula.
kladne(X) :- X > 0.
Dotaz: ?- kladne(5). -> true.
Dotaz: ?- kladne(-3). -> false.
V Prologu je důležité rozlišovat mezi **logickou shodou (unifikací)**, kterou provádí operátor =, a **aritmetickým vyhodnocením**, které provádí operátor is a aritmetické porovnávací operátory. Prolog je primárně o logice a vztazích mezi termy. Aritmetika je speciální "doplněk", který vyžaduje explicitní příkaz k výpočtu.
1 + 1 term, a ne rovnou číslo 2? Jak to souvisí s tím, co jsme se učili o atomech a strukturách?X = Y a X =:= Y? Kdy byste použili jedno a kdy druhé?obvod_obdelnika(A, B, O), které spočítá obvod obdélníka se stranami A a B. Vzorec je O = 2 * A + 2 * B.je_trojuhelnik(A, B, C), které ověří, zda tři zadané délky stran A, B a C mohou tvořit trojúhelník. Pamatujte na pravidlo: součet libovolných dvou stran musí být větší než třetí strana. Musí to platit pro všechny tři kombinace stran!skore(hrac, body). Napište pravidlo je_vitez(Hrac), které zjistí, zda má hráč více než 1000 bodů.