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).
Každý expertní systém se skládá ze dvou hlavních částí:
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]).
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]).
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".
assert)? Co by se stalo bez toho, kdyby se více nemocí ptalo na "teplotu"?lecba(Nemoc, Lek)).nejde_nastartovat, sviti_kontrolka_oleje, divny_zvuk.
vybita_baterie, malo_oleje, rozbity_vyfuk.