Vysoké učení technické v Brně Fakulta elektrotechniky a informatiky Ústav biomedicínského inženýrství EXPERTNÍ SYSTÉMY.



Podobné dokumenty
Metody odvozování. matematická východiska: logika, Prolog

1 REZOLUČNÍ FORMÁLNÍ DŮKAZY

Matematická logika. Miroslav Kolařík

Predikátová logika. prvního řádu

Základy informatiky. Výroková logika

Která tvrzení jsou pravdivá nezávisle na tom, který den v týdnu byla vyslovena? Tvrzení trosečníka Dana.

Predikátová logika. Teoretická informatika Tomáš Foltýnek

09. seminář logika (úvod, výroková).notebook. November 30, Logika

Okruh č.3: Sémantický výklad predikátové logiky

Usuzování za neurčitosti

Výroková logika - opakování

Dodatek č. 3 ke školnímu vzdělávacímu programu. Strojírenství. (platné znění k )

Sémantika predikátové logiky

Negace bázového atomu Negace atomu s existenčním termem Negace klauzule Negace množiny klauzulí Predikát rovnosti. Klauzulární logika

Základy číslicové techniky z, zk

Převyprávění Gödelova důkazu nutné existence Boha

teorie logických spojek chápaných jako pravdivostní funkce

1 Predikátová logika. 1.1 Syntax. jaký mohou mít formule význam (sémantiku). 1. Logických symbolů: 2. Speciálních (mimologických) symbolů:

Výroková a predikátová logika - II

Formální systém výrokové logiky

platné nejsou Sokrates je smrtelný. (r) 1/??

Interpret jazyka IFJ2011

Výroková a predikátová logika - V

Teoretické minimum z PJV

Dnešní program odvozování v Bayesovských sítích exaktní metody (enumerace, eliminace proměnných) aproximační metody y( (vzorkovací techniky)

Složené výroky Jsou tvořeny dvěma nebo více výroky jednoduššími. V : Číslo 8 je liché. V : 0,1 N. V : Paříž je hl. město Španělska.

ZPRACOVÁNÍ NEURČITÝCH ÚDAJŮ V DATABÁZÍCH

Logika a logické programování

popel, glum & nepil 16/28

Základy umělé inteligence

RELAČNÍ DATABÁZOVÉ SYSTÉMY

Databázové systémy. * relační kalkuly. Tomáš Skopal. - relační model

Lekce 01 Úvod do algoritmizace

Jazyk matematiky Matematická logika Množinové operace Zobrazení Rozšířená číslená osa

Masarykova univerzita. Fakulta informatiky. Evoluce pohybu

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Seminář z matematiky. 2 hodiny ve 3. ročníku, 4 hodiny ve 4. ročníku. Charakteristika předmětu

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

Jak je důležité být fuzzy

Logika. 2. Výroková logika. RNDr. Luděk Cienciala, Ph. D.

ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ , 5.1 a 5.2 8/14

TÉMATICKÝ OKRUH TZD, DIS a TIS

Úvod do informatiky. Miroslav Kolařík

Univerzita Hradec Králové Fakulta informatiky a managementu

Booleovská algebra. Booleovské binární a unární funkce. Základní zákony.

1 Pravdivost formulí v interpretaci a daném ohodnocení

Výroková a predikátová logika - XII

Implementace A* algoritmu na konkrétní problém orientace v prostoru budov

5 Rekurze a zásobník. Rekurzivní volání metody

Logika II. RNDr. Kateřina Trlifajová PhD. Katedra teoretické informatiky Fakulta informačních technologíı BI-MLO, ZS 2011/12

2.5 Rezoluční metoda v predikátové logice

Petr Chvosta. vlevo, bude pravděpodobnost toho, že se tyč na počátku intervalu τ B nachází nad vpravo

Algoritmizace prostorových úloh

GRAFY A GRAFOVÉ ALGORITMY

Klasická predikátová logika

Logické programy Deklarativní interpretace

6. Logika a logické systémy. Základy logiky. Lucie Koloušková, Václav Matoušek / KIV. Umělá inteligence a rozpoznávání, LS

Výroková a predikátová logika - II

1. Programování PLC. Programovatelné automaty II - 1 -

Informace, kódování a redundance

Výroková logika. Sémantika výrokové logiky

Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David

Šifrování/Dešifrování s použitím hesla

NPRG030 Programování I, 2010/11

Uživatelská příručka

Úvod do TI - logika Predikátová logika 1.řádu (4.přednáška) Marie Duží marie.duzi@vsb.cz

PŘIJÍMACÍ TEST z informatiky a matematiky pro navazující magisterské studium Fakulta informatiky a managementu Univerzity Hradec Králové

Úloha ve stavovém prostoru SP je <s 0, C>, kde s 0 je počáteční stav C je množina požadovaných cílových stavů

MNOŽINY. x A. Jeho varianty paradox mostu se šibenicí, paradox holiče.

Unární je také spojka negace. pro je operace binární - příkladem může být funkce se signaturou. Binární je velká většina logických spojek

NPRG030 Programování I, 2016/17 1 / :58:13

Predikátová logika Individua a termy Predikáty

Přednáška 2: Formalizace v jazyce logiky.

Fuzzy logika a reálný svět, aneb jsou všechny hromady skutečně malé?

ČSN ISO/IEC P D. Informační technologie - Bezpečnostní techniky Systémy managementu bezpečnosti informací - Požadavky. Struktura normy ISO 27001

Výroková logika. Teoretická informatika Tomáš Foltýnek

Výroková a predikátová logika - IX

Metodika využití národního rámce kvality při inspekční činnosti ve školách a školských zařízeních

přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:

přednáška 2 Marie Duží

Rezoluce v predikátové logice

Umělá inteligence I. Roman Barták, KTIML.

VY_42_Inovace_12_MA_2.01_ Výroky. Prezentace určena pro první ročník maturitních oborů, ve které je vysvětlení učiva výroky.

Rezoluce v predikátové logice

Matematické symboly a značky

Matematická logika. Lekce 1: Motivace a seznámení s klasickou výrokovou logikou. Petr Cintula. Ústav informatiky Akademie věd České republiky

Základy logiky Logika a logické systémy. Umělá inteligence a rozpoznávání, LS

postaveny výhradně na syntaktické bázi: jazyk logiky neinterpretujeme, provádíme s ním pouze syntaktické manipulace důkazy

Logika a formální sémantika: 8. Game-theoretical semantics

Predikátová logika [Predicate logic]

Informatika Algoritmy

Matematická logika. Miroslav Kolařík

NEXIS 32 rel Generátor fází výstavby TDA mikro

Výroková logika. p, q, r...

LOGIKA VÝROKOVÁ LOGIKA

Úvod do TI - logika Výroková logika - pokračování (3.přednáška) Marie Duží

KMA/MDS Matematické důkazy a jejich struktura

Pravidlové znalostní systémy

Klauzulární logika. úvod. Šárka Vavrečková. 20. října Ústav informatiky Filozoficko-Přírodovědecká fakulta Slezské univerzity, Opava

výrok-každésdělení,uněhožmásmyslseptát,zdaječinenípravdivé, aproněžprávějednaztěchtodvoumožnostínastává.

Transkript:

Vysoké učení technické v Brně Fakulta elektrotechniky a informatiky Ústav biomedicínského inženýrství EXPERTNÍ SYSTÉMY praktická cvičení Ing. Ivo Provazník, Ph.D., Ing. Jana Bardoňová 2000

Obsah 1 Úvod --------------------------------------------------------------------------------------------------3 2 Reprezentace znalostí ---------------------------------------------------------------------------5 3 Strategická hra----------------------------------------------------------------------------------- 17 4 Analýza procesu--------------------------------------------------------------------------------- 21 5 Symbolická analýza ---------------------------------------------------------------------------- 25 6 Plánování strategie ----------------------------------------------------------------------------- 28 7 Fuzzy expertní systémy------------------------------------------------------------------------ 36 8 Fuzzy řízení procesu --------------------------------------------------------------------------- 40 9 Informace o CLIPSu ---------------------------------------------------------------------------- 48 10 Literatura ------------------------------------------------------------------------------------------ 49

Předmluva Skriptum "Expertní systémy - praktická cvičení" je textem, který navazuje na práci autorů Provazník I, Kozumplík J: "Expertní systémy", VUTIUM Brno, 1999. Obsahem skript Expertní systémy byl úvod do reprezentace znalostí, popis struktury expertních systémů založených na pravidlech, a také popis jazyka CLIPS pro tvorbu expertních systémů. Text byl řazen do následujících kapitol: Úvod do expertních systémů, Principy expertních systémů, Neurčitost a nepřesná inference, Fuzzy inference, Programovací jazyk CLIPS, a Efektivita jazyků založených na pravidlech. Skriptum předkládané čtenáři obsahuje řešené příklady z příslušné oblasti umělé inteligence a může sloužit k několika účelům. Jednak je možné jej použít jako návod pro cvičení univerzitního kurzu Umělá inteligence nebo Expertní systémy. Dále umožňuje lépe proniknout do podstaty jazyka CLIPS díky popisu jednotlivých částí řešení příkladů. Příklady je také možné použít jako vzor řešení obecných problémů pomocí expertních systémů, kde je vyžadována aplikace principů deklarativního programování. Při přípravě skript byly použity příklady, které jsou volně dostupné na různých pracovištích distribuujících jazyk CLIPS, dále vlastní příklady autorů a příklady, které vznikly v rámci předmětu Expertní systémy, zajišťovaném Ústavem biomedicínského inženýrství. Autoři děkují především kolegům Jiřímu Kozumplíkovi a Petru Fedrovi, kteří přispěli při přípravě cvičení a poskytli cenné rady. Poděkování patří i frekventantům uvedeného předmětu, kteří svými dotazy iniciovali nejeden nápad použitý v textu. Jana Bardoňová a Ivo Provazník Brno 2000 2

1 Úvod Klasické programovací jazyky jako Pascal a C jsou navrženy a optimalizovány pro procedurální manipulaci s daty ve formě čísel, polí a pod. Člověk ale řeší složité problémy s použitím abstraktního symbolického přístupu, který není vhodný pro implementaci v klasických jazycích. Abstraktní informace může být těmito jazyky modelována, více se však využívá transformace informace do vhodnějšího formátu. Jedním z výsledků výzkumu v oblasti umělé inteligence (UI) je právě vyvinutí neprocedurálních technik modelování informací na vyšších úrovních abstrakce. Tyto techniky jsou zabudovány v jazycích a nástrojích umožňujících vytvoření programů, které jsou ve své struktuře blízké lidské logice a snadněji se proto rozvíjejí a udržují. Tyto programy se nazývají expertní systémy (ES) [14]. Expertní systémy představují nástroj k úspěšnému řešení klasických problémů umělé inteligence. Prof. Edward Feigenbaum ze Stanfordské university, který patří mezi první pracovníky v oboru expertních systémů, definuje ES jako... inteligentní počítačové programy, které využívají znalostí a inferenčních mechanismů k řešení problémů, které jsou natolik obtížné, že by vyžadovaly řešení lidským expertem. To znamená, že ES je počítačový systém, který emuluje schopnost lidského experta rozhodovat. Termín emulovat zde představuje vlastnost systému - snahu jednat stejně jako člověk ve všech ohledech [15]. Snadná dostupnost nástrojů jako je CLIPS umožnila zrychlit a zlevnit vývoj expertních systémů, a umožnila tak jejich praktické nasazení v různých oborech, např. v medicíně [1]. Tyto nástroje většinou zahrnují programování založené na pravidlech, které je v oblasti expertních systémů nejvíce rozšířené. Programování založené na pravidlech je paradigma, které specifikuje akce, které mají být provedeny v určité situaci. Pravidla jsou tvořena z částí když... potom (if... then). Část když obsahuje posloupnost tzv. obrazů specifikované fakty (daty). V procesu splňování pravidla se expertní systém snaží nalézt odpovídající obrazy a fakty v bázi faktů. Tento proces se nazývá inferencí (usuzování). Část potom pravidla obsahuje posloupnost akcí, které mají být provedeny kdykoliv inferenční mechanismus prokáže splnitelnost pravidla. Inference probíhá tak dlouho, dokud neexistuje žádné splnitelné pravidlo. Expertní systémy se skládají z následujících hlavních částí [9]: uživatelský interface - spojovací modul, který zabezpečuje komunikaci uživatele s ES, vysvětlovací modul - popisuje a vysvětluje postup usuzování ES uživateli, modul získávání znalostí - modul pro vkládání nových znalostí do ES, pracovní paměť - databáze faktů používaných pravidly, inferenční mechanismus - provádí inferenci (proces usuzování). Vytváří prioritní seznam pravidel, aplikuje pravidla podle seznamu a rozhoduje, která pravidla jsou splněna předloženými (existujícími) fakty, agenda - seznam pravidel s přiřazenou prioritou vytvořený inferenčním mechanismem, báze znalostí - databáze pravidel. Následující text je určen jako návod pro praktická cvičení, proto obsahuje pouze stručná shrnutí nejdůležitějších principů a metod používaných v umělé inteligenci - expertních systémech. Více prostoru je věnováno řešeným příkladům s komentovanými výpisy programů jazyka CLIPS a ukázkami výstupů programů. Po úvodu následuje druhá kapitola, která je nejrozsáhlejší a obsahuje shrnutí způsobů reprezentace znalostí v expertních systémech. Reprezentace znalostí je vedle inferenčních mechanismů stěžejním faktorem určujícím vlastnosti ES. Kapitola je doplněna 3

příklady z oblasti prohledávání stavového prostoru a predikátové logiky. Třetí kapitola je popisem klasické strategické hry a doplňuje problematiku stavového prostoru s definicí hodnotící funkce. Ve čtvrté kapitole je nastíněna další z aplikačních oblastí ES - analýza procesu s následným vyhodnocením. Pátá kapitola prezentuje ES jako nástroje pro řešení obecných problémů prostřednictvím příkladu symbolické analýzy. Šestá kapitola postihuje další důležitou aplikaci ES - plánování. Příklad plánování strategie (postupu) je ukázkou reprezentace znalostí s plně odděleným popisem dat a algoritmu. V sedmé kapitole jsou přiblíženy principy fuzzy expertních systémů jako důležitého nástroje při rozhodování s neúplnou informací. Vše je doplněno v osmé kapitole reálným příkladem fuzzy řízení jednoduchého procesu. Pro úplné pochopení příkladů v předkládaném textu je nutné znát alespoň základy programování v jazyku CLIPS. Ty je možné získat ve skriptu [23], literatuře [11] a [9], a dále v originálních příručkách [3] - [7] volně dostupných na Internetu (viz kapitola 10 Literatura). 4

2 Reprezentace znalostí Reprezentace znalostí představuje formu vyjádření určitých informací. Hlavním cílem současného výzkumu v oblasti umělé inteligence (UI) je vytvoření takové reprezentace znalostí, která je dostatečně obecná, tzn. umožňuje zahrnout širokou oblast znalostí, a systému s UI umožní použití dostatečně efektivní metody řešení. Požadované informace se organizují do takové formy, aby byly snadno přístupné pro programy, které vykonávají rozhodnutí, plánují činnost, rozpoznávají předměty, analyzují scény či jiné zajišťují funkce [10]. Znalosti by měly obecně informovat o vnitřním modelu prostředí. Jedná se o vkládání informací získané analýzou scény do modelu prostředí, udržování vlastního obsahu modelu prostředí a zpřístupnění jeho obsahu pro další činnost. Pro reprezentaci znalostí se používají různá schémata [22]: deklarativní schémata, procedurální schémata, rámcová schémata. Obecné požadavky na schémata jsou tyto [21]: možnost aplikace různých operací (řízení, prohledávání, porovnávání, použití), všeobecnost a abstraktnost (široké použití), strukturovanost (struktura základních jednotek vědomostí), zpřístupnitelnost (přístupné jednoduchým způsobem), modulárnost (efektivně přidat i odstranit znalosti), přirozenost a srozumitelnost, praktická realizovatelnost. 2.1 Deklarativní schémata V deklarativních schématech pracujeme s těmito základními množinami: množina specifických, navzájem nezávislých faktů, která popisuje dané prostředí, množina všeobecných procedur pro manipulaci s obsahem množiny specifikovaných faktů. Specifická fakta jsou v těchto schématech použita jako axiómy, manipulační procedury slouží jako procedury dokazování, tzn. umožňují odvozovat z axiómů nové znalosti. Podstata deklarativních schémat spočívá v popisu těch aspektů reprezentovaného prostředí, které určují, co fakt vyjadřuje. Mezi deklarativní schémata patří např. schémata, která jsou založená na matematické logice, algebře, relačních strukturách, grafech a pod. Deklarativní schémata se vyskytují v různých typech. Jde především o sémantická schémata (sémantické sítě), schémata založená na koncepci stavového prostoru, logická schémata (predikátová logika 1. řádu). 2.1.1 Sémantické sítě Sémantická síť umožňuje popisovat realitu jako objekty, které jsou navzájem v nějakých vztazích (relacích). Grafickou reprezentací je ohodnocený orientovaný multigraf, jehož uzly odpovídají entitám (konkrétní předměty, pojmy, vztahy) daného prostředí, a hrany odpovídají sémantickým vztahům mezi entitami. Sémantickým sítím však dosud chybí exaktní matematická formalizace. 5

Entity sémantické sítě představují zejména: pojmy (konstanty reprezentovaného prostředí), události (změny a jejich realizace v prostředí), vlastnosti (zpřesnění pojmů). Vztahy v sémantické síti jsou především tyto: kvantifikační (hodně, málo, několik), lingvistické (slovesné charakteristiky, barva,...), logické (negace, konjunkce, disjunkce, implikace), množinové (množinové operace). Různorodost sémantických sítí se odráží i v různorodosti mechanismů odvozování znalostí. Jeden z přístupů je založený na porovnávání síťových struktur - báze znalostí. Druhá síťová struktura, vstupující do procesu porovnávání, vznikne transformací vstupního výroku (otázky) do tvaru sítě, přičemž některé uzly mohou být neznámými entitami - proměnnými. Inferenční metody realizují operace porovnávání i operace prohledávání s cílem najít ty znalosti, které jsou relativní k vstupní otázce. Oblast sémantické sítě, která obsahuje relevantní informace se nazývá kontext. Určení kontextu a jeho zpřístupnění pro další zpracování je hlavní činností inferenčního mechanismu. 2.1.2 Stavový prostor Stavový prostor realizuje strukturu problémů pomocí alternativ, které jsou přípustné v daném stavu. Prostředí se může nacházet v různých stavech a operátory představují akce na množině stavů. Stavy a operátory vytvářejí schémata na reprezentaci znalostí, stavový prostor. Pro tento typ úloh vycházíme ze znalosti o počátečním stavu prostředí, cílovém stavu a jednotlivých akcích, které mohou být provedeny. Na daný stav nemůže být použit libovolný operátor, ale jen takový, pro který jsou v daném stavu splněny podmínky aplikovatelnosti. Řešením úlohy je každá posloupnost operátorů, která transformuje počáteční stav na cílový. Úloha může mít samozřejmě více řešení. Stavový prostor: SP = <S,O> S neprázdná množina (všeobecně i nekonečná) množina stavů O neprázdná konečná množina operátorů (stavy a operátory vytvářejí schémata na reprezentaci znalostí např. pro robota, tj. stavový prostor). Cílová úloha ve stavovém prostoru: <s 0,G> s 0 počáteční stav, s 0 je prvkem S, G konečná množina cílových stavů. Řešením úlohy se nazývá každá posloupnost operátorů o 1, o 2,..., o n, pro kterou existuje posloupnost stavů s 1, s 2,..., s n s vlastnostmi: s 1 = o 1 (s 0 ) s 2 = o 2 (s 1 ) = o 2 (o 1 (s 0 )) = (o 1 o 2 )(s 0 )... s n = o n (s n-1 ) = o n (o n-1 ( (o 1 (s 0 )))) = (o 1 o 2 o n )(s 0 ) přičemž s n náleží G. Stav je tedy deklarativním popisem prostředí nebo jeho určité části, operátory jsou zobrazení množiny stavů do sebe, přičemž na daný stav nemůže být použit libovolný operátor. 6

Na základě vnitřního modelu prostředí a zadaného cíle se systém snaží samostatně najít plán jako uspořádaný soubor operátorů, jejichž realizace povede k dosažení daného cíle. Když je zadán stavový prostor SP a cílová úloha, potom se při jejím řešení postupuje tak, že z počátečního stavu s 0 se postupnou aplikací operátorů generují další prvky stavového prostoru. Tento postup se opakuje do té doby, dokud není dosažený cílový stav. Graf odpovídající SP se nazývá stavový graf. Jednotlivé stavy odpovídají uzlům, na které se postupně aplikují všechny možné operátory. Nově vzniklý uzel se nazývá generovaný, uzel, na nějž jsou aplikovány všechny operátory, se nazývá expandovaný, jsou tedy generováni všichni jeho následovníci. Obecný postup při prohledávání stavového grafu je následující: počáteční uzel grafu odpovídá popisu počátečního stavu, aplikací některého z operátorů získáme bezprostředního následovníka, tedy nový stav reprezentovaný generovaným uzlem, u každého uzlu se v procesu řešení úlohy vytvářejí a uchovávají směrníky k rodičovskému uzlu, které po dosažení cíle dovolují nalézt řešení úlohy, po vytvoření všech bezprostředních následovníků daného uzlu, použitím všech aplikovatelných operátorů se uskutečňuje test, zda některý z následovníků neodpovídá cílovému stavu. Jestliže daný uzel mezi následovníky neexistuje, proces hledání řešení pokračuje expanzí dalšího uzlu. V opačném případě je možno pomocí směrníků získat informace o tomto řešení. Prohledávání stavového grafu může být rozděleno na dva základní typy podle toho, zda máme k dispozici bližší informace o pořadí expandovaných uzlů: neinformované prohledávání - prohledávání do šířky, při kterém jsou uzly expandovány v takovém pořadí, v jakém byly generovány, - prohledávání do hloubky, ve kterém je vždy expandován ten uzel, který byl generován jako poslední, informované prohledávání, při kterém algoritmus musí vyhovovat dvěma základním kritériím: - má produkovat nejkratší cestu k cíli, - při hledání cesty k cíli má expandovat co nejmenší počet uzlů. Pokud jsou bližší informace o řešení známé díky zkušenostem, hovoříme o využití heuristických informací. Hodnotící funkce Hodnotící funkce se využívá v informovaném prohledávání stavového prostoru a slouží k vyjádření heuristických znalostí. Toto kritérium nám umožňuje uspořádat uzly tak, aby bylo možné před každou expanzí vybrat nejvhodnější uzel. Funkce může být zvolena podle: pravděpodobnosti, zda uzel leží na optimální cestě, různých způsobů měření vzdálenosti mezi daným uzlem a množinou cílových uzlů, různých druhů diference mezi uzly, které jsou dané vlastnostmi řešené úlohy, analogie, která spočívá v nacházení podobnosti mezi uzly, případně stavovými prostory tak, že řešení úlohy v jednom stavovém prostoru se využije jako podklad k řešení úlohy v druhém stavovém prostoru. Příklad: Zadání: Navrhněte expertní systém, který bude řešit klasický problém umělé inteligence. K dispozici jsou dvě nádoby, které mají obsah 5 litrů a 3 litry. Odměřte přesně 4 litry. Nádoby lze doplnit, vyprázdnit nebo lze obsah přelévat z jedné nádoby do druhé, ale jen do plného obsahu. 7

Řešení: Řešení je provedeno pomocí prohledávání stavového prostoru, je znám počáteční stav, cílový stav a také operace, které mohou být provedeny: počáteční stav: obě nádoby jsou prázdné, aplikovatelné operátory: - doplnit nádobu, - vylít celý obsah nádoby, - přelít část obsahu z jedné nádoby do druhé, tedy doplnit jednu nádobu a částečně nebo úplně vyprázdnit nádobu druhou, cílový stav: 4 litry v jedné nádobě. Následující schéma obsahuje uzly, ve kterých jsou graficky znázorněny stavy v obou nádobách s uvedením obsahu. Z uzlu vychází hrana s uvedením značky operátoru, který je na daný stav aplikován. Ve schématu jsou rozkresleny téměř všechny možné postupy, které jsou dány možnostmi povolených operací. Horního uzel reprezentuje počáteční stav. Na něj lze aplikovat pouze operátor plnění nádob. Protože zde existují dvě možnosti, schéma se dělí do dvou základních větví. Na nově vzniklé uzly lze opět aplikovat operátory, v tomto případě budou využity všechny operace, které jsou povoleny. V dalším řádku jsou nově generované uzly. Na některé uzly již nejsou aplikovány žádné operátory, protože bylo dosaženo již dříve získaného řešení. To je ve schématu znázorněno zpětnou smyčkou vedoucí k zacyklení. Ve schématu je zobrazena pouze jedna zpětná smyčka jako příklad, další nejsou vykreslené z důvodu zachování přehlednosti schématu. Postupnou aplikací operátorů na jednotlivé stavy jsou nalezena dvě řešení. Cesta k cílovému řešení je vykreslena výrazněji. Jedno z řešení je získáno v sedmi krocích, druhé řešení je získáno po osmi krocích. Stavový prostor může být prohledáván třemi způsoby. Při prohledávání do šířky jsou na jeden uzel aplikovány všechny možné operátory. Po úplné expanzi uzlu se zjišťuje, zda některý z nových uzlů nereprezentuje cílový stav a pokud ne, operátory jsou aplikovány na uzly v nově vzniklé vrstvě a to ve stejném pořadí, jak uzly vznikly. Ve schématu to odpovídá pohybu po celé šířce ve směru dolů. Při prohledávání do hloubky se na nově vzniklý uzel aplikuje pouze jeden operátor. Pokud nový uzel není reprezentací cílového stavu, bude na něj aplikován opět jeden operátor. Tento postup se opakuje do té doby, pokud se již s nově vzniklým uzlem nedají provádět žádné operace nebo byl nalezen cílový stav. Pokud byla tato cesta řešení neúspěšná, řešení se vrací o krok zpět a je aplikován jiný operátor. Ve schématu to odpovídá pohybu do hloubky (dolů) a po té dále do šířky. Tento postup bývá méně přehledný a je náročnější na uchovávání informací o předchozích postupech, než je tomu u metody prohledávání do šířky. Pokud o řešeném problému existuje bližší informace, je možné ji vhodně interpretovat a využít pro informované prohledávání. Ve skutečnosti jde o upravené prohledávání do šířky. Po aplikaci všech operátorů na daný uzel je vypočtena tzv. hodnotící funkce podle jejíž hodnoty je vybrán nejvhodnější uzel pro další expanzi. Toto řešení vede k nalezení optimální cesty (nejrychlejší, nejkratší) vzhledem k definici hodnotící funkce. 8

aplikovatelné operátory: naplnit (popř. doplnit) nádobu vyprázdnit jednu nádobu doplnit druhou nádobu 0 0 3 0 3 5 0 3 0 0 3 0 0 5 3 0 0 5 3 3 0 0 1 5 3 5 3 0 0 3 3 3 3 5 1 0 0 5 0 1 3 0 1 5 0 0 1 0 3 1 0 5 0 0 0 4 3 5 0 1 3 0 Obr. 2.1 Levá část stromu stavového prostoru řešení příkladu. 9

0 0 aplikovatelné operátory: naplnit (popř. doplnit) nádobu vyprázdnit jednu nádobu doplnit druhou nádobu 0 5 0 0 3 2 3 5 3 5 0 5 3 0 0 2 3 0 0 5 3 0 0 5 3 2 0 5 2 0 0 0 3 0 2 5 0 0 0 2 3 5 3 4 0 5 2 0 3 5 3 0 0 4 2 5 Obr. 2.2 Pravá část stromu stavového prostoru řešení příkladu. 10

2.1.3 Predikátová logika Systémy umělé inteligence (a tedy i expertní systémy) používají určité metody automatického sestavování plánu činnosti. Model prostředí, který je uvažován (je předmětem činnosti systému), musí být vytvořený na principech logických schémat. Logické schéma pro reprezentaci znalostí je vyjádřené pomocí matematické logiky, především pak jazykem predikátové logiky [17]. Základním výrazem jazyka predikátové logiky je formule. Základními prvky jazyka jsou: logické hodnoty, logické spojky, logické kvantifikátory, individuové konstanty a proměnné, funkční symboly, predikátové symboly. logické hodnoty T pravda (true) F nepravda (false) logické spojky ' negace konjunkce disjunkce implikace ekvivalence = rovnost logické kvantifikátory univerzální existenční individuové konstanty a proměnné malá písmena (např. a, b, c,...) funkční symboly malá písmena a řetězce (např. f, g, h, zdvihni,...) predikátové symboly velká písmena a řetězce (např. A, B, C, ODKRYTÝ,...) Ze základních prvků jazyka predikátové logiky jsou složeny tyto výrazy: termy, atomické formule a formule. Uvedené výrazy jsou definovány takto: termy každá individuová konstanta a individuová proměnná tvoří term f(t 1,t 2,t 3,...) je term, kde f je funkční symbol a t i jsou termy atomické formule logické hodnoty T a F jsou atomické formule P(t 1,t 2,t 3,...) je atomická formule, kde P je predikátový symbol a t i jsou termy výraz t 1 =t 2 je atomická formule, kde t i jsou termy formule každá atomická formule je formule A', A B, A B, A B a A B jsou formule, kde A i B jsou formule x(a) a x(a) jsou formule, kde x je individuová proměnná a A je formule Význam základních prvků jazyka je dokumentován na následujícím příkladu. Jsou dány jednoduché formule A a B ve tvaru A = x(p(x) Q(x)) 11

B = x((kvádr(x) ZDVIHNUTÝ(x)) POLOŽENÝ'(x)) Formule A je obecná a vyjadřuje fakt, že pro každé x, pro které platí P(x), vyplývá platnost predikátu Q(x). Formule B reprezentuje skutečnost, že každý objekt x, který je kvádrem a současně je zdvihnutý, už nemůže být položený. KVÁDR, ZDVIHNUTÝ, POLOŽENÝ jsou jednomístné predikáty. x představuje individuovou proměnnou a je možné za ní dosadit název kvádru, např. a, b nebo c. Základní výraz predikátové logiky, formule, je jen posloupností symbolů. Svůj význam dostává až interpretací. Interpretace je vztah mezi syntaktickými objekty jazyka (soustava formulí) a některou jeho interpretační strukturou (stav prostředí, ve kterém je řešen problém). Formule, které jsou pravdivé ve všech interpretacích se nazývají logicky pravdivé. Právě prokázání logické pravdivosti je řešením problému, bohužel však z praktického hlediska není možné, aby bylo ověření provedeno ve všech interpretacích. Predikátová logika však poskytuje prostředky, jak se takovému postupu vyhnout [25]. Použití predikátové logiky včetně prokazování platnosti lze ukázat na následujících dvou příkladech. V prvním z nich je řešen jednoduchý problém; budou zde zavedeny pojmy tautologie a modus ponens. Příklad Zadání: Cena počítačových čipů roste pouze tehdy, když sílí yen (japonská měna). Yen sílí pouze tehdy, když dolar oslabuje a dolar oslabuje, když yen sílí. Dokud cena čipů roste, dolar musí klesat. Prokažte platnost/neplatnost tvrzení. Řešení: Logické proměnné jsou definovány takto: C = cena čipů roste Y = yen sílí D = dolar oslabuje Problém je zapsán takto: C Y - 1. premisa (Y D) (Y D) - 2. premisa C - 3. premisa D - výrok Druhá premisa může být zjednodušena: C Y Y D C D Premisa Y D dovoluje provést substituci D za Y v premise C Y C D Y D C D a potom platí C D C D 12

což je tzv. modus ponens. Modus ponens lze interpretovat tak, že když z tvrzení C vyplývá tvrzení D a tvrzení C platí, potom platí i tvrzení D. V našem příkladu postupným zjednodušováním vznikl modus ponens, který je podle výše uvedené interpretace vždy platný a zadání je splněno. Jinými slovy, ze tří definovaných premis skutečně plyne proklamovaný výrok. Tvrzení, které je platné ve všech interpretacích, se nazývá tautologií. Modus ponens je tedy tautologií. V druhém příkladě je dokumentován postup odvozování, běžně používaný v programech umělé inteligence i v expertních systémech. Konkrétně jde o použití rezolučního pravidla, které je aplikováno na analyzované tvrzení. Hlavním úkolem rezoluční metody je inferovat (tzn. odvodit) nové klauzule 1, tzv. rezolventy, ze dvou rodičovských klauzulí. Rezolventy by měly mít méně literálů 2 než rodičovské klauzule. Poslední rezolventa je nesplnitelná klauzule. V expertních systémech se používá varianty s kontradikcí. Jde o prokázání platnosti negace teorému. Prakticky pak jde o testování dvojice klauzulí, kde v jedné se vyskytuje literál a ve druhé jeho negace. Prokázání platnosti formule kontradikcí (tedy prokázání její neplatnosti) se nazývá vyvrácení a za použití rezoluční metody pak rezoluční vyvrácení [23]. Příklad Zadání: Je definováno tvrzení pomocí dvou premis a výroku: Někteří programátoři nemají rádi chyby. Všichni programátoři mají rádi jakýkoliv úspěch. Žádná chyba není úspěch. Prokažte platnost/neplatnost tvrzení. Pozn. Pravidla českého jazyka dovolují použití dvojitého záporu ve větě. Tím může dojít k dezinterpretaci a špatnému přepisu do predikátů. Například výrok "Žádná chyba není úspěch." vlastně znamená "Všechny chyby nejsou úspěchem." Řešení: Definujme predikáty: P(x) = x je programátor F(x) = x je chyba S(x) = x je úspěch H(x,y) = x nemá rádo y Zadání pak může být přepsáno takto: x (P(x) y (F(y) H(x,y))) x ((P(x) ( y (S(y) H'(x,y))) y' (F(y) S'(y)) kde výrok byl již negován pro následující rezoluci. První premisa výše uvedeného tvrzení x (P(x) y (F(y) H(x,y))) je postupně upravována následovně. Nejprve je použito eliminace implikace použitím ekvivalence p q p' q. 1 Klauzule je logické spojení literálů (viz níže). 2 Literál je atomický výraz nebo negovaný atomický výraz a nesmí obsahovat logická spojení (kvantifikátory, logické spojky). 13

x (P(x) y (F'(y) H(x,y))) Dále jsou eliminovány existenční kvantifikátory použitím Skolemovy funkce. Je zavedena Skolemova konstanta a s takovou hodnotou, aby formule byla splněna. (P(a) y (F'(y) H(a,y))) Formule je převedena do prenexové formy, která je tvořena sekvencí kvantifikátorů následovaných kombinací predikátů. y (P(a) (F'(y) H(a,y))) Dále jsou odstraněny univerzální kvantifikátory přiřazením hodnot všem proměnným. P(a) (F'(y) H(a,y)) První premisa je tedy převedena do dvou klauzulí P(a) (F'(y) H(a,y)) Podobně lze odvodit, že druhá premisa je převedena do klauzule P'(x) S'(y) H'(x,y) a negovaný výrok do dvou klauzulí F'(y) H(a,y) F(b) Nyní je nutné nalézt vhodné substituční případy (hodnoty proměnných) procesem unifikace. Vhodné hodnoty pro unifikaci jsou takové, pro které jsou příslušné klauzule platné. První substitucí je y b, která umožní odvodit platnost dvojice klauzulí F'(y) H(a,y) a F(b). Celý unifikační strom je uveden na obrázku níže. Výsledkem unifikace je klauzule nil, což znamená, že negované tvrzení neplatí a původní tvrzení je platné. F'(y) H(a,y) F(b) P(a) P'(x) S'(y) H'(x,y) H(a,b) S'(y) H'(a,y) S'(b) S(b) nil 14

2.2 Procedurální schémata Procedurální přístup k reprezentaci znalostí je založený na předpokladu, že znalosti typu vědět jak jsou primární v modelování procesů odvozování. Procedurální schémata kladou proto důraz na popis takových aspektů reprezentovaných znalostí, které hovoří o tom, jak objekty používat a jaké akce s nimi možno realizovat. Znalosti jsou reprezentované jako procedury (části programů), které určují možné akce s objekty prostředí a vztahy mezi nimi. V realizovaných systémech využívajících procedurálních schémat se dnes uplatňují tyto přístupy [21]: Vyjádření řídící informace ve formě speciálních výrazů, tzv. teorém, které jsou součástí báze znalostí a reprezentují výpovědi o objektech a vztazích, které se vyskytují v prostředí. Vytvoření jazyka pro reprezentaci řídící informace, který je součástí schématu na reprezentaci znalostí. Tento jazyk je vytvářený na nižší úrovni, než samotné schéma, ale uživatel má přístup k množině jeho mechanismů, které umožňují specifikovat řídící proces. Vytvoření samostatného jazyka na reprezentaci řídící informace, který je používaný paralelně se schématem pro reprezentaci ostatních znalostí. Tato myšlenka tvoří základ přístupů k logickému programování. Produkční systémy Produkční systémy jsou procedurální technikou reprezentace znalostí, která je založena na operaci s obrazci [22]. Produkční systém je nejčastěji lineárně uspořádaná dvojice pravidel, které se nazývají produkce, vyjádřená dvojicí: podmínka (situace) > akce. Aplikace pravidla se uskuteční provedením akce, pokud v bázi údajů nastala daná situace. Produkční pravidla operují nad pracovní pamětí, která může být organizována různými způsoby. Produkční systém je tvořen třemi základními složkami: souborem produkčních pravidel, které tvoří vlastní bázi znalostí, bázi údajů, která reprezentuje konkrétní konzultovaný případ, interpretem pravidel, který představuje řídící (inferenční, odvozovací) mechanismus. Přímé produkční systémy Přímé produkční systémy začínají svou činnost s určitým počátečním stavem pracovní paměti, který je činností produkčního systému postupně rozšiřován do té doby, dokud není dosažený zadaný cíl. Inferenční mechanismus postupuje od faktů k cíli a realizuje tzv. přímé (dopředné) řetězení znalostí. Rozpoznávací cyklus pracuje následujícím způsobem: nalezení všech pravidel, jejichž podmínkové části jsou splněny, vyřazení takových pravidel, jejichž aplikace vede k výsledkům již v paměti obsažených, použití rozpoznávacího cyklu pro výběr nejvhodnějšího produkčního pravidla. Pokud takové pravidlo neexistuje, nastává konec postupu, jinak je celý postup opakován (nalezení všech pravidel). Zpětné produkční systémy Zpětné produkční systémy pracují s inferenčním mechanismem, který postupuje od cíle, tj. hypotézy, k faktům a realizují tak zpětné řetězení. Hypotézu reprezentuje tvrzení, které má produkční systém verifikovat s použitím báze znalostí. Rozpoznávací cyklus pracuje následovně: pokud je hypotéza v bázi znalostí, je vytvořeno jádro hypotézy a nalezena všechna produkční pravidla, jejichž akční části obsahují formy ekvivalentní s jádrem hypotézy, výběr nejvhodnějšího pravidla strategií řešení konfliktů, 15

realizace pravidla po ověření jeho aplikovatelnosti; pokud podmínky aplikovatelnosti nejsou splněny, jsou zapsány do hypotézy a celý postup se opakuje do nalezení řešení. 2.3 Rámcová schémata Rámce jsou dalším schématem reprezentace znalostí, které je používáno k popisovaní objektů v bázi znalostí. Základními prvky těchto schémat jsou tzv. rámce, které umožňují vyjádřit statické znalosti. V průběhu užívání rámce nabývají položky konkrétních hodnot. Vazba mezi rámci se dá znázornit grafem. Uzly rámcových schémat mají svou vnitřní strukturu, což je odlišné od sémantických sítí. Rámce jsou obvykle doplněna o pravidla, která umožňují odvozovat v bázi znalostí. Auto typ: vozidlo pohon: motor Auto typ: auto pohon: motor účel: přeprava osob Auto typ: auto pohon: motor účel: přeprava nákladu Ford typ: osobní auto pohon: motor účel: přeprava osob výrobce: Ford Obr. 2.3 Příklad rámců. 16

3 Strategická hra Níže uvedený příklad strategické hry je ukázkou možností jednoduchého expertního systému vytvořeného v CLIPSu. Jde o problém soupeření uživatele a počítače formou hry, jejíž strategie je dokazatelná a především může být analyticky popsána. Popis strategie má formu množiny faktů ve tvaru "vykonej akci, když nastanou určité podmínky". Hra je velmi jednoduchá, jde o střídavé odebírání 1 až 3 zápalek z hromádky. Vstupními hodnotami je počet zápalek v hromádce, a určení začínajícího hráče. Strategie se řídí velikostí zbytku po celočíselném dělení zbývajících zápalek číslem 4. Při vhodně zvoleném počtu zápalek tedy nemůže začínající hráč prohrát (dodrží-li strategii), naopak nezačínající hráč pak může vyhrát jen po chybě začínajícího. Hra musí být spuštěna z určitého definovaného bodu, což je zajištěno vložením inicializačního faktu (faze vybirani-hrace). Fakt je níže použit v pravidle vyber-hrace. (deffacts inicializacni-faze (faze vybirani-hrace)) Následuje vložení čtyř faktů, určujících taktiku počítače. (deffacts pocty-zapalek (pocitac-bere 1 jestlize-zbyva-zbytek 1) (pocitac-bere 1 jestlize-zbyva-zbytek 2) (pocitac-bere 2 jestlize-zbyva-zbytek 3) (pocitac-bere 3 jestlize-zbyva-zbytek 0)) Další pravidlo zahajuje běh systému - bude tedy splněno jako první prostřednictvím již vloženého faktu (faze vybirani-hrace). Pravidlo vypíše na obrazovku monitoru zprávu Kdo bere prvni (pocitac: c clovek: h)? a očekává vstup znaku z klávesnice. Správnost vloženého znaku je kontrolována pravidly dobry-vyber-hrace a spatny-vyber-hrace. (defrule vyber-hrace (faze vybirani-hrace) (printout t "Kdo bere prvni (pocitac: p clovek: c)? ") (assert (vyber-hrace =(read)))) Pravidlo dobry-vyber-hrace zkontroluje, zda byl ve fázi vybírání hráče (reprezentované faktem (faze vybirani-hrace)) vložen znak c nebo h, a v kladném případě odstraní nepotřebné fakty. Dále je určeno, který hráč je na tahu (fakt (hraje-hrac h) nebo (hraje-hrac c)), a je iniciována další fáze běhu programu vložením faktu (faze vyber-pocet-zapalek). (defrule dobry-vyber-hrace?faze <- (faze vybirani-hrace)?vyber <- (vyber-hrace?hrac&p c) (retract?faze?vyber) (assert (hraje-hrac?hrac)) (assert (faze vyber-pocet-zapalek))) Pravidlo spatny-vyber-hrace ošetřuje případ vložení nepovolených znaků tak, že dochází k opětovnému dotazu na začínajícího hráče pravidlem dobry-vyber-hrace znovuvložením faktu (faze vybirani-hrace). 17

(defrule spatny-vyber-hrace?faze <- (faze vybirani-hrace)?vyber <- (vyber-hrace?hrac&~p&~c) (retract?faze?vyber) (assert (faze vybirani-hrace)) (printout t "Vyber p nebo c." crlf)) Fáze výběru počtu zápalek je zajištěna pravidlem volba-poctu-zapalek. V něm je proveden výpis na obrazovku (dotaz na počet) a vstup zvoleného čísla z klávesnice. Číslo je zaznamenáno vložením faktu (volba-poctu-zapalek xxx). (defrule volba-poctu-zapalek (faze vyber-pocet-zapalek) (printout t "S kolika zapalkami chcete zacit? ") (assert (volba-poctu-zapalek =(read)))) Pro zajištění korektního vstupu je vložené číslo testováno v pravidle dobry-pocetzapalek. Je-li vložené číslo celé a větší než 0, dojde k inicializaci další fáze programu vložením faktu (zbyva-zapalek xxx). Tento fakt představuje hypotetickou hromádku zápalek, ze které se bude odebírat. (defrule dobry-pocet-zapalek?faze <- (faze vyber-pocet-zapalek)?vyber <- (volba-poctu-zapalek?pocet&:(integerp?pocet)&:(>?pocet 0)) (retract?faze?vyber) (assert (zbyva-zapalek?pocet))) V pravidle spatny-pocet-zapalek je definováno, jak se bude postupovat v případě špatného zadání. Je-li zvolený počet necelé číslo nebo je menší než 0, je znovu aktivována fáze výběru počtu zápalek. (defrule spatny-pocet-zapalek?faze <- (faze vyber-pocet-zapalek)?vyber <- (volba-poctu-zapalek?pocet&~:(integerp?pocet) :(<=?pocet 0)) (retract?faze?vyber) (assert (faze vyber-pocet-zapalek)) (printout t "Vyberte cele cislo vetsi nez 0." crlf)) Systém pracuje v cyklu, který je ukončen prohrou hráče-člověka nebo počítače. Prohra počítače je ošetřena pravidlem pocitac-prohral. Pro prohru počítače musí být splněny dvě podmínky: zbývající počet zápalek je roven 1 a na tahu je hráč označený p. (defrule pocitac-prohral (zbyva-zapalek 1) (hraje-hrac p) (printout t "Pocitac musi vzit posledni zapalku!" crlf) (printout t "Pocitac prohral!" crlf)) Prohra hráče je ošetřena pravidlem clovek-prohral. Pro prohru hráče musí být splněny dvě podmínky: zbývající počet zápalek je roven 1 a na tahu je hráč označený c. 18

(defrule clovek-prohral (zbyva-zapalek 1) (hraje-hrac c) (printout t "Musite vzit posledni zapalku!" crlf) (printout t "Prohral jste!" crlf)) Smyčka programu je tvořena pravidly, ve kterých je zajištěno odebírání zápalek, t.j. vstup zvoleného počtu zápalek z klávesnice (v případě hráče), nebo generování počtu podle taktiky (v případě počítače). Pravidlo clovek-bere je splněno v případě, že na tahu je hráč označený c a zbývá více než jedna zápalka. Následuje dotaz na počet a vložení příslušného faktu se zadaným číslem. (defrule clovek-bere (zbyva-zapalek?pocet&:(>?pocet 1)) (hraje-hrac c) (printout t "Kolik zapalek chcete vzit? ") (assert (clovek-bere =(read)))) Vložený počet zápalek musí být opět testován (číslo od 1 do 3). To je zajištěno pravidlem clovek-bere-dobre, které pracuje podobně jako pravidlo dobry-pocet-zapalek. Je-li pravidlo splněno, je odstraněn fakt (zbyva-zapalek xxx) obsahující počet zbývajících zápalek a vložen nový fakt s již odečteným počtem odebraných zápalek. Vše je doprovázeno výpisem na obrazovku. Jako poslední je vložen fakt (hraje-hrac p), čímž se předává tah počítači. (defrule clovek-bere-dobre?zapalky <- (zbyva-zapalek?pocet)?tah <- (clovek-bere?vyber)?kdo-bere <- (hraje-hrac c) (test (and (integerp?vyber) (>=?vyber 1) (<=?vyber 3) (<?vyber?pocet))) (retract?zapalky?tah?kdo-bere) (bind?novy-pocet (-?pocet?vyber)) (assert (zbyva-zapalek?novy-pocet)) (printout t?novy-pocet " zapalek zbyva." crlf) (assert (hraje-hrac p))) Došlo-li k nesprávnému vstupu (vložení nepovoleného čísla hráčem), je znovu iniciován dotaz na počet odebíraných zápalek znovuvložením faktu (hraje-hrac c). To způsobí znovusplnění pravidla clovek-bere. (defrule clovek-bere-spatne (zbyva-zapalek?pocet)?tah <- (clovek-bere?vyber)?kdo-bere <- (hraje-hrac c) (test (or (not (integerp?vyber)) (<?vyber 1) (>?vyber 3) (>=?vyber?pocet))) (printout t "Pocet zapalek musi byt 1 az 3." crlf) (retract?tah?kdo-bere) (assert (hraje-hrac c))) 19

Tah počítače je zajištěn pravidlem pocitac-bere. Zde samozřejmě nedochází k dotazu na počet jako v případě hráče, ale potřebné číslo je "vypočteno" podle výše popsané strategie. Nejprve je vypočítán zbytek xxx po celočíselném dělení (modulo), a ten je použit pro výběr jedno ze 4 faktů (pocitac-bere yyy jestlize-zbyva-zbytek xxx). Číslo yyy pak určuje, kolik zápalek počítač odebere. Splněním pravidla pro příslušný fakt opět vyvolá změnu v aktuálním počtu zbývajících zápalek (vložením faktu (zbyvazapalek zzz)). Jako poslední je vložen fakt (hraje-hrac c), čímž se předává tah hráči. (defrule pocitac-bere?kdo-bere <- (hraje-hrac p)?zapalky <- (zbyva-zapalek?pocet&:(>?pocet 1)) (pocitac-bere?cislo jestlize-zbyva-zbytek =(mod?pocet 4)) (retract?kdo-bere?zapalky) (bind?novy-pocet (-?pocet?cislo)) (printout t "Pocitac bere "?cislo " zapalek." crlf) (printout t?novy-pocet " zapalek zbyva." crlf) (assert (zbyva-zapalek?novy-pocet)) (assert (hraje-hrac c))) Funkci programu lze předvést na následující jednoduché ukázce. Předpokládejme, že člověk začne jako první brát zápalky a že počáteční počet zápalek je 9. Program je nejdříve spuštěn příkazy CLIPSu (reset) a (run). Po té již probíhá komunikace (viz níže uvedený výpis z obrazovky). CLIPS> (reset) CLIPS> (run) Kdo bere prvni (pocitac: p clovek: c)? c S kolika zapalkami chcete zacit? 9 Kolik zapalek chcete vzit? 3 6 zapalek zbyva. Pocitac bere 1 zapalek. 5 zapalek zbyva. Kolik zapalek chcete vzit? 1 4 zapalek zbyva. Pocitac bere 3 zapalek. 1 zapalek zbyva. Musite vzit posledni zapalku! Prohral jste! CLIPS> 20

4 Analýza procesu Následující příklad popisuje část analýzy procesu startování motoru auta. Kód obsahuje deklaraci 6 globálních proměnných: citac_experta, citac_pokrocileho, citac_zacatecnika, citac_bez_odezvy, cas_startu, maximalni_cas. Proměnné mají následující význam: citac_experta - počet pokusů o nastartování motoru na úrovni experta (zkušeného řidiče), citac_pokrocileho - počet pokusů o nastartování motoru na úrovni pokročilého, citac_zacatecnika - počet pokusů o nastartování motoru na úrovni začátečníka, citac_bez_odezvy - počet neúspěšných pokusů o nastartování motoru, cas_startu - čas startování motoru, maximalni_cas - maximální doba povolená k nastartování motoru. Dále jsou v programu definovány dva nesetříděné fakty stavy_auta a akce, každý s několika sloty (položkami). Pro uvedenou část programu je významný druhý fakt, který obsahuje sloty typ, hodnota, cas, casova_znacka. V bázi faktů se tak za běhu programu může vyskytovat například fakt (akce (typ pas) (hodnota 1) (casova_znacka 3)). Fakt představuje akci (úkon), kterou provedl řidič v čase t=3, přičemž se jednalo o uvedení (bezpečnostních) pásů do stavu 1 (zapnutí). Funkce programu je dokumentována na pravidle expert_startuje_motor. Pravidlo je splněno za dvou podmínek: 1. byly provedeny potřebné akce, 2. akce byly provedeny ve správném pořadí. Splnění pravidla odpovídá nastartování motoru. (defrule expert_startuje_motor "Uroven experta" (declare (salience 3))?f1 <- (akce (typ pas) (hodnota 1) (casova_znacka?t))?f2 <- (akce (typ rucni_brzda_zatazena) (hodnota 0) (casova_znacka?t1))?f3 <- (akce (typ brzda) (hodnota 1) (casova_znacka?t2))?f4 <- (akce (typ spojka) (hodnota 1) (casova_znacka?t3))?f5 <- (akce (typ razeni) (hodnota 0) (casova_znacka?t4))?f6 <- (akce (typ klicek_zapalovani) (hodnota 1) (casova_znacka?t5))?f7 <- (motor nestartuje) (test (= (+?t 1)?t1)) (test (= (+?t 2)?t2)) (test (= (+?t 3)?t3)) (test (= (+?t 4)?t4)) (test (= (+?t 5)?t5)) (assert (motor startuje)) (retract?f1?f2?f3?f4?f5?f6?f7) (bind?*citac_experta* (+?*citac_experta* 1)) (printout evaluation "ULOHA: nastartovani motoru" crlf) (printout evaluation "CAS: " (- (integer (time))?*cas_startu*) " vterin" crlf) (printout evaluation "CHYBY: 0" crlf crlf) ) Vysvětlení LHS (levostranné části) pravidla: 1. Pravidlu je přiřazena relativně nejvyšší priorita ve vztahu k ostatním pravidlům (viz celkový výpis níže). Nejvyšší priorita zajišťuje, že systém se bude snažit splnit toto pravidlo jako první, jinými slovy nejprve zjišťuje, zda bylo auto nastartováno na "expertní" úrovni. 21

2. Zjišťuje se přítomnost faktu (akce (typ pas) (hodnota 1) (casova_znacka xxx)) v bázi faktů. Existuje-li fakt, je do proměnné t uložena hodnota xxx odečtená z příslušného slotu (význam: čas zapnutí pásů). Adresa faktu je uložena do proměnné f1. 3. Podobně jako v bodě 2. je zjištěna existence dalších 6 faktů, odpovídajících těmto akcím: povolení ruční brzdy, sešlápnutí brzdového pedálu, sešlápnutí pedálu spojky, zařazení neutrálu, otočení klíčkem zapalování. Příslušné časové okamžiky provedení jednotlivých akcí jsou uloženy v proměnných t1 až t5, adresy faktů jsou uloženy do proměnných f2 až f7. 4. Zjištění existence faktu (motor nestartuje), který odpovídá stavu nenastartovaného motoru. 5. Ověření, jestli platí následující rovnice: t+1=t1, t+2=t2, t+3=t3, t+4=t4, t+5=t5. Prakticky to znamená, že t<t1<t2<t3<t4<t5, t.j. prvních 6 akcí následuje za sebou v určitém pořadí. Dále je zajištěno, že jednotlivé časy se liší max. o 1, t.j. akce následují těsně za sebou (předpokládáme jen celočíselné hodnoty času). Vysvětlení RHS (pravostranné části) pravidla: 1. Je vložen fakt (motor startuje) označující, že motor je nastartován. 2. Pomocí adres f1 až f7 jsou odstraněny již nepotřebné fakty vyjadřující jednotlivé akce. 3. Počet nastartování experta je zvýšen o jedničku (hodnota proměnné citac_experta). 4. Je vytištěna zpráva "ULOHA: nastartovani motoru". 5. Je vytištěna zpráva "CAS: xxx vterin". xxx je doba startování auta. 6. Je vytištěna zpráva "CHYBY: 0", t.j. auto bylo nastartováno bezchybně. Níže je uveden kompletní výpis programu v CLIPSu. Jde o část analýzy, která může být doplněna např. o další akce (stavy_auta) a pod. Jednotlivá pravidla programu jsou okomentována přímo ve výpisu. (defglobal?*citac_experta* = 0*) (defglobal?*citac_pokrocileho* = 0*) (defglobal?*citac_zacatecnika* = 0*) (defglobal?*citac_bez_odezvy* = 0*) (defglobal?*cas_startu* = 0*) (defglobal?*maximalni_cas* = 10*) (deftemplate stavy_auta "Konstanty pouzite v rizeni auta" (slot brzda) (slot rucni_brzda_zatazena) (slot spojka) (slot klicek_zapalovani) (slot razeni) (slot pas) ) ;sablona stavy_auta (deftemplate akce "Akce ridice pri rizeni" (slot typ) ;typ akce (slot hodnota) ;hodnota akce (slot cas) ;cas akce (slot casova_znacka) ;poradi akce ) ;sablona akce ; pravidla pro nastartovani motoru (defrule expert_startuje_motor "Uroven experta" ; hodnota salience je nejvyssi mei 4 aktivnimi pravidly (declare (salience 3)) ; tato cast pravidla zajistuje, ze budou provedeny vsechny dilci akce pri 22

; startu motoru ; prvni akce je zapnuti bepecnostnich pasu?f1 <- (akce (typ pas) (hodnota 1) (casova_znacka?t)) ; dalsi akce je odbrzdeni rucni brzdy?f2 <- (akce (typ rucni_brzda_zatazena) (hodnota 0) (casova_znacka?t1)) ; dalsi akce je seslapnuti brzdoveho pedalu?f3 <- (akce (typ brzda) (hodnota 1) (casova_znacka?t2)) ; dalsi akce je seslapnuti pedalu spojky?f4 <- (akce (typ spojka) (hodnota 1) (casova_znacka?t3)) ; dalsi akce je zarazeni neutralu?f5 <- (akce (typ razeni) (hodnota 0) (casova_znacka?t4)) ; dalsi akce je otoceni klickem zapalovani?f6 <- (akce (typ klicek_zapalovani) (hodnota 1) (casova_znacka?t5))?f7 <- (motor nestartuje) ; Nasleduje test spravnosti poradi provedenych akci. Spravne poradi je: ; zapnuti pasu, uvolneni rucni brzdy, seslapnuti brzdoveho pedalu, ; seslapnuti pedalu spojky, zarazeni neutralu, otoceni klickem zapalovani (test (= (+?t 1)?t1)) (test (= (+?t 2)?t2)) (test (= (+?t 3)?t3)) (test (= (+?t 4)?t4)) (test (= (+?t 5)?t5)) ; Nasledujici vlozeni faktu oznacuje, ze byl ucinen pokus o nastartovani (assert (motor startuje)) ; akce byly zaznamenany a jsou odstraneny z baze faktu (retract?f1?f2?f3?f4?f5?f6?f7) ; inkrementace citace pokusu experta (bind?*citac_experta* (+?*citac_experta* 1)) (printout evaluation "ULOHA: nastartovani motoru" crlf) (printout evaluation "CAS: " (- (integer (time))?*cas_startu*) " vterin" crlf) (printout evaluation "CHYBY: 0" crlf crlf) ) ; expert_startuje_motor (defrule pokrocily_startuje_motor "Uroven pokrocileho" ; hodnota salience je nizsi nez u experta ale vyssi nez u zacatecnika (declare (salience 2))?f1 <- (akce (typ pas) (hodnota 1) (casova_znacka?t))?f2 <- (akce (typ rucni_brzda_zatazena) (hodnota 0) (casova_znacka?t1))?f3 <- (akce (typ brzda) (hodnota 1) (casova_znacka?t2))?f4 <- (akce (typ spojka) (hodnota 1) (casova_znacka?t3))?f5 <- (akce (typ razeni) (hodnota 0) (casova_znacka?t4))?f6 <- (akce (typ klicek_zapalovani) (hodnota 1) (casova_znacka?t5))?f7 <- (motor nestartuje) ; Nasleduje test spravnosti poradi provedenych akci. Spravne poradi je: ; zapnuti pasu, uvolneni rucni brzdy, seslapnuti brzdoveho pedalu, ; seslapnuti pedalu spojky, zarazeni neutralu, otoceni klickem zapalovani ; Mezi nutnymi akcemi mohou byt provedeny dalsi. (test (>?t1?t)) (test (>?t2?t1)) (test (>?t3?t2)) (test (>?t4?t3)) (test (>?t5?t4)) ; Nasledujici vlozeni faktu oznacuje, ze byl ucinen pokus o nastartovani (assert (motor startuje)) ; akce byly zaznamenany a jsou odstraneny z baze faktu (retract?f1?f2?f3?f4?f5?f6?f7) 23

; inkrementace citace pokusu pokrocileho (bind?*citac_pokrocileho* (+?*citac_pokrocileho* 1)) (printout evaluation "ULOHA: nastartovani motoru" crlf) (printout evaluation "CAS: " (- (integer (time))?*cas_startu*) " vterin" crlf) (printout evaluation "CHYBY: 1 nebo vice" crlf) (printout evaluation "VYSVETLENI: Pri startu byly provedeny dalsi akce." crlf ) ) ; pokrocily_startuje_motor (defrule zacatecnik_startuje_motor "Uroven zacatecnika" ; hodnota salience je mensi nez u pokrocileho ale vyssi nez u urovne ; "nenastartovani" (declare (salience 1)) ; Nasleduje test, zda byy provedeny vsechny nutne akce?f1 <- (akce (typ pas) (hodnota 1) (casova_znacka?t))?f2 <- (akce (typ rucni_brzda_zatazena) (hodnota 0) (casova_znacka?t1))?f3 <- (akce (typ brzda) (hodnota 1) (casova_znacka?t2))?f4 <- (akce (typ spojka) (hodnota 1) (casova_znacka?t3))?f5 <- (akce (typ razeni) (hodnota 0) (casova_znacka?t4))?f6 <- (akce (typ klicek_zapalovani) (hodnota 1) (casova_znacka?t5))?f7 <- (motor nestartuje) ; Akce nemusi byt provedeny v urcitem poradi. Pouze musi byt vsechny ; provedeny. ; Nasledujici vlozeni faktu oznacuje, ze byl ucinen pokus o nastartovani (assert (motor startuje)) ; akce byly zaznamenany a jsou odstraneny z baze faktu (retract?f1?f2?f3?f4?f5?f6?f7) ; inkrementace citace pokusu zacatecnika (bind?*citac_zacatecnika* (+?*citac_zacatecnika* 1)) (printout evaluation "ULOHA: nastartovani motoru" crlf) (printout evaluation "CAS: " (- (integer (time))?*cas_startu*) " vterin" crlf) (printout evaluation "CHYBY: 1 nebo vice" crlf) (printout evaluation "VYSVETLENI: Akce byly provedeny v nespravnem poradi." crlf) ) ; zacatecnik_startuje_motor (defrule motor_se_nenastartoval "Motor se ne a ne nastartovat" ; Kontrola, zda byl motor startovan (motor nestartuje) ; Kontrola, zda cas prekrocil casovy limit (test (> (integer (time)) (+?*maximalni_cas*?*cas_startu*))) ; inkrementace citace nenastartovani motoru (bind?*citac_bez_odezvy* (+?*citac_bez_odezvy* 1)) (printout evaluation "Motor se nenastartoval" crlf) (printout evaluation "CAS: " (- (integer (time))?*cas_startu*) "vterin" crlf crlf) ) ; motor_se_nenastartoval 24

5 Symbolická analýza Další příklad je ukázkou symbolické analýzy pomocí expertního systému. Jde o řešení hádankářského problému, tzv. slovního puzzle. Zadání problému tvoří rovnice představující součet dvou šesticiferných čísel. Číslice jsou ovšem nahrazeny symboly - písmeny. Úkolem je přiřadit písmenům číslice tak, aby rovnice platila. GERALD + DONALD ------ = ROBERT Základem řešení problému v CLIPSu je generování všech možných kombinací dvojic číslic 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 a písmen G, E, R, A, L, D, O, N, B, T ve formě faktů. Nejprve je však nutné zajistit vložení faktů (cislo x) a (pismeno y), kde x a y jsou výše uvedené číslice a písmena. Vložení faktů probíhá v pravidle start, které je vždy splněno. (defrule start (printout t t "Zadani problemu:" t t) (printout t " GERALD" t) (printout t " + DONALD" t) (printout t " ------" t) (printout t " = ROBERT" t t) (assert (cislice 0) (cislice 1) (cislice 2) (cislice 3) (cislice 4) (cislice 5) (cislice 6) (cislice 7) (cislice 8) (cislice 9) (pismeno G) (pismeno E) (pismeno R) (pismeno A) (pismeno L) (pismeno D) (pismeno O) (pismeno N) (pismeno B) (pismeno T))) Kombinace dvojic číslice-písmeno jsou generovány pravidlem generuj_kombinace tak, že jsou vloženy fakty (kombinace x y). (defrule generuj_kombinace (cislice?x) (pismeno?a) (assert (kombinace?a?x))) 25

Vlastní řešení probíhá v LHS (levostranné části) pravidla nalezni-reseni. V pravidle jsou postupně zadány vztahy mezi písmeny (číslicemi) zprava daného vztahu: 1. je zvoleno číslo d odpovídající písmenu D, 2. je zvoleno číslo t odpovídající písmenu T tak, že není rovno d, 3. čísla jsou zkontrolována tak, že musí platit (d+d) mod 10 = t, 4. je zvoleno číslo l odpovídající písmenu L tak, že není rovno l, d, ani t, 5. je zvoleno číslo r odpovídající písmenu R tak, že není rovno r, d, t, ani l, 6. čísla jsou zkontrolována tak, že musí platit (d+d+10*l+10*l) mod 100 = (10*r+t), 7.... V RHS (pravostranné části) výkonného pravidla je pak proveden výpis nalezených čísel ve formátu zadání. V případě, kdy zadání nemá řešení, nebude pravidlo naleznireseni splněno a program bude ukončen bez jakéhokoliv upozornění. K řešení příkladu je potřeba poznamenat, že se jedná o použití paměťově náročného algoritmu. Je to dáno množstvím obrazů v LHS, které je potřeba splnit (najít jejich protějšky v existujících faktech), přičemž faktů je vygenerováno značné množství (kombinace písmen a číslic). (defrule nalezni-reseni (kombinace D?d) (kombinace T?t&~?d) (test (= (mod (+?d?d) 10)?t)) (kombinace L?l&~?d&~?t) (kombinace R?r&~?d&~?t&~?l) (test (= (mod (+?d?d (* 10?l) (* 10?l)) 100) (+ (* 10?r)?t))) (kombinace A?a&~?d&~?t&~?l&~?r) (kombinace E?e&~?d&~?t&~?l&~?r&~?a) (test (= (mod (+?d?d (* 10?l) (* 10?l) (* 100?a) (* 100?a)) 1000) (+ (* 100?e) (* 10?r)?t))) (kombinace N?n&~?d&~?t&~?l&~?r&~?a&~?e) (kombinace B?b&~?d&~?t&~?l&~?r&~?a&~?e&~?n) (test (= (mod (+?d?d (* 10?l) (* 10?l) (* 100?a) (* 100?a) (* 1000?r) (* 1000?n)) 10000) (+ (* 1000?b) (* 100?e) (* 10?r)?t))) (kombinace O?o&~?d&~?t&~?l&~?r&~?a&~?e&~?n&~?b) (kombinace G?g&~?d&~?t&~?l&~?r&~?a&~?e&~?n&~?b&~?o) (test (= (+?d?d (* 10?l) (* 10?l) (* 100?a) (* 100?a) (* 1000?r) (* 1000?n) (* 10000?e) (* 10000?o) (* 100000?g) (* 100000?d)) (+ (* 100000?r) (* 10000?o) (* 1000?b) (* 100?e) (* 10?r)?t))) (printout t "Reseni je:" t t) (printout t " G = "?g t) (printout t " E = "?e t) 26