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.
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).
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ě.
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)).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ů.
… 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).