from naturalproofs.prover import NPSolver from naturalproofs.uct import fgsort, fgsetsort, intsort, intsetsort, boolsort, min_intsort, max_intsort from naturalproofs.decl_api import Const, Consts, Var, Vars, Function, RecFunction, AddRecDefinition, AddAxiom from naturalproofs.pfp import make_pfp_formula from lemsynth.lemsynth_engine import solveProblem def notInChildren(x): return And(Not(IsMember(x, htree(lft(x)))), Not(IsMember(x, htree(rght(x))))) # declarations x, y = Vars('x y', fgsort) nil, ret = Consts('nil ret', fgsort) lft = Function('lft', fgsort, fgsort) rght = Function('rght', fgsort, fgsort) tree = RecFunction('tree', fgsort, boolsort) htree = RecFunction('htree', fgsort, fgsetsort) reach_lr = RecFunction('reach_lr', fgsort, fgsort, boolsort) AddRecDefinition( tree, x, If( x == nil, True, And( notInChildren(x), And( SetIntersect(htree(lft(x)), htree(rght(x))) == fgsetsort.lattice_bottom,
import importlib_resources import z3 from z3 import And, Or, Not, Implies, If, Exists from z3 import IsSubset, IsMember, SetUnion, SetIntersect, SetComplement, EmptySet, SetAdd from naturalproofs.uct import fgsort, fgsetsort, intsort, intsetsort, boolsort from naturalproofs.decl_api import Const, Consts, Var, Vars, Function, RecFunction, AddRecDefinition, AddAxiom from naturalproofs.prover import NPSolver import naturalproofs.proveroptions as proveroptions from lemsynth.lemsynth_engine import solveProblem x, y, tx = Vars('x y tx', fgsort) hx = Var('hx', intsort) # ADT definition of lists nil = Const('nil', fgsort) cons = Function('cons', intsort, fgsort, fgsort) # projections for cons head = Function('head', fgsort, intsort) tail = Function('tail', fgsort, fgsort) # rec defs append = RecFunction('append', fgsort, fgsort, fgsort) length = RecFunction('length', fgsort, intsort) AddRecDefinition(append, (x, y), If(x == nil, y, cons(head(x), append(tail(x), y)))) AddRecDefinition(length, x, If(x == nil, 0, length(tail(x)) + 1))
import importlib_resources import z3 from z3 import And, Or, Not, Implies, If from z3 import IsSubset, Union, SetIntersect, SetComplement, EmptySet, SetAdd from naturalproofs.uct import fgsort, fgsetsort, intsort, intsetsort, boolsort from naturalproofs.decl_api import Const, Consts, Var, Vars, Function, RecFunction, AddRecDefinition, AddAxiom from naturalproofs.prover import NPSolver import naturalproofs.proveroptions as proveroptions from naturalproofs.pfp import make_pfp_formula from lemsynth.lemsynth_engine import solveProblem # declarations x, y, v, z = Vars('x y v z', fgsort) nil = Const('nil', fgsort) nxt = Function('nxt', fgsort, fgsort) lseg = RecFunction('lseg', fgsort, fgsort, boolsort) hlseg = RecFunction('hlseg', fgsort, fgsort, fgsort, boolsort) AddRecDefinition(lseg, (x, y), If(x == nil, False, If(nxt(x) == y, True, lseg(nxt(x), y)))) # v \in hlseg(x, y) AddRecDefinition(hlseg, (x, y, v), If(x == nil, False, If(v == x, True, hlseg(nxt(x), y, v)))) AddAxiom((), nxt(nil) == nil) # Uncomment this line for fixed_depth=1 mode # config_params['goal_instantiation_mode'] = proveroptions.fixed_depth # Default depth is 1
# hardcoded lemmas lemma_params = (x,y) lemma_body = Implies(bst(x), Implies(IsMember(y, hbst(x)), bst(y))) lemmas = {(lemma_params, lemma_body)} # check validity of lemmas solution = np_solver.solve(make_pfp_formula(lemma_body)) if not solution.if_sat: print('lemma is valid') else: print('lemma is invalid') # check validity with natural proof solver and hardcoded lemmas # TODO: lemmas not sufficient solution = np_solver.solve(goal, lemmas) if not solution.if_sat: print('goal (with lemmas) is valid') else: print('goal (with lemmas) is invalid') # lemma synthesis v1, v2 = Vars('v1 v2', fgsort) lemma_grammar_args = [v1, v2, k, nil] lemma_grammar_terms = {v1, v2, k} name = 'bst-maximal' grammar_string = importlib_resources.read_text('grammars', 'grammar_{}.sy'.format(name)) solveProblem(lemma_grammar_args, lemma_grammar_terms, goal, name, grammar_string)
import importlib_resources import z3 from z3 import And, Or, Not, Implies, If, Exists from z3 import IsSubset, IsMember, SetUnion, SetIntersect, SetComplement, EmptySet, SetAdd from naturalproofs.uct import fgsort, fgsetsort, intsort, intsetsort, boolsort from naturalproofs.decl_api import Const, Consts, Var, Vars, Function, RecFunction, AddRecDefinition, AddAxiom from naturalproofs.prover import NPSolver import naturalproofs.proveroptions as proveroptions from lemsynth.lemsynth_engine import solveProblem l, tl = Vars('l tl', fgsort) k, h = Consts('k h', intsort) x = Var('x', intsort) # ADT definition of lists nil = Const('nil', fgsort) cons = Function('cons', intsort, fgsort, fgsort) # projections for cons head = Function('head', fgsort, intsort) tail = Function('tail', fgsort, fgsort) # rec defs slst = RecFunction('slst', fgsort, boolsort) elems = RecFunction('elems', fgsort, fgsetsort) member = RecFunction('member', fgsort, boolsort) AddRecDefinition( slst, l,
from naturalproofs.prover import NPSolver from naturalproofs.uct import fgsort, fgsetsort, intsort, intsetsort, boolsort, min_intsort, max_intsort from naturalproofs.decl_api import Const, Consts, Var, Vars, Function, RecFunction, AddRecDefinition, AddAxiom from naturalproofs.pfp import make_pfp_formula from lemsynth.lemsynth_engine import solveProblem def notInChildren(x): return And(Not(IsMember(x, htree(lft(x)))), Not(IsMember(x, htree(rght(x))))) # declarations x, y = Vars('x y', fgsort) nil, ret = Consts('nil ret', fgsort) k = Const('k', intsort) key = Function('key', fgsort, intsort) lft = Function('lft', fgsort, fgsort) rght = Function('rght', fgsort, fgsort) tree = RecFunction('tree', fgsort, boolsort) dag = RecFunction('dag', fgsort, boolsort) maxheap = RecFunction('maxheap', fgsort, boolsort) htree = RecFunction('htree', fgsort, fgsetsort) AddRecDefinition( dag, x, If(x == nil, True, And(notInChildren(x), And(dag(lft(x)), dag(rght(x)))))) AddRecDefinition( maxheap, x, If(
import importlib_resources import z3 from z3 import And, Or, Not, Implies, If from z3 import IsSubset, Union, SetIntersect, SetComplement, EmptySet from naturalproofs.uct import fgsort, fgsetsort, intsort, intsetsort, boolsort from naturalproofs.decl_api import Const, Consts, Var, Vars, Function, RecFunction, AddRecDefinition, AddAxiom from lemsynth.lemsynth_engine import solveProblem # Declarations x, y, z = Vars('x y z', fgsort) c = Const('c', fgsort) nxt = Function('nxt', fgsort, fgsort) lseg = RecFunction('lseg', fgsort, fgsort, boolsort) AddRecDefinition(lseg, (x, y), If(x == y, True, lseg(nxt(x), y))) # Problem parameters goal = Implies(lseg(x, y), Implies(x != c, Implies(nxt(y) == z, lseg(x, z)))) # parameters representing the grammar for synth-fun and # terms on which finite model is extracted # TODO: extract this automatically from grammar_string v1, v2, v3 = Vars('v1 v2 v3', fgsort) lemma_grammar_args = [v1, v2, v3] lemma_grammar_terms = { nxt(v1), nxt(nxt(v1)), nxt(v2), nxt(nxt(v2)),
import importlib_resources import z3 from z3 import And, Or, Not, Implies, If, Exists from z3 import IsSubset, IsMember, SetUnion, SetIntersect, SetComplement, EmptySet, SetAdd from naturalproofs.uct import fgsort, fgsetsort, intsort, intsetsort, boolsort from naturalproofs.decl_api import Const, Consts, Var, Vars, Function, RecFunction, AddRecDefinition, AddAxiom from naturalproofs.prover import NPSolver import naturalproofs.proveroptions as proveroptions from lemsynth.lemsynth_engine import solveProblem x, y, nx, ny = Vars('x y nx ny', fgsort) # ADT definition of nats zero = Const('zero', fgsort) succ = Function('succ', fgsort, fgsort) # projection function - analogous to tail of list pred = Function('pred', fgsort, fgsort) # rec defs plus = RecFunction('plus', fgsort, fgsort, fgsort) AddRecDefinition(plus, (x, y), If(x == zero, y, succ(plus(pred(x), y)))) # axioms AddAxiom(x, pred(succ(x)) == x) AddAxiom(x, succ(x) != zero) goal = plus(x, y) == plus(y, x)
import importlib_resources import z3 from z3 import And, Or, Not, Implies, If from z3 import IsSubset, Union, SetIntersect, SetComplement, EmptySet from naturalproofs.uct import fgsort, fgsetsort, intsort, intsetsort, boolsort from naturalproofs.decl_api import Const, Consts, Var, Vars, Function, RecFunction, AddRecDefinition, AddAxiom from naturalproofs.prover import NPSolver import naturalproofs.proveroptions as proveroptions from naturalproofs.pfp import make_pfp_formula from lemsynth.lemsynth_engine import solveProblem # declarations x, y, z = Vars('x y z', fgsort) nil = Const('nil', fgsort) k = Const('k', intsort) nxt = Function('nxt', fgsort, fgsort) lst = RecFunction('lst', fgsort, boolsort) lseg = RecFunction('lseg', fgsort, fgsort, boolsort) key = Function('key', fgsort, intsort) AddRecDefinition(lst, x, If(x == nil, True, lst(nxt(x)))) AddRecDefinition(lseg, (x, y), If(x == y, True, lseg(nxt(x), y))) AddAxiom((), nxt(nil) == nil) # vc goal = Implies(lseg(x, y), Implies(And(key(x) != k, lseg(y, z)), lseg(x, z))) # check validity with natural proof solver and no hardcoded lemmas np_solver = NPSolver()