(defrule vypis_vsechny_skupiny
(skupina ?nejaka)
Můžete si představit, že si inf. mech. vytvoří jakýsi seznam tvrzení, které podmínkové části pravidla vyhovují. (skupina A)
(skupina B)
(skupina 0)
(skupina AB).
Na základě toho si inf. mech. vytvoří množinu aktivovaných pravidel, těch jejichž podmínková část je splněna (to platí pro naše 4 fakty). Tato aktivovaná pravidla přidá do okna Agenda. Pak vybere první fakt z našeho imaginárního seznamu (např. skupina A) a pro něj vykoná usuzovací část pravidla. Dané pravidlo z Agendy zmizí. Dále vezme druhý fakt z imaginárního seznamu (skupina B) a i pro něj vykoná usuzovací část pravidla. A tak to jde do té doby, dokud se Agenda nevyprázdní - tedy již nebude moci být vykonáno žádné pravidlo. Záleží ovšem na strategii inf. mech., v jakém pořadí budou pravidla vykonávána. V našem případě, je zde zatím jen jedno pravidlo.
(deffacts osoby_a_krev
(osoba Jan 0)
(osoba Eva B)
(osoba Karel B)
(osoba Alzbeta 0)
)
(defrule vypis_zname_osoby
(osoba ?osobax ?krev)
=>
(printout t "Osoba:" ?osobax " " "ma krev:" ?krev crlf)
)
Za podmínky, že je evidována v bázi faktů nějaká osoba (?osobax) s určitou krví (?krev) pak tuto osobu (viz. usuzovací část pravidla) (?osobax) s její krví (?krev) vypiš. (POZOR na stejné názvy proměnných a stejný název relace osoba - tak jak je to uvedeno v bázi faktů - ve struktuře deffacts).
5/ Vypište jen ty osoby, které mají krev BZa podmínky, že existuje nějaká taková osoba (?nejakaosoba) s krví B, "pak" ji vypiš.
Můžete si představit, že slovíčko "pak" je vlastně oddělovač obou částí pravidla =>.
Všimněte si, že v programu v jednom pravidle užíváme název proměnné pro osobu: ?osobax a v jiném pravidle ?nejakaosoba. To je možné. Můžete používat různé názvy proměnných v různých pravidlech, ale v jednom pravidle musí být název proměnné v podmínkové části pro tu danou konkrétní proměnnou stejný jako v usuzovací části.
(defrule jen_osoba_s_AB
(osoba ?nejakaosubka AB)
=>
(printout t "Krevni skupinu AB ma:" ?nejakaosubka crlf)
)
(defrule osoba_s_AB_neni_evidovana
(not(osoba ?nejaka AB))
=>
(printout t "Zadna osoba s krvi AB neni v bazi definovana !!!" crlf)
)
V případě, že byste situaci neošetřili. Nic by se nestalo, ale je lepší dát uživateli vědět, že nic nebylo nalezeno. Představte, že byste měli jakési menu a z něj volili výpis všech osob s krevní skupinou AB, ale uživateli by se opět zobrazilo menu aniž by něco zjistil.
Využíváme zde podmínku s not. Jednoduše tím říkáme: za podmínky, že v bázi faktů neexistuje (to je to not) nějaká osoba s krevní skupinou AB, pak dejte uživateli vědět, že žádná taková osoba není v bázi definována. Not vlastně obalí celý výraz (osoba ?nejaka AB).