def get_proof_term(self, t): if not t.is_comb(): return refl(t) f, c = t.fun, t.arg if is_fun_upd(f): f1, a, b = f.args if a == c: return rewr_conv("fun_upd_same").get_proof_term(t) else: neq = nat.nat_const_ineq(c, a) eq = rewr_conv("fun_upd_other", conds=[neq]).get_proof_term(t) return eq.on_arg(self) elif f.is_abs(): return ProofTerm.beta_conv(t) else: return refl(t)
def rec(t): if t.is_abs(): v, body = t.dest_abs() body_pt = rec(body) if body_pt.is_reflexive(): return refl(t) else: return body_pt.abstraction(v) elif t.is_comb(): fun_pt = rec(t.fun) arg_pt = rec(t.arg) pt = fun_pt.combination(arg_pt) if fun_pt.rhs.is_abs(): pt2 = ProofTerm.beta_conv(pt.rhs) pt3 = rec(pt2.rhs) return pt.transitive(pt2, pt3) else: return pt else: return refl(t)
def get_proof_term(self, t): try: return ProofTerm.beta_conv(t) except InvalidDerivationException: raise ConvException("beta_conv")