V návrhu a implementácii ZS je možné rozlíšiť niekoľko štádií. Nie každý vytváraný ZS však musí nutne prejsť všetkými štádiami. Tieto štádiá, uvedené v chronologickom slede, sú takéto:
V štádiu vývoja sa experimentálny systém stáva vývojovým systémom. V tomto štádiu musia byť ujasnené a overené všetky podstatné princípy jeho práce. Systém sa stáva predmetom intenzívneho a systematického testovania. Dotvárajú sa tie jeho vlastnosti, na ktorých vo výskumnej etape nezáležalo a ani nemohlo záležať. Vo vývojovom štádiu sa optimalizujú výpočtové a pamäťové nároky, tzn. hľadajú sa najvýhodnejšie algoritmy realizácie princípov práce vyvíjaného ZS. Použité metódy sa vylepšujú taktiež vzhľadom na bezpečnosť a použiteľnosť za všetkých okolností, ktoré môžu nastať v prevádzkových podmienkach.
Konečná implementácia súvisí s tvorbou ZS "šitým na mieru" podľa konkrétnej špecifikácie. V tomto štádiu sú známe technické prostriedky, požiadavky na komunikačné rozhranie, princípy práce ZS a rovnako i algoritmy implementácie týchto princípov. Odstraňujú sa všetky nevýhodné a nepotrebné vlastnosti systému a algoritmy sa implementujú s maximálnym využitím predností technických prostriedkov výpočtového systému, na ktorom sa má vytváraný ZS prevádzkovať. Rovnako sa realizuje používateľské rozhranie, pričom sa zohľadňujú špecifiká riešeného problému a požiadavky budúcich používateľov. Konečným cieľom tejto etapy je dosiahnuť prirodzené, pohodlné, spoľahlivé, rýchle a jednoduché používanie konečnej verzie vytváraného ZS.
Hoci sa jednotlivé vývojové štádiá nedajú vždy ostro ohraničiť, predsa je výhodné usutočňovať ich oddelene, prípadne i samostatnými kolektívmi. Návrh a implementácia konkrétneho ZS nemusí prechádzať všetkými uvedenými štádiami. Ak kolektív autorov (tvorcov) ZS má dostatočné skúsenosti, môže začať priamo etapou konečnej implementácie
V súvislosti s implementáciou ZS je v dostupnej literatúre veľmi málo informácií zaoberajúcich sa rozborom vhodných programovacích techník a poukazujúcich na také programátorské metódy, zručnosti a ohraničenia, ktorých poznanie by bolo veľmi cenné pre tvorcov ZS. Nie je jednoduché ani odporúčať príslušné pramene (snáď vybrané časti z [Brownston:1985] a [Townsend:1986]). Treba však zdôrazniť, že umenie vytvárať znalostné systémy (všeobecnejšie "inteligentné počítačové systémy") je súčasťou, ale zároveň i rozšírením programátorského umenia. Je to umenie tvorby zložitých programových systémov, ktoré reprezentujú znalosti o svete a na základe nich riešia zadané problémy.
Jeho nevýhodou je pomerne nízka výpočtová efektivita. Tento nedostatok čiastočne kompenzujú kompilátory dodávané v rámci súčasných implementácií Lispu. Nízka výpočtová efektivita stráca svoje opodstatnenie taktiež v súvislosti so špeciálnymi počítačovými architektúrami - lispovskými procesormi.
Ďalším široko používaným implementačným jazykom je PROLOG, hoci v ňom vytvorených komerčne dostupných aplikácií je menej (napr. APES [Hammond:1983], KEX [Návrat:1989-a]). Prolog má zabudovaný mechanizmus unifikácie, prehľadávania a backtrackingu, čo zvyšuje predpoklady pre využitie pri implementácii ZS. Jeho vlastnosti ako i špecifický štýl programovania umožňujú využívať Prolog hlavne na tvorbu prototypových verzií, kde je výhodou pomerne krátky čas implementácie prototypu.
Podobne ako u lispu, i u prologu je neho nevýhodou pomerne nízka výpočtová efektivita. Opäť sa odstraňuje poskytovaním kompilátorov pre vytvorenie efektívne vykonávanej konečnej verzie. Postavenie prologu ako veľmi perspektívneho jazyka upevňuje vývoj špeciálnych architektúr s prologom ako strojovým jazykom, ktoré by mali tvoriť základ počítačov piatej generácie.
Pri implementácii ZS je výrazný taktiež trend používať ako implementačný jazyk niektorý z "klasických" programovacích jazykov. Existujú ZS implementované napr. v jazyku FORTRAN (CASNET [Weiss:1984]), C (OPS83, EXSYS, NEXPERT), ba dokonca i BASIC [Levine:1986]. Výhodou týchto programovacích jazykov je pomerne vysoká výpočtová efektivita. Ďalšou nezanedbateľnou prednosťou týchto jazykov je skutočnosť, že v súčasnosti je k dispozícii viac programátorov schopných progra movať v týchto jazykoch ako programátorov schopných písať efektívny kód v jazykov vyvinutých pre potreby umelej inteligencie.
Použitie "klasických" programovacích jazykov prináša však i nemalé problémy. Tieto jazyky nepodporujú symbolické výpočty a neposkytujú zabudovanú automatickú správu pamäte. Všetky tieto vlastnosti treba najskôr prácne implementovať.
V praxi sa však obvykle nepoužívajú takéto vyhranené prístupy. ZS býva implementovaný v symbolickom programovacom jazyku, kde sú odladené jeho základné vlastnosti. Potom bývajú kritické časti (niekedy aj celý ZS) reimplementovaný s pomocou "klasického" programovacieho jazyka (spravidla sa jedná o Assembler a C) tak, aby sa dosiahla čo najvyššia výpočtová efektivita.
Pri implementácii PP je nutné navrhnúť údajovú štruktúru pre reprezentáciu prvkov PP a interfejs na túto údajovú štruktúru. V rámci interfejsu postačí implementovať nasledovné operácie:
Implementácia interfejsu je vzhľadom na danú údajovú štruktúru značne neefektívna, pretože treba vykonávať sekvenčné prehľadávanie prvkov zoznamu, alebo postupnosti faktov v databáze. V niektorých špecifických prípadoch možno použiť na zefektívnenie týchto procedúr hashovanie (napr. na základe objektov, ku ktorým sa uvedené fakty vzťahujú), no vo všeobecnosti obvykle neexistujú možnosti štrukturalizácie PP, ktorá by umožňovala zefektívniť prístup k jednotlivým položkám PP.
Trojice [Objekt,Atribut,Hodnota] sa väčšinou používajú v zložitejších pravidlových systémoch, no taktiež v rámcových systémoch, kde obvykle predstavujú hodnoty atribútov rámcov. Na ich implementáciu v Lispe sa väčšinou využívajú P-zoznamy (zoznamy vlastností).
V Prologu je pri implementácii situácia zložitejšia. Ak sa chceme aspoň zčasti vyhnúť sekvenčnému prehľadávaniu databázy, je treba vytvoriť špeciálnu organizáciu údajov, napr. podobnú P-zoznamom.
Implementácia PP pomocou P-zoznamov v Lispe (ako implementačný jazyk bol použitý GC-LISP).
;;; Pridanie prvku do PP (defun pridaj (objekt atribut hodnota) (setf (get objekt atribut) hodnota)) ;;; modifikacia prvku v PP (defun modifikuj (objekt atribut hodnota) (setf (get objekt atribut) hodnota)) ;;; zrusenie prvku v PP (defun zrus (objekt atribut hodnota) (when (eq (get objekt atribut) hodnota) (setf (get objekt atribut) hodnota))) ;;; test pritomnosti daneho prvku v PP (defun testuj (objekt atribut hodnota) (eq (get objekt atribut) hodnota))Implementácia PP v Prologu, pričom je vytvorená špeciálna údajová štruktúra zoskupujúca všetky trojice viazané k jednému objektu. Ako implementačný jazyk bol použitý ARITY/PROLOG 5.0.
%--------------------------------------------------------------- % Zakladne predikaty interfejsu %%% pridanie prvku do PP pridaj(Objekt,Atribut,Hodnota):- ( recorded(pp,pp(Objekt,Plist),Ref), replace(Ref,pp(Objekt,[Atribut:Hodnota|Plist])) ; recorda(pp,pp(Objekt,[Atribut:Hodnota]),_) ). %%% modifikacia prvku v PP modifikuj(Objekt,Atribut,Hodnota):- recorded(pp,pp(Objekt,Plist),Ref), modifikuj_v_p_zozname(Plist,Atribut,Hodnota,Plist1), replace(Ref,pp(Objekt,Plist1)). %%% zrusenie prvku v PP zrus(Objekt,Atribut,Hodnota):- recorded(pp,pp(Objekt,Plist),Ref), zrus_v_p_zozname(Plist,Atribut,Hodnota,Plist1), replace(Ref,pp(Objekt,Plist1)). %%% testovanie pritomnosti prvku v PP testuj(Objekt,Atribut,Hodnota):- recorded(pp,pp(Objekt,Plist),_), testuj_v_p_zozname(Plist,Atribut,Hodnota). %--------------------------------------------------------------- % Pomocne predikaty %%% modifikacia prvku v p-zozname modifikuj_v_p_zozname([Atribut:_|Zvysok],Atribut,Hodnota, [Atribut:Hodnota|Zvysok]). modifikuj_v_p_zozname([At:Hod|Zvysok],Atribut,Hodnota,[At:Hod|Zvysok1]):- modifikuj_v_p_zozname(Zvysok,Atribut,Hodnota,Zvysok1). %%% zrusenie prvku v p-zozname zrus_v_p_zozname([],_,_,_):- write('Neexistujuci prvok'),nl, !,fail. zrus_v_p_zozname([Atribut:Hodnota|Zvysok],Atribut,Hodnota,Zvysok). zrus_v_p_zozname([At:Hod|Zvysok],Atribut,Hodnota,[At:Hod|Zvysok1]):- zrus_v_p_zozname(Zvysok,Atribut,Hodnota,Zvysok1). %%% pridanie prvku do p-zoznamu testuj_v_p_zozname([Atribut:Hodnota|_],Atribut,Hodnota). testuj_v_p_zozname([_|Zvysok],Atribut,Hodnota):- testuj_v_p_zozname(Zvysok,Atribut,Hodnota).Ďalšiu možnú organizáciu údajov v PP predstavuje sieť. Siete pri organizovaní údajov v PP používa napr. systém KAS [Reboh:1981]. Siete sú použité taktiež na implementáciu relačnej databázy reprezentujúcej štruktúru PP v systéme ROSIE [Fain:1981].
Pri implementácií sietí sa využíva transformácia siete do množiny trojíc [Objekt1,Relácia,Objekt2].
K faktom v PP bývajú v mnohých znalostných systémoch pripojené ich vlastnosti, ktoré sa využívajú pri inferencii. Medzi najčastejšie používané vlatnosti patria:
Stromová štruktúra sa väčšinou používa pri inferencii založenej na metódach "rozdeľ a panuj", dekompozície alebo zjemňovania problémov. Jednotlivé ciele sa spájajú pomocou smerníkov so svojimi podcieľmi, alebo s cieľmi, z ktorých boli odvodené. Vzťah medzi podcieľmi daného cieľa môže byť typu AND alebo OR. Pri vzťahu typu OR stačí na splnenie daného cieľa splniť aspoň jeden z jeho podcieľov, zatiaľ čo pri vzťahu typu AND je potrebné splniť všetky jeho podciele.
Front je vhodným spôsobom organizácie cieľov vtedy, ak treba splniť všetky generované ciele a všetky ciele majú rovnakú prioritu (váhu). Ciele vo fronte sa spĺňajú v rovnakom poradí v akom sa generovali. Zasobnik je vhodný spôsob organizácie cieľov pri spätnom reťazení, tzn najskôr sa spĺňa najneskôr generovaný cieľ. Agenda sa používa vtedy, ak sa priorita cieľov dynamicky mení. Agenda sa podobá frontu, no ciele sú navyše usporiadavané podľa svojej priority.
V konkrétnych systémoch sa častokrát používa kombinácia uvedených spôsobov organizácie cieľov. V systémoch BEX a KEX sa napr. používa zásobník pre bezprostredné riadenie inferencie a plánovací prioritný front umožňujúci naplánovanie činnosti, ktorá sa má vykonať niekedy v budúcnosti.
Pri rozsiahlejších aplikáciách sa môže pristúpiť i k štrukturalizácii PP na menšie segmenty, ktoré slúžia na uchovávanie spolu súvisiacich údajov (či už faktov alebo cieľov). Tieto segmenty sa nazývajú rôzne: tabule (KEX), úrovne (HEARSAY, BB1, BLONDIE) atď. Selektívne prehľadávanie jednotlivých segmentov zvyšuje efektívnosť prístupu k položkám PP a rovnako takáto štrukturalizácia PP zlepšuje zvládnuteľnosť rieš enia problému.
Pri implementácii BZ je treba vytvoriť údajové štruktúry zodpovedajúce reprezentácii jednotlivých entít reprezentačného formalizmu a procedúry sprístupňovania informácií viazaných k daným entitám. Tieto údajové štruktúry veľmi úzko závisia od použitého formalizmu reprezentácie znalostí, tzn. od štruktúry a vzájomných väzieb entít reprezentujúcich jednotlivé skupiny znalostí. Procedúry sprístupňovania znalostí musia byť realizované čo možno najefektívnejšie, pretože frekvencia prístupov do BZ počas je vysoká (i keď nie tak vysoká ako frekvencia prístupov do PP).
Pri implementácii BZ sú k dispozícii dve alternatívy: umiestnenie BZ do virtuálnej pamäte, alebo umiestnenie BZ do externých súborov so špeciálnymi prístupovými procedúrami. Umiestnenie BZ do virtuálnej pamäte je z hľadiska implementácie jednoduchšie. Prístupové procedúry nebývajú zložité, pretože mnohé implementačné jazyky priamo poskytujú prostriedky automatickej správy pamäte. Potom sa jedná vlastne iba o sprístupnenie údajov v operačnej pamäti. Formát znalostí uchovávaných v takto umiestnenej BZ je zhodný z formátom využívaným pre inferenčný mechanizmus. Obsah BZ však treba na začiatku inferencie načítať a uložiť do virtuálnej pamäte.
Umiestnenie BZ do externých súborov (napr. vo forme databázy) na disku je na prvý pohľad zdanlivo nevýhodnejšie. Formát uchovávania znalostí býva z dôvodov zmenšovania rozsahu BZ iný ako ten, ktorý vyžaduje inferenčný mechanizmus. Je preto nutné vykonávať niekedy zložité transformácie formátu údajov z BZ. Sprístupňovacie procedúry bývajú taktiež omnoho zložitejšie, pretože externé súbory majú z dôvodov efektívneho sprístupňovania informácií zväčša špeciálnu štruktúru.
Pri posudzovaní výhodnosti použitia každej z opísaných alternatív pre konkrétnu implementáciu ZS si však treba uvedomiť, že i sprístupňovanie znalostí z BZ umiestnenej vo virtuálnej pamäti vyžaduje prístupy na disk (pri stránkovaní). Treba preto zvážiť, či prístupové procedúry k údajov vo virtuálnej pamäti sú dostatočne efektívne na to, aby bolo výhodnejšie zvoliť túto alternatívu.
Pri ukladaní BZ do externého súboru sa zväčša navrhuje špeciálna štruktúra súborov, typická pre databázové systémy.
IM predstavuje z hľadiska implementácie jednu z najzložitejších súčastí ZS. Pri návrhu IM je účelné maximálne abstrahovať od konkrétnej implementácie PP, BZ a protokolu a komunikovať s nimi iba na základe vytvorených rozhraní.
Pre uľahčenie implementácie a ladenia je vhodné IM budovať čo možno najviac modulárne. Pri implementácii každej usudzovacej metódy možno vyčleniť relatívne samostatné činnosti IM, ktoré možno implementovať oddelene.
V IM sa veľmi často využíva spôsob aktivácie rôznych činností na základe stavu PP. Takýto spôsob práce IM vyžaduje analyzovať po každej vykonanej činnosti, ktorá môže modifikovať stav PP, aktivačné podmienky všetkých činností principiálne pripadajúcich do úvahy. Uvedený problém sa najvypuklejšie prejavuje pri pravidlových produkčných systémoch. Až 85% času sa spotrebuje na vytváranie množiny aplikovateľných pravidiel a asi iba 15% sa spotrebuje na vykonanie vlastnej činnosti, teda riešenie zadanej úlohy. Jednou z možností vylepšenia tohto nepriaznivého pomeru je algoritmus RETE.