27 lines
848 B
Text
27 lines
848 B
Text
import Lean
|
||
|
||
open Lean Elab Tactic in
|
||
elab "revert_all" : tactic => do
|
||
liftMetaTactic1 (·.revertAll)
|
||
|
||
open Lean Elab Tactic in
|
||
elab "ensure_no_mvar" : tactic => do
|
||
liftMetaTactic1 fun mvarId => do
|
||
mvarId.ensureNoMVar
|
||
return mvarId
|
||
|
||
example {α : Type u} [Inhabited α] (a : α) (f : α → α) (h : f a = default) : default = f a := by
|
||
revert_all
|
||
ensure_no_mvar
|
||
guard_target =ₛ∀ {α : Type u} [inst : Inhabited α] (a : α) (f : α → α), f a = default → default = f a
|
||
intro α inst a f h
|
||
exact h.symm
|
||
|
||
example (a b : α) (h₁ : a = b) (f g : α → α) (h₂ : ∀ x, f x = x) (h₃ : ∀ x, g x = f x) : ∃ x : α, f x = a ∧ g x = b := by
|
||
apply Exists.intro
|
||
revert_all
|
||
fail_if_success ensure_no_mvar
|
||
intro β a₁ a₂ h f₁ f₂ h' h''
|
||
constructor
|
||
· exact h' a₁
|
||
· rw [h'', h]; exact h' a₂
|