154 lines
2.8 KiB
Text
154 lines
2.8 KiB
Text
/-!
|
||
# `clear` in conversion mode
|
||
|
||
Tests the functionality of the `clear` command in conversion mode (i.e., that it clears the
|
||
specified hypotheses in the appropriate scope provided they have no dependents in the current
|
||
proof state).
|
||
-/
|
||
|
||
/- Test basic `clear` functionality: that it correctly removes hypotheses, that removals persist
|
||
after focusing a subterm, and that removals do not propagate beyond the `conv` block -/
|
||
/--
|
||
trace: α : Type
|
||
x y z : α
|
||
h₂ : y = z
|
||
| x = y ∧ y = z
|
||
---
|
||
trace: α : Type
|
||
x y z : α
|
||
| x = y
|
||
---
|
||
trace: α : Type
|
||
x y z : α
|
||
h₁ : x = y
|
||
h₂ : y = z
|
||
⊢ x = y ∧ y = z
|
||
-/
|
||
#guard_msgs in
|
||
example (α : Type) (x y z : α) (h₁ : x = y) (h₂ : y = z) : x = y ∧ y = z := by
|
||
conv =>
|
||
clear h₁
|
||
trace_state
|
||
lhs
|
||
clear h₂
|
||
trace_state
|
||
trace_state
|
||
exact And.intro h₁ h₂
|
||
|
||
/- Ensure `clear` behaves correctly when nesting `conv` blocks -/
|
||
/--
|
||
trace: α : Type
|
||
w x y z : α
|
||
h₁ : x = y
|
||
h₂ : y = z
|
||
| y = z
|
||
---
|
||
trace: α : Type
|
||
w x y z : α
|
||
h₂ : y = z
|
||
| y
|
||
---
|
||
trace: α : Type
|
||
w x y z : α
|
||
h₁ : x = y
|
||
h₂ : y = z
|
||
| y = z
|
||
---
|
||
trace: α : Type
|
||
w x y z : α
|
||
h₂ : y = z
|
||
| y = z
|
||
-/
|
||
#guard_msgs in
|
||
set_option linter.unusedVariables false in
|
||
example (α : Type) (w x y z : α) (h₀ : z = w) (h₁ : x = y) (h₂ : y = z) : x = y ∧ y = z := by
|
||
conv =>
|
||
rhs
|
||
clear h₀
|
||
trace_state
|
||
conv =>
|
||
lhs
|
||
clear h₁
|
||
trace_state
|
||
trace_state
|
||
clear h₁
|
||
trace_state
|
||
exact And.intro h₁ h₂
|
||
|
||
/- Ensure `clear` correctly handles multiple arguments, including by removing them in the correct
|
||
order -/
|
||
/--
|
||
trace: α : Type
|
||
y z : α
|
||
h₂ : y = z
|
||
| y = z
|
||
---
|
||
trace: α : Type
|
||
z : α
|
||
| z
|
||
-/
|
||
#guard_msgs in
|
||
example (α : Type) (x y z : α) (h₁ : x = y) (h₂ : y = z) : x = y ∧ y = z := by
|
||
conv =>
|
||
rhs
|
||
clear x h₁
|
||
trace_state
|
||
rhs
|
||
clear h₂ y
|
||
trace_state
|
||
exact And.intro h₁ h₂
|
||
|
||
/- Ensure `clear` refuses to remove arguments on which the goal or existing hypotheses depend -/
|
||
/--
|
||
error: Tactic `clear` failed: variable 'h' depends on 'x'
|
||
|
||
x : Nat
|
||
h : x = 1
|
||
⊢ Prop
|
||
-/
|
||
#guard_msgs in
|
||
example (x : Nat) (h : x = 1) : True := by
|
||
conv =>
|
||
clear x
|
||
|
||
/--
|
||
error: Tactic `clear` failed: target depends on 'x'
|
||
|
||
x : Nat
|
||
| x = 2
|
||
-/
|
||
#guard_msgs in
|
||
example (x : Nat) : x = 2 := by
|
||
conv =>
|
||
clear x
|
||
|
||
/--
|
||
error: Tactic `clear` failed: target depends on 'x'
|
||
|
||
y x : Nat
|
||
| x = 2
|
||
-/
|
||
#guard_msgs in
|
||
example (y x : Nat) : x = 2 := by
|
||
conv =>
|
||
clear x y
|
||
|
||
/- Ensure `clear` interacts correctly with/leaves goals in a usable state for other `conv` tactics -/
|
||
/--
|
||
trace: y : Nat
|
||
h₂ : y = 3
|
||
| 2 + y
|
||
---
|
||
trace: | 2 + 3
|
||
-/
|
||
#guard_msgs in
|
||
example (x y : Nat) (h₁ : x = 2) (h₂ : y = 3) : 2 * (x + y) = 10 := by
|
||
conv =>
|
||
enter [1, 2]
|
||
rw [h₁]
|
||
clear h₁ x
|
||
trace_state
|
||
rw [h₂]
|
||
clear h₂ y
|
||
trace_state
|
||
simp only [Nat.reduceMul]
|