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
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)
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
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
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
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