| /-! | |
| # Tests of the `unfold` tactic | |
| -/ | |
| /-! | |
| Tests adapted from mathlib's `unfold_let` tactic | |
| -/ | |
| example : let x := 1; let y := 2; x + y = y + x := by | |
| intro x y | |
| unfold x | |
| guard_target =ₛ 1 + y = y + 1 | |
| let z := 3 | |
| have h : z - 3 = 0 := rfl | |
| unfold z at h | |
| guard_hyp h :ₛ 3 - 3 = 0 | |
| unfold y | |
| guard_target =ₛ 1 + 2 = 2 + 1 | |
| rfl | |
| example : let x := 1; let y := 2; x + y = y + x := by | |
| intro x y | |
| unfold x y | |
| guard_target =ₛ 1 + 2 = 2 + 1 | |
| rfl | |
| example : let x := 1; let y := 2 + x; y = 3 := by | |
| intro x y | |
| unfold y | |
| guard_target =ₛ 2 + x = 3 | |
| unfold x | |
| guard_target =ₛ 2 + 1 = 3 | |
| rfl | |
| example : let x := 1; let y := 2 + x; y = 3 := by | |
| intro x y | |
| fail_if_success unfold x y -- wrong order | |
| unfold y x | |
| guard_target =ₛ 2 + 1 = 3 | |
| rfl | |
| /-! | |
| Do not reorder hypotheses. (`unfold` makes a change) | |
| -/ | |
| set_option linter.unusedVariables false in | |
| example : let ty := Int; ty → Nat → Nat := by | |
| intro ty a a | |
| unfold ty at * | |
| exact a | |
| /-! | |
| Beta reduction of unfolded local functions | |
| -/ | |
| example : True := by | |
| let f (x y : Nat) := x + y | |
| have : f 1 2 = 3 := by | |
| unfold f | |
| guard_target =ₛ 1 + 2 = 3 | |
| rfl | |
| trivial | |
| /-! | |
| Nothing to unfold | |
| -/ | |
| /-- | |
| error: Tactic `unfold` failed to unfold `id` in | |
| True | |
| -/ | |
| #guard_msgs in | |
| example : True := by | |
| unfold id | |
| /-- | |
| error: Tactic `unfold` failed to unfold `x` in | |
| True | |
| -/ | |
| #guard_msgs in | |
| example : True := by | |
| let x := 2 | |
| unfold x | |
| /-! | |
| Conv tactic | |
| -/ | |
| example (h : False) : id true = false := by | |
| conv => unfold id | |
| guard_target =ₛ true = false | |
| exact h.elim | |
| example : let x := 1; let y := 2; x + y = y + x := by | |
| intro x y | |
| conv => unfold x | |
| guard_target =ₛ 1 + y = y + 1 | |
| rfl | |
| /-! | |
| Error: not a local definition | |
| -/ | |
| /-- error: Tactic `unfold` failed: Local variable `x` has no definition -/ | |
| #guard_msgs in example (x : Nat) : x + 1 = 1 := by | |
| unfold x | |
| /-- error: conv tactic `unfold` failed, local variable `x` has no definition -/ | |
| #guard_msgs in example (x : Nat) : x + 1 = 1 := by | |
| conv => unfold x |