def to_z3(self, t: Z3Translator, new: bool = False) -> z3.ExprRef: # TODO: make this return Expr, not z3.ExprRef bs = t.bind(self.binder) with t.scope.in_scope(self.binder, bs): z3conjs = [] self.trackers = [] self.reverse_map: List[Tuple[_RelevantDecl, int]] = [] i = 0 for (d, j, c) in self.conjuncts(): p = z3.Bool('p%d' % i) self.trackers.append(p) self.reverse_map.append((d, j)) z3conjs.append(p == t.translate_expr(New(c) if new else c)) i += 1 if bs: return z3.Exists(bs, z3.And(*z3conjs)) else: return z3.And(*z3conjs)
def translate_transition_call(s: Solver, lator: translator.Z3Translator, state_index: int, c: syntax.TransitionCall) -> z3.ExprRef: prog = syntax.the_program ition = prog.scope.get_definition(c.target) assert ition is not None bs = lator.bind(ition.binder) qs: List[Optional[z3.ExprRef]] = [b for b in bs] if c.args is not None: for j, a in enumerate(c.args): if not isinstance(a, syntax.Star): bs[j] = lator.translate_expr(New(a, state_index)) qs[j] = None qs1 = [q for q in qs if q is not None] with lator.scope.in_scope(ition.binder, bs): body = lator.translate_expr( New(ition._framed_body(lator.scope), state_index)) if qs1: return z3.Exists(qs1, body) else: return body