Stáhnout: 8.3_27.py   Zobrazit: duálně   8.3_27.pl

#!/usr/bin/env python
# encoding=utf-8 (pep 0263)

KNOWLEDGE_BASE=[
    # rules
    ('if',\
      ['mokra_chodba', 'and', 'sucha_kuchyn'],\
     'then',\
      'tece_v_koupelne'),

    ('if',\
      ['mokra_chodba', 'and', 'sucha_koupelna'],\
     'then',\
      'problem_v_kuchyni'),

    ('if',\
      ['okno_zavrene', 'or', 'neprsi'],\
     'then',\
      'nezatika_zvenci'),

    ('if',\
      ['problem_v_kuchyni', 'and', 'nezatika_zvenci'],\
     'then',\
      'tece_v_kuchyni'),

    # facts
    ('fact', 'mokra_chodba'),
    ('fact', 'sucha_koupelna'),
    ('fact', 'okno_zavrene'),
]

def forward():
    while True:
        p = new_derived_fact()
        if p is None:
            break
        print 'Derived: ', p
        KNOWLEDGE_BASE.insert(0, ('fact',p))
    print 'No more facts'
            
def new_derived_fact():
    for sentence in KNOWLEDGE_BASE:
        if sentence[0] != 'if':
            continue
        sent_type, condition, then, conclusion = sentence
        if ('fact',conclusion) not in KNOWLEDGE_BASE and composed_fact(condition):
            return conclusion
    
def composed_fact(cond):
    if type(cond) == list:
        cond1, operator, cond2 = cond
        if operator == 'and':
            return (composed_fact(cond1) and composed_fact(cond2))
        if operator == 'or':
            return (composed_fact(cond1) or composed_fact(cond2))
        return False
    return (('fact', cond) in KNOWLEDGE_BASE)

# demonstracni vypis
if __name__ == "__main__":
    forward()

 Stáhnout: 8.3_27.py   Zobrazit: duálně   8.3_27.pl