def apply_match_func(match, func): sorts = func_sorts(func) sorts = [match.get(s, s) for s in sorts] return il.Symbol(func.name, sorts[0] if len(sorts) == 1 else il.FunctionSort(*sorts))
# # print clauses # print # z3_formula = clauses_to_z3(clauses) # print z3_formula # print # print # f = clauses_to_z3(ivy_logic.to_clauses("[[p()],[~p()]]")) # s = z3.Solver() # s.add(f) # print s.check() # should be unsat # f1 = clauses_to_z3(ivy_logic.to_clauses("[[p()]]")) # f2 = clauses_to_z3(ivy_logic.to_clauses("[[~p()]]")) # s = z3.Solver() # s.add(f1) # s.add(f2) # print s.check() # this is also unsat # ivy_logic.add_symbol('p',ivy_logic.RelationSort([ivy_logic.universe])) # cls = to_clauses("p(x) & ~p(y)") # print clauses_model_to_clauses(cls) s = ivy_logic.EnumeratedSort(["a", "b", "c"]) for c in s.defines(): t = add_symbol(c, s) ivy_logic.sig.constructors.add(t) add_symbol('f', ivy_logic.FunctionSort([ivy_logic.universe], s)) cls = to_clauses("f(x) = a & f(y) = b") print clauses_model_to_clauses(cls)
def get_function_sort(sig, args, rng, term=None): return ivy_logic.FunctionSort(*(get_arg_sorts(sig, args, term) + [rng])) if args else rng
def strip_sort(sort, strip_params): dom = list(sort.dom[len(strip_params):]) if dom or sort.is_relational(): return ivy_logic.FunctionSort(*(dom + [sort.rng])) return sort.rng