예제 #1
0
파일: invs.py 프로젝트: ruricolist/dig
    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
예제 #2
0
    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