Znalostní technologie I.
 Rozcestnik                   Pár slov ...                   Znalostní technologie II.                   Znalostní technologie III.                   Znalostní technologie IV.                   Další zdroje                  
Dnes je:        Aktuální čas: 00:00       Moudra: 

LEKCE 6.

Náplň lekce:


Práce s pomocnými fakty

Pomocné fakty jsou takové fakty, kterými můžete určitým způsobem řídit běh programu (kdy - za jakých podmínek se co provede). Například máme fakta - seznamy, obsahující informace o ovoci. Už víme, jak zajistit výpis daných seznamů. Budeme ale požadovat, aby byl výpis proveden jen v případě, že si tak uživatel přeje. Tedy jestliže sám zadá ano nebo ne.

Tento problém je řešen s poznámkami v následujícím souboru: (stáhnout pomocne_fakty.clp)

Priorita pravidla

Tím, že pravidlu nastavíte prioritu docílíte toho, že pravidlo může být vykonáno dříve (priorita vyšší - definujete kladné celé číslo) nebo později (priorita nižší - definujete záporné celé číslo) než pravidla ostatní.

Klady:

Je to dobrý způsob jak např. docílit toho, aby se jedno pravidlo vykonalo dříve a to druhé počkalo až se první pravidlo vykoná (nebo naopak). Řídíte si běh programu (resp. pořadí vykonávání pravidel - pořadí pravidel jak se budou řadit v Agendě Clipsu) tak jak chcete vy (tedy ne vždy se to podaří na první pokus jak chcete :-().

Zápory:

Když porovnám programování např. v procedurálním jazyku Pascal a programování v Clipsu, tak v Pascalu jsem měla větší přehled o tom, co kdy bude vykonáno. Zkrátka jste měli hlavní program ohraničený beginem a endem. Uvnitř těchto hranic byly nějaké příkazy. Dále také procedury či funkce, které jste volali a věděli jste docela rychle kam se volání procedury či funkce odkazuje (věděli jste kam se dívat - jak to celé probíhá). Jednoduše to bylo v posloupnostech příkazů a ne tak nějak příliš chaoticky napřeskáčku.

V Clipsu je situace jiná. Nemáte zde žádný hlavní program (jakési jádro toho všeho) ze kterého voláte nějaké funkce či procedury. Dostáváte se jaksi mimo hranice konstrukce beginu a endu. Máte zde sadu pravidel, které mají za úkol něco vykonat. Hůře se odhaluje co bude vykonáno dříve a co později. Musíte projít všechna pravidla a zkoumat. Je pravdou, že si pravidla můžete seřadit za sebou (tam kde píšete zdrojový kód programu) podle toho v jakém pořadí budou vykonávána (pořadí nemá vliv na fungování programu - inferenční mechanismus se řídí především tím co je definováno v podmínkové části pravidla tzn. i danou prioritou pokud je v pravidle stanovena).

Pokusila jsem se vytvořit obrázek, který toto popisuje.

Pascal vs. Clips

Poznámka: Jednotlivé struktury nejsou přesně syntakticky správné, ale doufám že problém s pořadím provádění pravidel vystihuje. Je to jen má představa, jak to asi funguje a jaké jsou zde rozdíly např. oproti Pascalu. Tento obrázek je i ilustrací toho v jakém pořadí, při daných prioritách v pravidlech, se jednotlivá pravidla vykonají.

Detailní pohled na priority

Deklarace priority pravidla:

Syntaxe: (declare (salience celé číslo kladné nebo záporné))

například:

(declare (salience 5))

(declare (salience -50))

Kladným číslem definujeme vysokou prioritu a záporným nízkou tzn. že pravidlo s vyšší prioritou než mají ostatní pravidla bude vykonáno dříve. Záporným číslem definujeme nízkou prioritu tzn. že pravidlo s nižší prioritou, než mají ostatní pravidla, bude vykonáno později - až po vykonání těch s vyšší prioritou.

Důležité upozornění č. 1:

Priorita se definuje v podmínkové části pravidla jako první podmínka (na prvním místě) (Clips si to musí v hlavince srovnat jaké pravidlo může odložit a které spěchá a jakoby si je seřadit.).

Důležité upozornění č. 2:

Pokud neuvedete v podmínkové části pravidla žádnou prioritu - pak má pravidlo prioritu nulovou. Jako byste definovali (declare (salience 0))

Důležité upozornění č. 3:

Rozsah v jakém můžete definovat prioritu je <-10.000 ; + 10.000>.

Výzkum podmínkové části pravidla

Jaké druhy podmínek zde mohou být?
Jak jsou tyto podmínky zapsány?

Chceme definovat:

1. podmínku, kde proměnná bude nabývat jakékoliv hodnoty:

(ovoce ?nejake) - pro jednu hodnotu

(ovoce $?nejaka) - pro více hodnot = seznam

2. podmínku, kde proměnná nebude nabývat jedné konkrétní hodnoty
(ovoce ?nejake~hruska) - proměnná ?nejake není rovna hrusce

3. podmínku, kde proměnná nebude nabývat více konkrétních hodnot
(ovoce ?nejake~hruska&~jablicko&~kiwi&~mango) - proměnná ?nejake není rovna hrusce a zároveň není rovna jablicku atd.

4. podmínku s významem nebo
(ovoce cervene|zelene|zlute)

5. podmínku s hodnotou, která souvisí s hodnotami jiných proměnných
(ovoce ?nejake & :(eq ?nejake ?jine)) - říkáme, že pro proměnnou ?nejake platí, že jeho hodnota je rovna hodnotě v proměnné ?jiné.

Pozn. Předpokládám práci s řetězci - proto definuji eq nikoliv znaménko rovnosti = (to platí pro číselné proměnné). Proměnná ?jiné byla dříve definována.


Souhrnný příklad na procvičení:

Zadání:

1. Mějme zadány druhy zvířat a kontinent na kterém žijí. Ty budou součástí naší budoucí databáze:

(deffacts databaze
  (zvirata afrika slon zebra zirafa opice antilopa pes)
  (zvirata asie tygr slon opice panda pes)
  (zvirata evropa pes zajic jelen kocka medved rys)
)


2. Pokuste se vytvořit pravidla, která budou řešit následující:

  1. vypsat celou databázi zvířat i s kontinentem (nejprve název kontinentu a k němu zvířata, která ho mohou obývat)
  2. načíst název kontinentu a zjistit, jaká zvířata jej obývají
  3. načíst druh zvířete a zjistit, kde žije
  4. vložit do databáze nové zvíře (na konec příslušného seznamu)
  5. vložit do databáze celý nový záznam (např. pro Austrálii)
  6. zjistit, na kterém kontinentě žije kolik druhů zvířat
  7. zjistit, na kterém kontinentě žije největší počet zvířecích druhů
  8. ukončit program

Celý příklad bude zastřešen menu, ze kterého si bude uživatel vybírat co chce s databází provádět.

Tuto úlohu budeme řešit postupně. Nejprve začneme prvníma dvěma body A+B s ukončením programu. Postupně budeme přidávat další pravidla.


^ Nahoru ^      


KONEC 6.LEKCE  

Validace

Valid XHTML 1.0 Strict

Valid CSS!

Monitoring webu