Kapitola 21: AI v praxi 3 – Expertní systémy

Představte si, že máte v počítači mozek nejlepšího lékaře na světě. Nebo nejlepšího automechanika. Nebo právníka. Program, který se vás zeptá na pár otázek a pak vám s jistotou řekne: "Máte chřipku" nebo "Vyměňte svíčky v motoru". Tomuto typu umělé inteligence se říká Expertní systém. V 80. letech to byl vrchol AI a dodnes se používají tam, kde potřebujeme přesná pravidla a logické zdůvodnění (např. v bankovnictví při schvalování hypoték).

21.1 Anatomie experta

Každý expertní systém se skládá ze dvou hlavních částí:

BÁZE ZNALOSTÍ (KNOWLEDGE BASE) Soubor faktů a pravidel ("Když má teplotu, je nemocný"). To je to, co expert . V Prologu jsou to naše pravidla.
INFERENČNÍ MECHANISMUS (INFERENCE ENGINE) Mozek, který pravidla používá. Umí klást otázky a vyvozovat závěry. V Prologu je tento mechanismus už zabudovaný!
Robot doktor
Obrázek 21.1: Expertní systém jako robotický doktor, který diagnostikuje na základě symptomů.

21.2 Diagnostika nemocí – Vylepšená verze

Vytvoříme systém, který nejen diagnostikuje, ale také si pamatuje odpovědi, aby se neptal dvakrát na to samé.

% --- Báze znalostí (Pravidla) ---

% Definice nemocí a jejich symptomů
diagnostika(chripka) :- ma(teplota), ma(bolest_hlavy), ma(kasel).
diagnostika(nachlazeni) :- ma(ryma), ma(kasel), \+ ma(teplota).
diagnostika(covid) :- ma(teplota), ma(ztrata_chuti).
diagnostika(zdravy). % Pokud nic jiného neplatí, je člověk zdravý

% --- Inferenční mechanismus (Interaktivní část) ---

:- dynamic znam/2. % Paměť pro odpovědi uživatele (ano/ne)

% Predikát 'ma(Priznak)' se zeptá uživatele, pokud to ještě neví
ma(Priznak) :-
    znam(Priznak, Odpoved), !, % Pokud už známe odpověď, použijeme ji (ŘEZ!)
    Odpoved == ano.            % Uspěje jen pokud byla odpověď 'ano'

ma(Priznak) :-
    format('Máte ~w? (a/n) ', [Priznak]),
    read(Vstup),
    (Vstup == a -> Odpoved = ano ; Odpoved = ne),
    assert(znam(Priznak, Odpoved)), % Zapamatujeme si odpověď pro příště
    Odpoved == ano.

% Spuštění diagnostiky
start_diagnostika :-
    retractall(znam(_,_)), % Vyčistíme paměť z minula, aby se nepletly staré odpovědi
    diagnostika(Nemoc),
    format('Vaše diagnóza je: ~w.~n', [Nemoc]).

21.3 Vysvětlovací modul – "Proč si to myslíš?"

Dobrý expert musí umět vysvětlit své rozhodnutí. V Prologu to můžeme udělat tak, že pravidla vrátí i "důvod".

% Pravidlo s důvodem
diagnostika_s_duvodem(chripka, 'Vysoká teplota, bolest hlavy a kašel ukazují na chřipku.') :-
    ma(teplota), ma(bolest_hlavy), ma(kasel).

% Spuštění s důvodem
start_diagnostika_s_duvodem :-
    retractall(znam(_,_)),
    diagnostika_s_duvodem(Nemoc, Duvod),
    format('Vaše diagnóza je: ~w.~n', [Nemoc]),
    format('Důvod: ~w.~n', [Duvod]).

Klíčový koncept: Oddělení znalostí od logiky

Síla expertních systémů je v tom, že znalosti (pravidla o nemocech) jsou oddělené od logiky (jak se ptát a vyhodnocovat). Můžete snadno vyměnit pravidla o nemocech za pravidla o opravě auta, a systém bude fungovat dál. Tomu se říká "Expert System Shell".

Otázky k zamyšlení

  1. Proč je důležité si pamatovat odpovědi uživatele (pomocí assert)? Co by se stalo bez toho, kdyby se více nemocí ptalo na "teplotu"?
  2. Jak byste systém rozšířili o léčbu? (Např. lecba(Nemoc, Lek)).
  3. V čem je expertní systém lepší než neuronová síť? (Umí přesně vysvětlit, proč dospěl k závěru).

🧪 Laboratoř: Vlastní expert