示例#1
0
def make_skolems(fmla, ast, pol, univs):
    global macro_dep_map
    global strat_map
    if isinstance(fmla, il.Not):
        make_skolems(fmla.args[0], ast, not pol, univs)
    if isinstance(fmla, il.Implies):
        make_skolems(fmla.args[0], ast, not pol, univs)
        make_skolems(fmla.args[1], ast, pol, univs)
    is_e = il.is_exists(fmla)
    is_a = il.is_forall(fmla)
    if is_e and pol or is_a and not pol:
        fvs = set(il.free_variables(fmla))
        for u in univs:
            if u in fvs:
                for e in il.quantifier_vars(fmla):
                    macro_dep_map[e].add(strat_map[u])
    if is_e and not pol or is_a and pol:
        make_skolems(fmla.args[0], ast, pol,
                     univs + list(il.quantifier_vars(fmla)))
    for arg in fmla.args:
        make_skolems(arg, ast, pol, univs)
    if isinstance(fmla, il.Ite):
        make_skolems(fmla.args[0], ast, not pol, univs)
    if isinstance(fmla, il.Iff) or (il.is_eq(fmla)
                                    and il.is_boolean(fmla.args[0])):
        make_skolems(fmla.args[0], ast, not pol, univs)
        make_skolems(fmla.args[1], ast, not pol, univs)
示例#2
0
文件: ivy_solver.py 项目: odedp/ivy
def formula_to_z3_int(fmla):
    #    print "formula_to_z3_int: {} : {}".format(fmla,type(fmla))
    if ivy_logic.is_atom(fmla):
        return atom_to_z3(fmla)
    if isinstance(fmla, ivy_logic.Definition) and ivy_logic.is_enumerated(fmla.args[0]) and not use_z3_enums:
        return encode_equality(*fmla.args)
    args = [formula_to_z3_int(arg) for arg in fmla.args]
    if isinstance(fmla, ivy_logic.And):
        return z3.And(args)
    if isinstance(fmla, ivy_logic.Or):
        return z3.Or(args)
    if isinstance(fmla, ivy_logic.Not):
        return z3.Not(args[0])
    if isinstance(fmla, ivy_logic.Definition):
        return my_eq(args[0], args[1])
    if isinstance(fmla, ivy_logic.Iff):
        return my_eq(args[0], args[1])
    if isinstance(fmla, ivy_logic.Implies):
        return z3.Implies(args[0], args[1])
    if isinstance(fmla, ivy_logic.Ite):
        return z3.If(args[0], args[1], args[2])
    if ivy_logic.is_quantifier(fmla):
        variables = ivy_logic.quantifier_vars(fmla)
        q = z3.ForAll if ivy_logic.is_forall(fmla) else z3.Exists
        res = q([term_to_z3(v) for v in variables], args[0])
        #        print "res = {}".format(res)
        return res
    if ivy_logic.is_individual(fmla):
        return term_to_z3(fmla)
    print "bad fmla: {!r}".format(fmla)
    assert False
示例#3
0
def formula_to_z3_int(fmla):
    #    print "formula_to_z3_int: {} : {}".format(fmla,type(fmla))
    if ivy_logic.is_atom(fmla):
        return atom_to_z3(fmla)
    if isinstance(fmla, ivy_logic.Definition) and ivy_logic.is_enumerated(
            fmla.args[0]):
        return encode_equality(*fmla.args)
    args = [formula_to_z3_int(arg) for arg in fmla.args]
    if isinstance(fmla, ivy_logic.And):
        return z3.And(args)
    if isinstance(fmla, ivy_logic.Or):
        return z3.Or(args)
    if isinstance(fmla, ivy_logic.Not):
        return z3.Not(args[0])
    if isinstance(fmla, ivy_logic.Definition):
        return my_eq(args[0], args[1])
    if isinstance(fmla, ivy_logic.Iff):
        return my_eq(args[0], args[1])
    if isinstance(fmla, ivy_logic.Implies):
        return z3.Implies(args[0], args[1])
    if isinstance(fmla, ivy_logic.Ite):
        return z3.If(args[0], args[1], args[2])
    if ivy_logic.is_quantifier(fmla):
        variables = ivy_logic.quantifier_vars(fmla)
        q = z3.forall if ivy_logic.is_forall(fmla) else z3.Exists
        res = q([term_to_z3(v) for v in variables], args[0])
        #        print "res = {}".format(res)
        return res
    if ivy_logic.is_individual(fmla):
        return term_to_z3(fmla)
    print "bad fmla: {!r}".format(fmla)
    assert False
示例#4
0
def get_qa_arcs(fmla,ast,pol,univs,strat_map):
    if isinstance(fmla,il.Not):
        for a in get_qa_arcs(fmla.args[0],ast,not pol,univs,strat_map):
            yield a
        return
    if isinstance(fmla,il.Implies):
        for a in get_qa_arcs(fmla.args[0],ast,not pol,univs,strat_map):
            yield a
        for a in get_qa_arcs(fmla.args[1],ast,pol,univs,strat_map):
            yield a
        return
    is_e = il.is_exists(fmla)
    is_a = il.is_forall(fmla)
    if is_e and pol or is_a and not pol:
        fvs = set(il.free_variables(fmla))
        for u in univs:
            if u in fvs:
                for e in il.quantifier_vars(fmla):
                    yield (find(strat_map[u]),find(strat_map[e]),ast)
    if is_e and not pol or is_a and pol:
        for a in get_qa_arcs(fmla.args[0],ast,pol,univs+list(il.quantifier_vars(fmla)),strat_map):
            yield a
    for arg in fmla.args:
        for a in get_qa_arcs(arg,ast,pol,univs,strat_map):
            yield a
    if isinstance(fmla,il.Ite):
        for a in get_qa_arcs(fmla.args[0],ast,not pol,univs,strat_map):
            yield a
    if isinstance(fmla,il.Iff) or (il.is_eq(fmla) and il.is_boolean(fmla.args[0])):
        for a in get_qa_arcs(fmla.args[0],ast,not pol,univs,strat_map):
            yield a
        for a in get_qa_arcs(fmla.args[1],ast,not pol,univs,strat_map):
            yield a
示例#5
0
文件: ivy_theory.py 项目: yotamfe/ivy
def get_qa_arcs(fmla,ast,pol,univs,strat_map):
    if isinstance(fmla,il.Not):
        for a in get_qa_arcs(fmla.args[0],ast,not pol,univs,strat_map):
            yield a
        return
    if isinstance(fmla,il.Implies):
        for a in get_qa_arcs(fmla.args[0],ast,not pol,univs,strat_map):
            yield a
        for a in get_qa_arcs(fmla.args[1],ast,pol,univs,strat_map):
            yield a
        return
    is_e = il.is_exists(fmla)
    is_a = il.is_forall(fmla)
    if is_e and pol or is_a and not pol:
        fvs = set(il.free_variables(fmla))
        for u in univs:
            if u in fvs:
                for e in il.quantifier_vars(fmla):
                    yield (find(strat_map[u]),find(strat_map[e]),ast)
    if is_e and not pol or is_a and pol:
        for a in get_qa_arcs(fmla.args[0],ast,pol,univs+list(il.quantifier_vars(fmla)),strat_map):
            yield a
    for arg in fmla.args:
        for a in get_qa_arcs(arg,ast,pol,univs,strat_map):
            yield a
    if isinstance(fmla,il.Ite):
        for a in get_qa_arcs(fmla.args[0],ast,not pol,univs,strat_map):
            yield a
    if isinstance(fmla,il.Iff) or (il.is_eq(fmla) and il.is_boolean(fmla.args[0])):
        for a in get_qa_arcs(fmla.args[0],ast,not pol,univs,strat_map):
            yield a
        for a in get_qa_arcs(fmla.args[1],ast,not pol,univs,strat_map):
            yield a
示例#6
0
文件: ivy_theory.py 项目: jamella/ivy
def get_qa_arcs(fmla,ast,pol,univs):
    if isinstance(fmla,il.Not):
        for a in get_qa_arcs(fmla.args[0],ast,not pol,univs):
            yield a
        return
    is_e = il.is_exists(fmla)
    is_a = il.is_forall(fmla)
    if is_e and pol or is_a and not pol:
        for u in univs:
            for e in il.quantifier_vars(fmla):
                yield (u.sort,e.sort,ast)
    if is_e and not pol or is_a and pol:
        for a in get_qa_arcs(fmla.args[0],ast,pol,univs+list(il.quantifier_vars(fmla))):
            yield a
    for arg in fmla.args:
        for a in get_qa_arcs(arg,ast,pol,univs):
            yield a
示例#7
0
    def qe(self,expr,sort_constants):
        if il.is_quantifier(expr):
            old = self.syms.get(expr,None)
            if old is not None:
                return old
            res = self.fresh(expr)
            consts = [sort_constants[x.sort] for x in expr.variables]
            values = itertools.product(*consts)
            maps = [dict(zip(expr.variables,v)) for v in values]
            insts = [normalize(il.substitute(expr.body,m)) for m in maps]
#            for i in insts:
#                print '    {}'.format(i)
            for inst in insts:
                c = il.Implies(res,inst) if il.is_forall(expr) else il.Implies(inst,res)
                self.fmlas.append(c)
            return res
        return clone_normal(expr,[self.qe(e,sort_constants) for e in expr.args])
示例#8
0
def get_qa_arcs(fmla, ast, pol, univs):
    if isinstance(fmla, il.Not):
        for a in get_qa_arcs(fmla.args[0], ast, not pol, univs):
            yield a
        return
    is_e = il.is_exists(fmla)
    is_a = il.is_forall(fmla)
    if is_e and pol or is_a and not pol:
        for u in univs:
            for e in il.quantifier_vars(fmla):
                yield (u.sort, e.sort, ast)
    if is_e and not pol or is_a and pol:
        for a in get_qa_arcs(fmla.args[0], ast, pol,
                             univs + list(il.quantifier_vars(fmla))):
            yield a
    for arg in fmla.args:
        for a in get_qa_arcs(arg, ast, pol, univs):
            yield a