def solve(self, assumptions=None): res = None if assumptions is not None: bool_ass = [] other_ass = [] for x in assumptions: if x.is_literal(): bool_ass.append(self.converter.convert(x)) else: other_ass.append(x) if len(other_ass) > 0: self.push() self.add_assertion(self.mgr.And(other_ass)) self.pending_pop = True if len(bool_ass) > 0: res = mathsat.msat_solve_with_assumptions(self.msat_env, bool_ass) else: res = mathsat.msat_solve(self.msat_env) else: res = mathsat.msat_solve(self.msat_env) assert res in [mathsat.MSAT_UNKNOWN,mathsat.MSAT_SAT,mathsat.MSAT_UNSAT] if res == mathsat.MSAT_UNKNOWN: raise SolverReturnedUnknownResultError() return res == mathsat.MSAT_SAT
def _solve(self, assumptions=None): res = None n_ass = self._named_assertions() if n_ass is not None and len(n_ass) > 0: if assumptions is None: assumptions = n_ass else: assumptions += n_ass if assumptions is not None: bool_ass = [] other_ass = [] for x in assumptions: if x.is_literal(): bool_ass.append(self.converter.convert(x)) else: other_ass.append(x) if len(other_ass) > 0: self.push() self.add_assertion(self.mgr.And(other_ass)) self.pending_pop = True if len(bool_ass) > 0: res = mathsat.msat_solve_with_assumptions(self.msat_env(), bool_ass) else: res = mathsat.msat_solve(self.msat_env()) else: res = mathsat.msat_solve(self.msat_env()) assert res in [mathsat.MSAT_UNKNOWN,mathsat.MSAT_SAT,mathsat.MSAT_UNSAT] if res == mathsat.MSAT_UNKNOWN: raise SolverReturnedUnknownResultError return (res == mathsat.MSAT_SAT)
def sequence_interpolant(self, formulas): cfg, env = None, None try: self._check_logic(formulas) if len(formulas) < 2: raise Exception("interpolation needs at least 2 formulae") cfg = mathsat.msat_create_config() mathsat.msat_set_option(cfg, "interpolation", "true") if self.logic == QF_BV: mathsat.msat_set_option(cfg, "theory.bv.eager", "false") mathsat.msat_set_option(cfg, "theory.eq_propagaion", "false") env = mathsat.msat_create_env(cfg, self.msat_env()) groups = [] for f in formulas: f = self.converter.convert(f) g = mathsat.msat_create_itp_group(env) mathsat.msat_set_itp_group(env, g) groups.append(g) mathsat.msat_assert_formula(env, f) res = mathsat.msat_solve(env) if res == mathsat.MSAT_UNKNOWN: raise Exception("error in mathsat interpolation: %s" % mathsat.msat_last_error_message(env)) if res == mathsat.MSAT_SAT: return None pysmt_ret = [] for i in xrange(1, len(groups)): itp = mathsat.msat_get_interpolant(env, groups[:i]) f = self.converter.back(itp) pysmt_ret.append(f) return pysmt_ret finally: if cfg: mathsat.msat_destroy_config(cfg) if env: mathsat.msat_destroy_env(env)
def sequence_interpolant(self, formulas): cfg, env = None, None try: self._check_logic(formulas) if len(formulas) < 2: raise Exception("interpolation needs at least 2 formulae") cfg = mathsat.msat_create_config() mathsat.msat_set_option(cfg, "interpolation", "true") if self.logic == QF_BV: mathsat.msat_set_option(cfg, "theory.bv.eager", "false") mathsat.msat_set_option(cfg, "theory.eq_propagaion", "false") env = mathsat.msat_create_env(cfg, self.msat_env) groups = [] for f in formulas: f = self.converter.convert(f) g = mathsat.msat_create_itp_group(env) mathsat.msat_set_itp_group(env, g) groups.append(g) mathsat.msat_assert_formula(env, f) res = mathsat.msat_solve(env) if res == mathsat.MSAT_UNKNOWN: raise Exception("error in mathsat interpolation: %s" % mathsat.msat_last_error_message(env)) if res == mathsat.MSAT_SAT: return None pysmt_ret = [] for i in xrange(1, len(groups)): itp = mathsat.msat_get_interpolant(env, groups[:i]) f = self.converter.back(itp) pysmt_ret.append(f) return pysmt_ret finally: if cfg: mathsat.msat_destroy_config(cfg) if env: mathsat.msat_destroy_env(env)