This PR is part 2 of the `implicit_reducible` refactoring (part 1: #12567). **Background.** When Lean checks definitional equality of function applications `f a₁ ... aₙ =?= f b₁ ... bₙ`, it compares arguments `aᵢ =?= bᵢ` at a transparency level determined by the binder type. Previously, only instance-implicit (`[C]`) arguments received a transparency bump to `.instances`. With `backward.isDefEq.implicitBump` enabled, ALL implicit arguments (`{x}`, `⦃x⦄`, and `[x]`) are bumped to `.instances`, so that definitions marked `[implicit_reducible]` unfold when comparing implicit arguments. This is important because implicit arguments often carry type information (e.g., `P (i + 0)` vs `P i`) where the mismatch is in non-proof positions (Sort arguments to `cast`) — proof irrelevance does not help here, so the relevant definitions must actually unfold. **`[implicit_reducible]`** (renamed from `[instance_reducible]` in part 1) marks definitions that should unfold at `TransparencyMode.instances` — between `[reducible]` (unfolds at `.reducible` and above) and the default `[semireducible]` (unfolds only at `.default` and above). This is the right level for core arithmetic operations that appear in type indices. ## Changes - **Enable `backward.isDefEq.implicitBump` by default** and set it in `stage0/src/stdlib_flags.h` so stage0 also compiles with it - **Mark `Nat.add`, `Nat.mul`, `Nat.sub`, `Array.size` as `[implicit_reducible]`** so they unfold when comparing implicit arguments at `.instances` transparency - **Remove redundant unification hints** (`n + 0 =?= n`, `n - 0 =?= n`, `n * 0 =?= 0`) that are now handled by `[implicit_reducible]` - **Rename all remaining `[instance_reducible]` attribute usages** to `[implicit_reducible]` across the codebase (the old name remains as an alias) - **Remove 28 `set_option backward.isDefEq.respectTransparency false in`** workarounds that are no longer needed 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
30 lines
1.2 KiB
Text
30 lines
1.2 KiB
Text
@[implicit_reducible] protected def Nat.add : Nat → Nat → Nat :=
|
||
fun x x_1 =>
|
||
Nat.brecOn x_1
|
||
(fun x f x_2 =>
|
||
(match x_2, x with
|
||
| a, Nat.zero => fun x => a
|
||
| a, b.succ => fun x => (x.1 a).succ)
|
||
f)
|
||
x
|
||
@[implicit_reducible] protected def Nat.add : Nat → Nat → Nat :=
|
||
fun x x_1 =>
|
||
Nat.brecOn (motive := fun x => Nat → Nat) x_1
|
||
(fun x f x_2 =>
|
||
(match (motive := Nat → (x : Nat) → Nat.below (motive := fun x => Nat → Nat) x → Nat) x_2, x with
|
||
| a, Nat.zero => fun x => a
|
||
| a, b.succ => fun x => (x.1 a).succ)
|
||
f)
|
||
x
|
||
theorem ex.{u} : ∀ {α β : Sort u} (h : α = β) (a : α), cast h a ≍ a :=
|
||
fun x x_1 x_2 x_3 =>
|
||
match x, x_1, x_2, x_3 with
|
||
| α, .(α), Eq.refl α, a => HEq.refl a
|
||
theorem ex.{u} : ∀ {α β : Sort u} (h : α = β) (a : α), cast h a ≍ a :=
|
||
fun x x_1 x_2 x_3 =>
|
||
match (motive := ∀ (x x_4 : Sort u) (x_5 : x = x_4) (x_6 : x), cast x_5 x_6 ≍ x_6) x, x_1, x_2, x_3 with
|
||
| α, .(α), Eq.refl α, a => HEq.refl a
|
||
def fact : Nat → Nat :=
|
||
fun n => Nat.recOn n 1 fun n acc => (n + 1) * acc
|
||
def fact : Nat → Nat :=
|
||
fun n => Nat.recOn (motive := fun x => Nat) n 1 fun n acc => (n + 1) * acc
|