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 4.

Náplň lekce:


Tato lekce je věnována opakování toho co jsme se již dozvěděli v předchozích lekcích. Dále zkusíme určovat počty faktů v bázi faktů a vytvořit hru v Clipsu.

Určování počtu faktů

Začneme úlohou - Určování počtu druhů ovoce

(stáhnout: ovoce_pocty_1.clp)    Pozor: jedná se o nefunkční program pro vysvětlení problému !

Proč dojde k zacyklení programu ? (popis nefunkční verze programu)

Při odhalování činnosti Clipsu Vám může velmi pomoci krokovací mechanismus, kdy místo spuštění programu příkazem Run, provedete Step.

Po spuštění Reset je stav následující:

Stav báze dat a agendy 1.

V agendě vidíme, že se budou provádět 4 pravidla pro určování počtu a to pro každý druh ovoce. To zní dobře. Tak to chceme. Dále v agendě vidíme, že se má pravidlo vykonat v závislosti na druhu ovoce a daném počtu - tedy zatím počtu 0 (f-4, f-5 zn. že dané pravidlo pro své provedení bude potřebovat tato čísla faktů z naší báze - z okna deffacts - f-4 je Mango a f-5 je počet 0.) Ten f-5 je počet 0 a bude použit i pro ostatní pravidla. Jak je patrné z agendy.

Co se stane po prvním kroku?

Budou se dít hotové divy, především v agendě. Pravidlo pro určení odpočítání prvního druhu ovoce (např. pro Mango) bylo provedeno, počet se zvýšil o jednotku a to se také uložilo do báze faktů. Tím nám vznikl nový fakt v bázi (pocet 1). Jedno pravidlo nám sice v agendě ubylo, ale další 4 přibyla. Proč? Problém spočívá v dané kombinaci faktů: (ovoce ?x) a (počet ?y).

Stav báze dat a agendy 2.

Jakoby Clips nejprve dokonal to staré tzn. nejprve provede ta pravidla vzhledem k poctu 0 a to ke každému druhu ovoce (kombinace faktů: f-3,f-5;f-2,f-5;f-1,f-5). 4x se nám vypíše počet druhu ovoce je:1. Počet se sice o jedna zvyšuje, ale 4x stále od nuly. V bázi faktů ale nemáme 4x vypsáno (pocet 1), protože nám Clips nedovolí uložit do báze faktů několik naprosto stejných faktů.

Potom co dokoná to staré - vzhledem k počtu 0, pak si opět vezme počet, ale už s číslem 1 a každý druh ovoce (kombinace faktů: f-4, f-6; f-3,f-6;f-2,f-6;f-1,f-6) (f-6 značí ten počet 1). Následně provede zase dané pravidlo 4x (podle počtu druhů ovoce). V dalším kroku si opět vezme počet, ale s číslem 2 atd… Z toho vyplývá, že se nám program zacyklí.

Až po čtyřnásobném provedení daného pravidla vzhledem k jednomu počtu (např. počet 1) se počet zvýší o jedničku - přibude nový fakt v bázi a přibudou 4 nová pravidla v agendě.

Stav báze dat a agendy 3.

Jak problém vyřešit?

Všimněte si, že počty druhů ovoce se vždy zvyšují o jedna - vlastně až donekonečna. Jestliže budeme mít v bázi faktů pocet 0 a pocet 1, jak již bylo řečeno (viz. obr. výše), Clips vykoná nejprve to staré - resp. provede pravidlo pro počet 0 čtyřikrát (pro každé ovoce). Ale my chceme, aby Clips prošel každý druh ovoce právě jednou a ne několikrát (v případě počtu 1, počtu 2, počtu 3, … počtu n) !

Musíme tedy programu říci, aby to ovoce, které jsme již započítali, dále neuvažoval (nepracoval s nimi). Toto je zajištěno podmínkou: (not (ovoce_pripocitano ?x))

Ale to nestačí, musí nám docházet také k pravidelnému přičítání hodnot. Tedy co druh ovoce to daný počet zvýšený o jednotku. Zároveň také chceme, aby Clips jakoby postupoval od toho počtu, od jakého chceme. Tedy jestliže máme Jablko - tak počet se má zvýšit o jedna. V dalším kroku (při realizaci pravidla pocet podruhé) Jablko už uvažovat nebudeme (zajištěno podmínkou (not (ovoce_pripocitano ?x)) a zároveň chceme postupovat už od toho počtu 1 a ne od 0 (jak by Clips chtěl). Proto musíme přidat do podmínkové části pravidla pocet ještě jednu podmínku, která zajistí, abychom pokračovali od počtu o jednotku větší - tedy u Jablka od počtu 1 (a ne 0). Toto je řešeno podmínkou:

(not (pocet_jiz_pouzit ?y)).

Pokusila jsem se vysvětlit Vám tyto dvě podmínky ještě pomocí obrázku, doufám, že ne moc složitě.

Vysvětlení problému graficky

Tento problém lze řešit ještě jinou metodou a to pomocí příkazu retract. Nechci se zde o něm příliš dlouho rozepisovat, ale ve zkratce slouží k vymazání určitého faktu z báze faktů.

Možná řešení úlohy s ovocem (vyřešení zacyklení programu)

Verze č. 1:

Vy vlastně z báze můžete zrušit daný neaktuální počet - v bázi ho vůbec neudržovat

(stáhnout ovoce_pocty_2_retract.clp).

Verze č.2

… nebo neudržovat ani dané ovoce, ani daný počet v bázi faktů. Toto řešení ale není příliš chytré, protože dané ovoce Vám z báze zmizí. Sice si v Clipsu můžete vypsat, co v bázi bylo (tak jako to je řešeno v programu), ale reálnému uvažování člověka se to příliš nepodobá. To je jako byste zapomněli, co jste před chvílí počítali (jestliže se to týká např. ovoce, tak je to méně pravděpodobné).

(stáhnout ovoce_pocty_2_double_retract.clp).


^ Nahoru ^       Pokračování ==>


Validace

Valid XHTML 1.0 Strict

Valid CSS!

Monitoring webu