Пример #1
0
    def solve_safety_inc_bwd(self, hts, prop, k, assert_property=False, generalize=None):
        solver = self.solver.copy("inc_bwd")

        self._reset_assertions(solver)

        has_next = TS.has_next(prop)

        if has_next:
            prop = TS.to_prev(prop)

        init = hts.single_init()
        trans = hts.single_trans()
        invar = hts.single_invar()

        formula = self.at_ptime(And(Not(prop), invar), -1)
        Logger.log("Add not property at time %d"%0, 2)
        self._add_assertion(solver, formula)

        skip_push = False
        constraints = TRUE()

        models = 0

        t = 0
        k_min = 1 if has_next else 0
        while (t < k+1):
            if not skip_push:
                self._push(solver)
                skip_push = False

            if not skip_push:
                pinit = self.at_ptime(init, t-1)
                Logger.log("Add init at time %d"%t, 2)
                self._add_assertion(solver, pinit)

            if constraints != TRUE():
                for j in range(t+1):
                    self._add_assertion(solver, self.at_ptime(constraints, j-1), "Addditional Constraints")

            if self.preferred is not None:
                try:
                    for (var, val) in self.preferred:
                        solver.solver.set_preferred_var(TS.get_timed(var, t), val)
                except:
                    Logger.warning("Current solver does not support preferred variables")
                    self.preferred = None

            if (t >= k_min) and self._solve(solver):
                Logger.log("Counterexample found with k=%s"%(t), 1)
                model = self._get_model(solver)
                models += 1

                if models > 20:
                    Logger.msg("R", 0, not(Logger.level(1)))
                    self._reset_solver(solver)
                    models = 0

                if generalize is not None:
                    constr, res = generalize(model, t)
                    if res:
                        return (t, model)
                    constraints = And(constraints, Not(constr))
                    skip_push = True
                    continue
                else:
                    return (t, model)
            else:
                Logger.log("No counterexample found with k=%s"%(t), 1)
                Logger.msg(".", 0, not(Logger.level(1)))

            self._pop(solver)
            skip_push = False

            trans_t = self.unroll(trans, invar, t, t+1)
            self._add_assertion(solver, trans_t)

            if assert_property and t > 0:
                prop_t = self.unroll(TRUE(), prop, t-1, t)
                self._add_assertion(solver, prop_t)

                Logger.log("Add property at time %d"%t, 2)

            t += 1

        return (t-1, None)
Пример #2
0
 def Prev(self, x):
     return TS.to_prev(x)