67 lines
2.1 KiB
Python
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
|