Ontologie a deskripční logiky
Agenti v multiagentních systémech potřebují často vzájemně komunikovat a pro porozumění v komunikaci je potřebné mít společný slovník. Ontologie jsou právě takovým slovníkem, který navíc popisuje vztahy mezi jednotlivými objekty (a třídami objektů) v prostředí. Pokud se dva agenti dohodnou, že budou používat stejnou ontologii, oba vědí, co ostatní agent myslí libovolným výrazem/zprávou.
Formálněji se ontologie skládá z jedinců (zhruba ekvivalentních konstantám v logice prvního řádu), tříd (odpovídajícím unárním predikátům) a binárních vlastností mezi třídami nebo jedinci (binární predikáty). Nejčastější binární relací mezi třidami je relace, které vyjadřuje, že jedna třída je podtřídou druhé. Můžeme například mít třídu zvířat a třídu psů a můžeme specifikovat, že třída psů je podtřída všech zvířat. Navíc můžeme mít objekt (jedince) Rex a můžeme říct, že to je jeden objekt z třídy pes. Nyní, kdykoliv se agenti dozví nějakou informaci o všech zvířatech (např. že dýchají), mohou odvodit, že se tato informace týká i všech psů a tedy i Rexe.
Relace podtřídy je ta nejjednodušší a snadno může být vyjádřena i v libovolném programovacím jazyce. Vztahy v ontologiích ale mohou být mnohem obecnější. Můžeme si například vytvořit ontologii o univerzitě. Na univerzitě máme dva typy lidí - studenty a učitele. Navíc máme několik přednášek. Potom si můžeme definovat vztah, který vyjadřuje, že student navštěvuje přednášku a jiný, který definuje, že učitel učí přednášku.
Každá třída v ontologii může mít své vlastní vlastnosti (např. lidé mají jména) a každá vlastnost má definovaný typ, který je buď jeden ze základních typů (string, integer, …) nebo nějaký vlastní typ.
Kromě přímých definicí tříd můžeme také definovat třídy pomocí výrazů. Například můžeme definovat třídu pro velkou přednášku jako přednášku, kterou navštěvuje alespoň 50 studentů.
Podívejme se nyní na návrh ontologií praktičtěji. Navrhneme si ontologii pro univerzitu popsanou výše od počátku v editoru Protégé.
Jakmile spustíte Protégé, přepněte na tab Entities a můžete začít vytvářet hierarchii tříd a další pravidla. Každá třída je podtřída owl:Thing
. Vytvořme tedy hierarchii popsanou nahoře (třídu Person
se dvěma podtřídami Student
a Teacher
a třídu Course
). Dále v tabu “object properties” můžeme přidat závislosti mezi třídami. Vytvoříme si 4 závislosti – attends
a teaches
vyjadřují, že student nebo učitel navštěvují nebo učí nějaký kurz; isAttended
a isTaught
jsou relace k nim inverzní. Pro každou z relací navíc potřebujeme nastavit doménu a obor hodnot, tedy z jakých tříd mohou být objekty, které se v relaci vyskytují. Kromě vztahů mezi třídami můžeme u každé třídy definovat datové vlastnosti (v zásadě parametry objektů). U osob (třída Person
) můžeme například mít jméno a příjmení. Toto se přidává v záložce “object properties”. U každé vlastnosti zase můžeme nastavit, doménu (jakých tříd se týká) a obor hodnot (jaký má tato položka typ). Nakonec také můžeme vytvořit nějaké instance různých tříd. To se dělá nejlépe v tabu “individuals by class”. Každé instanci potom můžeme vytvořit její vlastnosti a můžeme ji přidat do relací, které máme definované pro jejich třídy. Vytvořme tedy cca 4 studenty a nastavme jim, jaké třídy navštěvují (budeme tedy potřebovat přidat i nějaké kurzy).
Zmiňovali jsme i to, že můžeme třídy definovat pomocí výrazů (formulí) nad existujícími třidami. Např. můžeme definovat třídu pro aktivní studenty ActiveStudent
tak, že jsou to studenti, kteří navštěvují alespoň dva různé kurzy. Vytvoříme tedy třidu ActiveStudent
jako podtřídu třídy Student
a nastavíme ji jako ekvivalentní výrazu attends min 2 Course
. Syntaxe těchto výrazů je celkem jednoduchá a můžete ji najít na webu Protégé.
Konečně můžeme také naši ontologii použít k odvozování a uvažování. K tomu potřebujeme spustit reasoner (nahoře v menu, reasoner -> start reasoner). Ten při spuštění napřed zkontroluje, jestli je naše ontologie konzistentní a potom v tabu “DL Query” můžeme začít pokládat dotazy ve stejném jazyce, jako když píšeme definice tříd. Dotazy jsou ve skutečnosti operace nad třídami zapsané v tzv. deskripční logice (proto DL query). Pokud chcete vidět i objekty, které odpovídají výsledkům daného dotazu (kromě pouze tříd), musíte si jejich zobrazené zapnout v pravém sloupci.
Deskripční logika
Dotazy a podmínky (a celá definice ontologie) jsou v ontologiích často specifikované v tzv. deskripční logice. To je logika, která je extenzí výrokové logiky, ale je slabší než logika predikátová. Speciálně je rozhodnutelná, tedy o každé formuli v ní zapsané umíme rozhodnout (často velmi efektivně) jestli je pravdivá, nebo ne.
Terminologie deskripční logiky se trochu liší od terminologie ontologií. V deskripční logice se místo pojmu “třída” používá “koncept” a místo “vlastností” (binárních relací) se používá pojem “role”.
Axiomy v deskripční logice se rozdělují na tzv. ABox a TBox. V ABoxu se typicky specifikují informace o konceptech a rolích mezi nimi. TBox potom obsahuje informace o jedincích (do jaké třídy patří, jaké mají vztahy s jinými jedinci apod.). Dalo by se také říct, že ABox popisuje obecné vlastnosti, které platí v nějakém světě, TBox potom udává konkrétní jedince (objekty), kteří se v tomto světě vyskytují a jaké jsou vztahy mezi nimi. Např. v naší ontologii o univerzitě jsou všechny třídy a vztahy mezi nimi (včetně třídy ActiveStudent
a vztahů isTaught
a isAttended
) součástí ABoxu, kdežto informace o jednotlivých studentech a kurzech by byly součástí TBoxu. Pokud mluvíme o ontologiích, zajímá nás většinou hlavně ABox, TBox získáváme až během toho, co agent danou ontologii používá. ABox a TBox dohromady tvoří bázi znalostí.
Deskripční logiky nám umožňují vyjadřovat všechny výše zmíněné vztahy mezi třídami, které jsme použili v naší ontologii výše (domény a obory hodnot vztahů mezi třídami, průniky, sjednocení, doplňky tříd apod.). Pokud by vás více zajímala formální syntaxe a sémantika deskripčních logik, můžete se podívat na stránku o nich na anglické Wikipedii (ve cvičeních si bohatě vystačíme s intuitivním porozuměním, syntaxí pro výrazy odkazovanou výše a vědomím, že na pozadí toho všeho funguje formální matematický aparát deskripčních logik).
Deskripčních logik existuje celá řada a liší se tím, jaké vztahy nám umožňují definovat a používat při definici tříd, vztahů mezi nimi apod. Tyto možnosti potom určují sílu (a často i složitost odvozování) konkrétní verze deskripční logiky.