Baktérie je možné klasifikovat pomocí několika charakteristik, jako je základní tvar (kulička, tyčinka, vlákno, spirála), výsledek laboratorního testu (pozitivní, negativní) a jestli potřebují ke svému přežití kyslík (aerobní=potřebují nebo anaerobní=nepotřebují). Napište program, který identifikuje bakterii na základě informací v níže uvedené tabulce. Program se uživatele zeptá na tvar, výsledek laboratorního testu a potřebnost kyslíku pro bakterii.
Typ | Tvar | Laboratorní test | Nároky na kyslík |
actinomyceta | tyčinka NEBO vlákno | pozitivní | aerobní |
kok | kulička | pozitivní | aerobní A anaerobni |
corynebakterie | tyčinka | pozitivní | aerobní |
endospora | tyčinka | pozitivní NEBO negativní | aerobní A anaerobní |
střební baktérie | tyčinka | negativní | aerobní |
plísňová bakterie | kulička | žádný | aerobní |
mycoplazma | kulička | žádný | aerobní |
pseudomonáda | tyčinka | negativní | aerobní |
rickettsia | kulička NEBO tyčinka | negativní | aerobní |
zapouzdřilka | vlákno | negativní | aerobní |
spirila | spirála | negativní | aerobní |
spirocheta> | spirála | negativní | anaerobní |
vibria | tyčinka | negativní | aerobní |
(defrule vyhledej_bakterii
(hledana_bakterie (tvar $?tvarmuj) (lab_test ?testmuj) (kyslik $?kyslikmuj))
(bakterie (nazev ?jmeno) (tvar $?t & :(subsetp $?tvarmuj $?t)) (lab_test $?lt & :(member$ ?testmuj $?lt))
(kyslik $?k & :(subsetp $?kyslikmuj $?k) & :(subsetp $?k $?kyslikmuj)))
=>
(printout t "Vasim pozadavkum vyhovuje bakterie:" ?jmeno crlf))
1. podmínka: soubor požadavků uživatele
***(tvar $?t & :(subsetp $?tvarmuj $?t)) (lab_test $?lt & :(member$ ?testmuj $?lt))
Tato část druhé podmínky využívá příkazu jak subsetp tak member. Musíme se řídit tím, jestli je pro daný tvar možné definovat logickou spojku "NEBO" či "A". Ve sloupci pro tvar vidíme, že se jedná o spojku "NEBO". Tedy budeme vyhledávat seznam v seznamu (příkaz subsetp). Totéž platí i pro laboratorní test s tím rozdílem, že test je definován jako slot - kvůli jednoznačnosti lab. testů.
***(kyslik $?k & :(subsetp $?kyslikmuj $?k) & :(subsetp $?k $?kyslikmuj)
Část 2. podmínky, týkající se kyslíku, je složitější. Pro kyslík u některých baktérií platí logická spojka "A".
(kyslik $?k & :(subsetp $?kyslikmuj $?k)
: musíme také zajistit, aby se nám vyhledával seznam v seznamu.
Např. uživatel zadá: (aerobní) - pak má být vybrána např. baktérie actinomyceta (ta vybrána bude - to zajistíme právě touto částí podmínky).
Jak ale zajistit, aby nebyla vybrána např. baktérie kok? To je docíleno druhou části kódu:
(subsetp $?k $?kyslikmuj)
.
Zde na to jdeme opačně než u první části 2. podmínky pro kyslík. Seznam s informacemi o kyslíku, který je napevno definován v bázi faktů, musíme porovnat se seznamem od uživatele (s jeho požadavky na baktérii). U baktérie kok to bude takto: vezmeme si seznam pro kyslik - z báze faktů (zde je aerobni A anaerobni) a tento seznam ma byt podmnozinou a to seznamu od uzivatele. Ale při zadání vlastnosti aerobni tomu díky této části podmínky není. (aerobni anaerobni) --> není podmnožinou (aerobni). Navíc je zde vlastnost anaerobni. Proto nebude vybrána baktérie s názvem kok.