Example #1
0
def assert_any_transition(s: Solver,
                          t: Z3Translator,
                          state_index: int,
                          allow_stutter: bool = False) -> None:
    prog = syntax.the_program
    uid = str(state_index)

    tids = []
    for transition in prog.transitions():
        tid = z3.Bool(get_transition_indicator(uid, transition.name))
        tids.append(tid)
        s.add(
            z3.Implies(
                tid,
                t.translate_expr(
                    New(transition.as_twostate_formula(prog.scope),
                        state_index))))

    if allow_stutter:
        tid = z3.Bool(get_transition_indicator(uid, '$stutter'))
        tids.append(tid)
        frame = syntax.And(*DefinitionDecl._frame(prog.scope, mods=()))
        s.add(z3.Implies(tid, t.translate_expr(New(frame, state_index))))

    s.add(z3.Or(*tids))
Example #2
0
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
Example #3
0
 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)