| opaque f : Nat → Nat | |
| opaque g : Nat → Nat | |
| namespace Foo | |
| @[scoped simp] axiom ax1 (x : Nat) : f (g x) = x | |
| @[scoped simp] axiom ax2 (x : Nat) : g (g x) = g x | |
| end Foo | |
| theorem ex1 : f (g (g (g x))) = x := by | |
| fail_if_success simp -- does not use ax1 and ax2 | |
| simp [Foo.ax1, Foo.ax2] | |
| theorem ex2 : f (g (g (g x))) = x := | |
| have h₁ : f (g (g (g x))) = f (g x) := by | |
| fail_if_success simp | |
| /- try again with `Foo` scoped lemmas -/ | |
| open Foo in simp | |
| have h₂ : f (g x) = x := by | |
| fail_if_success simp | |
| open Foo in simp | |
| Eq.trans h₁ h₂ | |
| -- open Foo in simp -- works | |
| theorem ex3 : f (g (g (g x))) = x := by | |
| fail_if_success simp | |
| simp [Foo.ax1, Foo.ax2] | |
| open Foo in | |
| theorem ex4 : f (g (g (g x))) = x := by | |
| simp | |
| theorem ex5 : f (g (g (g x))) = x ∧ f (g x) = x := by | |
| apply And.intro | |
| { fail_if_success simp | |
| open Foo in simp } | |
| { fail_if_success simp | |
| open Foo in simp } |