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)
def Prev(self, x): return TS.to_prev(x)