def baseoperationVisit(self, baseop): #TODO should go deeper. if issubclass(baseop.op, Lazy): return z3.Bool("bool!" + str(baseop.dimacs_var)) else: #print(baseop.args) res = [] blasted = baseop.op.apply(self.solver, *baseop.args) return retvisit(self,blasted) #TODO CLEAN #print(blasted) subargs = [] for i in blasted: subargs.append(retvisit(self, i)) return z3.And(subargs) sys.exit() flag = False for arg in blasted: subres = [] for subarg in arg: if isinstance(subarg, BoolConst): if subarg.val: flag = True break else: continue if subarg < 0: subres.append(z3.Not(z3.Bool(str(-subarg)))) else: subres.append(z3.Bool(str(subarg))) if flag: flag = False continue res.append(z3.Or(subres)) return z3.And(res)
def programVisit(self, program): res = [retvisit(self, i) for i in self.solver.instantiate_graph_constraints] for i in program.ast: val = retvisit(self, i) if val: res.append(val) expr = z3.And(res) goal = z3.Goal() goal.add(expr) tactic = z3.Tactic("tseitin-cnf") prog = tactic(goal)[0] return self.parse_Z3_tseitin(prog)
def opVisit(self, op): name = op.ID.ID res = [] for i in op.args: res.append(retvisit(self, i)) if name == "and": return z3.And(res) elif name == "or": return z3.Or(res) elif name == "not": return z3.Not(res[0])
def assertVisit(self, a): return retvisit(self, a.expr)