def apply_to_pt(self, thy, pt, pos=None): """Apply to the given proof term.""" # First, handle some position instructions if pos == "arg": return arg_conv(self).apply_to_pt(thy, pt) elif pos == "assums": return assums_conv(self).apply_to_pt(thy, pt) eq_pt = self.get_proof_term(thy, pt.prop) return ProofTerm.equal_elim(eq_pt, pt)
def get_proof_term(self, thy, args, pts): assert isinstance(args, tuple) and len(args) == 2 and \ isinstance(args[0], str) and isinstance(args[1], Term), "rewrite_goal_macro: signature" name, goal = args eq_pt = ProofTerm.theorem(thy, name) if self.backward: eq_pt = ProofTerm.symmetric(eq_pt) cv = then_conv(top_conv(rewr_conv(eq_pt)), top_conv(beta_conv())) pt = cv.get_proof_term(thy, goal) # goal = th.prop pt = ProofTerm.symmetric(pt) # th.prop = goal if Term.is_equals(pt.prop.lhs) and pt.prop.lhs.lhs == pt.prop.lhs.rhs: pt = ProofTerm.equal_elim(pt, ProofTerm.reflexive(pt.prop.lhs.lhs)) else: pt = ProofTerm.equal_elim(pt, pts[0]) # goal pts = pts[1:] for A in pts: pt = ProofTerm.implies_elim(ProofTerm.implies_intr(A.prop, pt), A) return pt
def get_proof_term(self, thy, args, pts): assert isinstance(args, Term), "rewrite_goal_macro: signature" goal = args eq_pt = pts[0] pts = pts[1:] if self.backward: eq_pt = ProofTerm.symmetric(eq_pt) cv = then_conv(top_sweep_conv(rewr_conv(eq_pt, match_vars=False)), top_conv(beta_conv())) pt = cv.get_proof_term(thy, goal) # goal = th.prop pt = ProofTerm.symmetric(pt) # th.prop = goal if Term.is_equals(pt.prop.lhs) and pt.prop.lhs.lhs == pt.prop.lhs.rhs: pt = ProofTerm.equal_elim(pt, ProofTerm.reflexive(pt.prop.lhs.rhs)) else: pt = ProofTerm.equal_elim(pt, pts[0]) pts = pts[1:] for A in pts: pt = ProofTerm.implies_elim(ProofTerm.implies_intr(A.prop, pt), A) return pt