This PR renames `instance_reducible` to `implicit_reducible` and adds a new `backward.isDefEq.implicitBump` option to prepare for treating all implicit arguments uniformly during definitional equality checking. ## Changes **Rename `instance_reducible` → `implicit_reducible`:** - Rename `ReducibilityStatus.instanceReducible` constructor to `implicitReducible` - Register new `[implicit_reducible]` attribute, keep `[instance_reducible]` as alias - Rename `isInstanceReducible` → `isImplicitReducible` (with deprecated aliases) - Update all references across src/ and tests/ The rename reflects that this reducibility level is used not just for instances but for any definition that needs unfolding during implicit argument resolution (e.g., `Nat.add`, `Array.size`). **Add `backward.isDefEq.implicitBump` option:** - When `true` (+ `respectTransparency`), bumps transparency to `.instances` for ALL implicit arguments in `isDefEqArgs`, not just instance-implicit ones - Defaults to `false` for staging compatibility — will be flipped to `true` after stage0 update - Adds `// update me!` to `stage0/src/stdlib_flags.h` to trigger CI stage0 update ## Follow-up (after stage0 update) - Flip `backward.isDefEq.implicitBump` default to `true` - Fix resulting test/module failures 🤖 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>
65 lines
1.9 KiB
Text
65 lines
1.9 KiB
Text
import Lean
|
||
|
||
namespace A
|
||
|
||
structure A (α : Type u) where
|
||
a : α
|
||
deriving Lean.ToExpr, Inhabited
|
||
|
||
-- same namespace for instance and aux decls
|
||
|
||
/--
|
||
info: @[implicit_reducible] def A.instToExprA.{u} : {α : Type u} → [Lean.ToExpr α] → [Lean.ToLevel] → Lean.ToExpr (A α) :=
|
||
fun {α} [Lean.ToExpr α] [inst_1 : Lean.ToLevel] =>
|
||
{ toExpr := instToExprA.toExpr inst_1, toTypeExpr := (Lean.Expr.const `A.A [Lean.toLevel]).app (Lean.toTypeExpr α) }
|
||
-/
|
||
#guard_msgs in #print A.instToExprA
|
||
|
||
|
||
/--
|
||
info: @[implicit_reducible] def A.instInhabitedA.{u_1} : {a : Type u_1} → [Inhabited a] → Inhabited (A a) :=
|
||
fun {a} [Inhabited a] => { default := instInhabitedA.default }
|
||
-/
|
||
#guard_msgs in #print A.instInhabitedA
|
||
|
||
end A
|
||
|
||
mutual
|
||
inductive B (α : Type u) : Type _ where
|
||
| leaf
|
||
| mk (a : C α)
|
||
deriving Lean.ToExpr, Inhabited
|
||
inductive C (α : Type u) : Type _ where
|
||
| mk (b : B α)
|
||
deriving Lean.ToExpr, Inhabited
|
||
end
|
||
|
||
/--
|
||
info: @[implicit_reducible] def instToExprB.{u} : {α : Type u} → [Lean.ToExpr α] → [Lean.ToLevel] → Lean.ToExpr (B α) :=
|
||
fun {α} [Lean.ToExpr α] [inst_1 : Lean.ToLevel] =>
|
||
{ toExpr := instToExprB.toExpr_1 inst_1, toTypeExpr := (Lean.Expr.const `B [Lean.toLevel]).app (Lean.toTypeExpr α) }
|
||
-/
|
||
#guard_msgs in
|
||
#print instToExprB
|
||
/--
|
||
info: @[implicit_reducible] def instToExprC.{u} : {α : Type u} → [Lean.ToExpr α] → [Lean.ToLevel] → Lean.ToExpr (C α) :=
|
||
fun {α} [Lean.ToExpr α] [inst_1 : Lean.ToLevel] =>
|
||
{ toExpr := instToExprB.toExpr_2 inst_1, toTypeExpr := (Lean.Expr.const `C [Lean.toLevel]).app (Lean.toTypeExpr α) }
|
||
-/
|
||
#guard_msgs in
|
||
#print instToExprC
|
||
|
||
|
||
/--
|
||
info: @[implicit_reducible] def instInhabitedB.{u_1} : {a : Type u_1} → Inhabited (B a) :=
|
||
fun {a} => { default := instInhabitedB.default_1 }
|
||
-/
|
||
#guard_msgs in
|
||
#print instInhabitedB
|
||
|
||
/--
|
||
info: @[implicit_reducible] def instInhabitedC.{u_1} : {a : Type u_1} → Inhabited (C a) :=
|
||
fun {a} => { default := instInhabitedC.default_1 }
|
||
-/
|
||
#guard_msgs in
|
||
#print instInhabitedC
|