def _simplify(cls, invs, is_conj, use_reals): assert invs, invs st = time() eqts, eqts_largecoefs, octs, mps, preposts, falseinvs = \ cls.classify(invs) def mysorted(ps): return sorted(ps, key=lambda p: len(Miscs.get_vars(p.inv))) eqts = mysorted(eqts + eqts_largecoefs) octs = mysorted(octs) mps = mysorted(mps) myinvs = eqts + falseinvs + preposts + octs + mps myinvs_exprs = [inv.expr(use_reals) for inv in myinvs] def _imply(js, i): iexpr = myinvs_exprs[i] # don't consider/remove equality if iexpr.decl().kind() == z3.Z3_OP_EQ: ret = False else: jexprs = [myinvs_exprs[j] for j in js] ret = Z3._imply(jexprs, iexpr, is_conj) # if ret: # print '{} => {}'.format(jexprs, iexpr) return ret results = Miscs.simplify_idxs(list(range(len(myinvs))), _imply) results = [myinvs[i] for i in results] Miscs.show_removed('_simplify', len(invs), len(results), time() - st) return results
def get_conj_preconds(self, loc, preconds, postcond_expr): """ preconds => post can be strengthened by removing some preconds e.g., a&b => post is stronger than a&b&c => post """ assert all(isinstance(p, Inv) for p in preconds), preconds assert z3.is_expr(postcond_expr), postcond_expr if not preconds: return [] preconds = sorted(preconds, key=lambda p: len(Miscs.get_vars(p.inv))) preconds_exprs = [pc.expr(self.use_reals) for pc in preconds] if not self.check(preconds_exprs, postcond_expr, loc): return [] def _imply(js, _): jexprs = [preconds_exprs[j] for j in js] return self.check(jexprs, postcond_expr, loc) results = Miscs.simplify_idxs(list(range(len(preconds))), _imply) results = [preconds[i] for i in results] return results