Parameter constraints
This commit is contained in:
@@ -2,3 +2,4 @@ from logics.rsltl import Formula_rsLTL
|
||||
from logics.bags import BagDescription
|
||||
from logics.param_constr import ParamConstraint
|
||||
from logics.rsltl_encoder import rsLTL_Encoder
|
||||
from logics.param_constr_encoder import ParamConstr_Encoder
|
||||
@@ -49,7 +49,7 @@ class ParamConstraint(object):
|
||||
|
||||
@classmethod
|
||||
def f_param_ent(cls, param, entity_name):
|
||||
return cls(ParamConstraint_oper.entity, param=param, entity=entity_name)
|
||||
return cls(ParamConstraint_oper.param_entity, param=param, entity=entity_name)
|
||||
|
||||
@classmethod
|
||||
def f_TRUE(cls):
|
||||
|
||||
59
logics/param_constr_encoder.py
Normal file
59
logics/param_constr_encoder.py
Normal file
@@ -0,0 +1,59 @@
|
||||
from logics.param_constr import *
|
||||
from z3 import And, Not, Or
|
||||
|
||||
class ParamConstr_Encoder(object):
|
||||
"""Class for encoding parameter constraints"""
|
||||
|
||||
def __init__(self, smt_checker):
|
||||
self.smt_checker = smt_checker
|
||||
self.rs = smt_checker.rs
|
||||
|
||||
# self.v = None
|
||||
# self.v_ctx = None
|
||||
# self.loop_position = None
|
||||
|
||||
def load_variables(self, var_rs, var_ctx, var_loop_pos):
|
||||
|
||||
self.v = var_rs
|
||||
self.v_ctx = var_ctx
|
||||
self.loop_position = var_loop_pos
|
||||
|
||||
def encode(self, param_constr):
|
||||
|
||||
if not param_constr:
|
||||
raise RuntimeError("param_constr is None")
|
||||
|
||||
if param_constr.f_type == ParamConstraint_oper.param_entity:
|
||||
return self.smt_checker.get_enc_param(param_constr.param.name, param_constr.entity)
|
||||
|
||||
if param_constr.f_type == ParamConstraint_oper.true:
|
||||
return True
|
||||
|
||||
if param_constr.f_type == ParamConstraint_oper.l_and:
|
||||
return And(self.encode(param_constr.left_operand),
|
||||
self.encode(param_constr.right_operand))
|
||||
|
||||
if param_constr.f_type == ParamConstraint_oper.l_or:
|
||||
return Or(self.encode(param_constr.left_operand),
|
||||
self.encode(param_constr.right_operand))
|
||||
|
||||
if param_constr.f_type == ParamConstraint_oper.l_not:
|
||||
return Not(self.encode(param_constr.left_operand))
|
||||
|
||||
if param_constr.f_type == ParamConstraint_oper.lt:
|
||||
return self.encode(param_constr.left_operand) < int(param_constr.right_operand)
|
||||
|
||||
if param_constr.f_type == ParamConstraint_oper.le:
|
||||
return self.encode(param_constr.left_operand) <= int(param_constr.right_operand)
|
||||
|
||||
if param_constr.f_type == ParamConstraint_oper.eq:
|
||||
return self.encode(param_constr.left_operand) == int(param_constr.right_operand)
|
||||
|
||||
if param_constr.f_type == ParamConstraint_oper.ge:
|
||||
return self.encode(param_constr.left_operand) >= int(param_constr.right_operand)
|
||||
|
||||
if param_constr.f_type == ParamConstraint_oper.gt:
|
||||
return self.encode(param_constr.left_operand) > int(param_constr.right_operand)
|
||||
|
||||
assert False, "Unsupported case {:s}".format(param_constr.f_type)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from logics.rsltl import *
|
||||
|
||||
def simplify(x):
|
||||
return x
|
||||
return x
|
||||
|
||||
class rsLTL_Encoder(object):
|
||||
"""Class for encoding rsLTL formulae for a given smt_checker instance"""
|
||||
|
||||
Reference in New Issue
Block a user