#!/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()