expert-system/fact.py

67 lines
2.1 KiB
Python

import sys
from user import *
from lark import Tree
import config
def check_fact(key, state=False):
if (config.fact_dict.get(key) == None):
config.fact_dict[key] = Fact(state, key)
class Fact:
def __init__(self, state = False, key = 0, isset=False):
self.trees = list()
self.isset = isset
self.mutex_lock = 0
self.key = key
self.state = state
def check_fact(self,fact):
if (self.key == str(fact)):
return 1
def remove_tree(self, tree, idx, computer):
if (config.skip):
sys.exit('Conflict between rules')
choice = 'w'
st = ("<=>" if tree[2] else "=>") + ('!' if tree[1] else '') + self.key
while choice not in ['y', 'n']:
choice = input(str("There is an error in operation, would you like to remove this one ? {"
+ set_choices(tree[0]) + st+ "} y/n?\n"))
if (choice == 'n'):
sys.exit('Conflict between rules')
self.trees.pop(idx)
return self.get_state(computer)
def check_imply(self,tree):
ret = 0
if (isinstance(tree, Tree)):
fact = tree.find_data("query")
for truc in fact:
ret = self.check_fact(fact)
else:
ret = self.check_fact(tree)
return ret
def get_state(self, computer):
if (self.mutex_lock >= 2):
return self.state
self.mutex_lock += 1
config.glob = True
idx =0
for tree in self.trees:
is_set = self.isset is True or idx > 0
if (self.check_imply(tree[0]) and tree[1] is True):
return self.remove_tree(tree, idx, computer)
new_state = computer.apply_func(tree[0])
if new_state is False :
continue
new_state = False if tree[1] and new_state is True else True
if (tree[2] is False and is_set and new_state != self.state):
return self.remove_tree(tree, idx, computer)
self.state |= new_state
idx+=1
self.mutex_lock -= 1
return self.state