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