lean4-htt/tests/lean/run/showTactic.lean
jrr6 5f4e6a86d5
feat: update and explain "unknown constant" and "failed to infer type" errors (#9423)
This PR updates the formatting of, and adds explanations for, "unknown
identifier" errors as well as "failed to infer type" errors for binders
and definitions.

It attempts to ameliorate some of the confusion encountered in #1592 by
modifying the wording of the "header is elaborated before body is
processed" note and adding further discussion and examples of this
behavior in the corresponding error explanation.
2025-07-18 19:20:31 +00:00

160 lines
2.4 KiB
Text

/-!
# Testing the new behavior of the `show` tactic
Implemented in PR #7395.
-/
/-!
`show` can change a single goal to a definitionally equivalent one.
-/
/--
error: unsolved goals
x : Nat
⊢ x - 0 = 3 - 3
-/
#guard_msgs in
example : x = 0 := by
show x - 0 = 3 - 3
/-!
`show` on a single goal fails if the pattern is not defeq to the target.
-/
/--
error: 'show' tactic failed, pattern
x = 1
is not definitionally equal to target
x = 0
-/
#guard_msgs in
example : x = 0 := by
show x = 1
/-!
`show` on multiple goals picks the first that matches.
-/
/--
error: unsolved goals
case refine_2
x : Nat
⊢ x = 1
case refine_1
x : Nat
⊢ x = 0
-/
#guard_msgs in
example : x = 0 ∧ x = 1 := by
and_intros
show _ = 1
/-!
The matching goal is moved to the front and the order of the others is preserved.
-/
/--
error: unsolved goals
case refine_2.refine_2.refine_1
x : Nat
⊢ x = 2
case refine_1
x : Nat
⊢ x = 0
case refine_2.refine_1
x : Nat
⊢ x = 1
case refine_2.refine_2.refine_2
x : Nat
⊢ x = 3
-/
#guard_msgs in
example : x = 0 ∧ x = 1 ∧ x = 2 ∧ x = 3 := by
and_intros
show _ = 2
/-!
All goals are first elaborated without error recovery.
-/
/--
error: unsolved goals
case refine_2.refine_2
a : Unit
⊢ a = ()
case refine_1
⊢ () = ()
case refine_2.refine_1
⊢ () = ()
-/
#guard_msgs in
example : () = () ∧ () = () ∧ (∀ a, a = ()) := by
and_intros; all_goals try intro a
show a = _
/-!
The first goal is re-elaborated with error recovery.
-/
/--
error: Unknown identifier `a`
---
error: unsolved goals
case refine_1
⊢ sorry = ()
case refine_2
⊢ () = ()
-/
#guard_msgs in
example : () = () ∧ () = () := by
and_intros
show a = _
/-!
If all unifications fail, the error is from the first goal with a mention that the later goals
also weren't defeq.
-/
/--
error: 'show' tactic failed, no goals unify with the given pattern.
In the first goal, the pattern
x = 4
is not definitionally equal to the target
x = 1
(Errors for other goals omitted)
-/
#guard_msgs in
example : x = 1 ∧ x = 2 ∧ x = 3 := by
and_intros
show x = 4
/-!
`show` also works when a mentioned variable only exists in some goals.
-/
/--
error: unsolved goals
case refine_2.refine_2
c : Nat
⊢ c = 1
case refine_1
a : Nat
⊢ a = 1
case refine_2.refine_1
b : Nat
⊢ b = 1
-/
#guard_msgs in
example : (∀ a, a = 1) ∧ (∀ b, b = 1) ∧ (∀ c, c = 1) := by
and_intros; all_goals unhygienic intro
show c = _