61 lines
2.2 KiB
Python
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)
|