Kapitola 6: Aritmetika a porovnávání – Počítáme v logice

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ě!

6.1 Operátor is – Když Prolog potřebuje kalkulačku

V 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`.

OPERÁTOR 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.
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.

6.2 Porovnávání čísel – Kdo je větší?

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

ARITMETICKÉ POROVNÁVACÍ OPERÁTORY Predikáty, které porovnávají číselné hodnoty. Vyhodnotí oba operandy jako aritmetické výrazy a poté porovnají jejich výsledky.

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`).

Řešené příklady: Počítáme a porovnáváme

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.

Klíčový koncept: Logika vs. Aritmetika

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.

Otázky k zamyšlení

  1. Proč je pro Prolog 1 + 1 term, a ne rovnou číslo 2? Jak to souvisí s tím, co jsme se učili o atomech a strukturách?
  2. Jaký je hlavní rozdíl mezi X = Y a X =:= Y? Kdy byste použili jedno a kdy druhé?
  3. Vymyslete si situaci z vašeho oblíbeného sportu nebo hry, kde byste potřebovali použít aritmetické porovnávání (např. "skóre je vyšší než...", "čas je kratší než...").

🧪 Laboratoř: Matematika pro detektivy