expert-system/InferenceEngine.py

61 lines
2.2 KiB
Python

from fact import Fact, check_fact
from user import *
from Ft_op import Ft_op
from config import *
import config
@v_args(inline=True) # Affects the signatures of the methods
class InferenceEngine(Transformer):
def iter_subtree(self, fact_tree):
for fact in fact_tree.children:
self.set_fact(str(fact))
def set_fact(self, *string):
for letter in string:
self.assign_var(letter, True)
def print_state(self, string):
for letter in string:
print(letter, '=', self.var(letter))
def apply_func(self, tree):
if (isinstance(tree, Tree) == False):
return self.var(str(tree))
else:
return getattr(Ft_op, tree.data)(self.apply_func(tree.children[0]),
self.apply_func(tree.children[1] if len(tree.children) > 1 else 0))
def assign_var(self, name, state):
config.fact_dict[name] = Fact(state=state, key=name, isset=True)
return state
def var(self, name):
if (config.glob != True):
return name
if (config.fact_dict.get(name) == None):
config.fact_dict[name] = Fact(key=name)
return config.fact_dict[name].get_state(self)
def set_state(self, tree, op_tree, is_not=False, is_iff=False):
if (isinstance(tree, Tree) == False):
check_fact(str(tree))
config.fact_dict[str(tree)].trees.append((op_tree, is_not, is_iff))
elif (tree.data == 'ft_and'):
self.set_state(tree.children[0], op_tree, is_not, is_iff)
self.set_state(tree.children[1], op_tree, is_not, is_iff)
elif (tree.data == 'ft_not'):
self.set_state(tree.children[0], op_tree, not is_not)
elif (tree.data == 'ft_or'):
choice = ask_or(tree)
if (choice is 2):
self.set_state(tree.children[0], op_tree, is_not, is_iff)
self.set_state(tree.children[1], op_tree, is_not, is_iff)
else:
self.set_state(tree.children[choice], op_tree, is_not, is_iff)
elif (tree.data == 'ft_xor'):
choice = ask_xor(tree)
self.set_state(tree.children[choice], op_tree, False, is_iff)
self.set_state(tree.children[not choice], op_tree, True, is_iff)