def rec(goal, res): defns = goal_defns(goal) with il.BindSymbols(bound, defns): for x in goal_prem_goals(goal): if isinstance(x.formula, ia.SchemaBody): rec(x, res) else: rec_fmla(x.formula, res) rec_fmla(goal_conc(goal), res)
def apply_match_rec(match,fmla,env): args = [apply_match_rec(match,f,env) for f in fmla.args] if il.is_app(fmla): if fmla.rep in match: func = match[fmla.rep] return func(*args) return apply_match_func(match,fmla.rep)(*args) if il.is_variable(fmla) and fmla in match: return match[fmla] if il.is_binder(fmla): with il.BindSymbols(env,fmla.variables): fmla = fmla.clone_binder([apply_match_rec(match,v,env) for v in fmla.variables],args[0]) return fmla return fmla.clone(args)
def apply_match_goal(match,x,apply_match,env = None): """ Apply a match to a goal """ env = env if env is not None else set() if isinstance(x,ia.LabeledFormula): fmla = x.formula if isinstance(fmla,ia.SchemaBody): bound = [s for s in goal_defns(x) if s not in match] with il.BindSymbols(env,bound): fmla = fmla.clone([apply_match_goal(match,y,apply_match,env) for y in fmla.prems()]+[apply_match(match,fmla.conc(),env)]) else: fmla = apply_match(match,fmla,env) g = x.clone([x.label,fmla]) return g if isinstance(x,il.UninterpretedSort): return apply_match_sort(match,x) else: return x.clone([apply_match_func_alt(match,x.args[0],env)])
def apply_match_alt_rec(match,fmla,env): args = [apply_match_alt_rec(match,f,env) for f in fmla.args] if il.is_app(fmla): if fmla.rep in match: return apply_fun(match_get(match,fmla.rep,env),args) func = apply_match_func(match,fmla.rep) func = match_get(match,func,env,func) return func(*args) if il.is_variable(fmla): if fmla in match: return match_get(match,fmla,env) fmla = il.Variable(fmla.name,apply_match_sort(match,fmla.sort)) fmla = match_get(match,fmla,env,fmla) return fmla if il.is_binder(fmla): with il.BindSymbols(env,fmla.variables): fmla = fmla.clone_binder([apply_match_alt_rec(match,v,env) for v in fmla.variables],args[0]) return fmla return fmla.clone(args)