lean4-htt/tests/lean/run/unfoldTactic.lean
Kyle Miller fa711253d6
feat: improved error message for unfold (#5815)
When `unfold` is trying to unfold a local variable that's not a local
definition, throws an error.

For issue from
[Zulip](https://leanprover.zulipchat.com/#narrow/channel/270676-lean4/topic/Unqualified.20unfold.20no.20longer.20works/near/478387250)
2024-10-23 03:35:15 +00:00

107 lines
2 KiB
Text

/-!
# 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' at
True
-/
#guard_msgs in
example : True := by
unfold id
/--
error: tactic 'unfold' failed to unfold 'x' at
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