| /-! | |
| # Issue 3922 | |
| The `apply?` tactic would apply `symm` to every hypothesis in the local context, | |
| leading to these new hypotheses being included in the term even if they weren't used. | |
| They also created unelaboratable terms such as `?_ (id (r.symm h₂))`. | |
| -/ | |
| set_option linter.unusedVariables false | |
| -- set up a binary relation | |
| axiom r : Nat → Nat → Prop | |
| -- that is symmetric | |
| axiom r.symm {a b : Nat} : r a b → r b a | |
| -- and has some other property | |
| axiom r.trans {a b c : Nat} : r a b → r b c → r a c | |
| /-- | |
| info: Try this: | |
| [apply] refine r.symm ?_ | |
| -- Remaining subgoals: | |
| -- ⊢ r a c | |
| --- | |
| info: found a partial proof, but the corresponding tactic failed: | |
| (expose_names; refine r.trans ?_ ?_) | |
| It may be possible to correct this proof by adding type annotations, explicitly specifying implicit arguments, or eliminating unnecessary function abstractions. | |
| --- | |
| warning: declaration uses `sorry` | |
| -/ | |
| #guard_msgs (ordering := sorted) in | |
| example (a b c : Nat) (h₁ : r b a) (h₂ : r b c) : r c a := by | |
| apply? | |
| -- now attach the `symm` attribute to `r.symm` | |
| attribute [symm] r.symm | |
| /-- | |
| info: Try this: | |
| [apply] exact r.trans (id (r.symm h₂)) h₁ | |
| -/ | |
| #guard_msgs in | |
| example (a b c : Nat) (h₁ : r b a) (h₂ : r b c) : r c a := by | |
| apply? |