This PR refines how the `apply` tactic (and related tactics like `rewrite`) name and tag the remaining subgoals. Assigned metavariables are now filtered out *before* computing subgoal tags. As a consequence, when only one unassigned subgoal remains, it inherits the tag of the input goal instead of being given a fresh suffixed tag. User-visible effect: proof states that previously displayed tags like `case h`, `case a`, or `case upper.h` for a single remaining goal now display the input goal's tag directly (e.g. no tag at all, or `case upper`). This removes noise from `funext`, `rfl`-style, and `induction`-alternative goals when the applied lemma introduces only one non-assigned metavariable. Multi-goal applications are unaffected — their subgoals continue to receive distinguishing suffixes. This may affect users whose proofs rely on the previous tag names (for example, `case h => ...` after `funext`). Such scripts need to be updated to use the input goal's tag instead. --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
18 lines
644 B
Text
18 lines
644 B
Text
/-!
|
|
Regression test: `case <ctor>` must keep working after `congr; ext _; cases _`
|
|
even though the subgoal tags produced by `apply`-family tactics now inherit
|
|
the parent tag (without appending the binder name) when only one subgoal is
|
|
left. The case-tag matcher erases macro scopes so that `case yield` still
|
|
matches tags like `e_a.yield._@._internal._hyg.0`.
|
|
-/
|
|
|
|
example {δ : Type} {m : Type → Type} [Monad m] [LawfulMonad m]
|
|
(x : m (ForInStep δ))
|
|
(f g : ForInStep δ → m (ForInStep δ))
|
|
(h : ∀ a, f a = g a) :
|
|
(x >>= f) = (x >>= g) := by
|
|
congr
|
|
ext step
|
|
cases step
|
|
case yield => apply h
|
|
case done => apply h
|