/-! # Tests of `inductive` parameter binder updates See also `structBinderUpdates.lean`. -/ /-! By default parameters are implicit. -/ inductive Eq1 {α : Type u} (x : α) : α → Prop where | rfl : Eq1 x x /-- info: Eq1.rfl.{u} {α : Type u} {x : α} : Eq1 x x -/ #guard_msgs in #check Eq1.rfl /-! Can override explicitness of the parameter for the constructor. -/ inductive Eq2 {α : Type u} (x : α) : α → Prop where | rfl (x) : Eq2 x x /-- info: Eq2.rfl.{u} {α : Type u} (x : α) : Eq2 x x -/ #guard_msgs in #check Eq2.rfl /-! Can override multiple parameter binders simultaneously. -/ inductive Eq3 {α : Type u} (x : α) : α → Prop where | rfl (α x) : Eq3 x x /-- info: Eq3.rfl.{u} (α : Type u) (x : α) : Eq3 x x -/ #guard_msgs in #check Eq3.rfl /-! There is no constraint on which parameter is overridden. -/ inductive Eq4 {α : Type u} (x : α) : α → Prop where | rfl (α) : Eq4 x x /-- info: Eq4.rfl.{u} (α : Type u) {x : α} : Eq4 x x -/ #guard_msgs in #check Eq4.rfl /-! Cannot override binders for parameters from from `variable`. -/ /-- error: Only parameters appearing in the declaration header may have their binders kinds be overridden Hint: If this is not intended to be an override, use a binder with a type: for example, `(x : _)` -/ #guard_msgs in variable {α : Type u} (x : α) in inductive Eq5 : α → Prop where | rfl (x) : Eq5 x x /-! Test of the a header parameter shadowing a `variable` parameter that's still included as a parameter. -/ variable {α : Type u} (x : α) in inductive Eq6 (x : α) : α → Prop where | rfl (x) : Eq6 x (clear% x; x) /-- info: Eq6.rfl.{u} {α : Type u} {x : α} (x✝ : α) : Eq6 x x✝ x -/ #guard_msgs in #check Eq6.rfl /-! The `(x)` syntax also can be used as a binder, if it's not shadowing a local variable. -/ variable {α : Type u} in inductive Eq7 : α → α → Prop where | rfl (x) : Eq7 x x /-- info: Eq7.rfl.{u} {α : Type u} (x : α) : Eq7 x x -/ #guard_msgs in #check Eq7.rfl /-! Example of non-binder update. -/ inductive I1 : Nat → Nat → Type where | mk (a b) : I1 a b /-- info: I1.mk (a b : Nat) : I1 a b -/ #guard_msgs in #check I1.mk /-! Cannot mix binder updates with defining new fields. When this happens, it assumes they're all new fields. -/ /-- error: Mismatched inductive type parameter in I2 a b The provided argument a is not definitionally equal to the expected parameter a✝ Note: The value of parameter `a✝` must be fixed throughout the inductive declaration. Consider making this parameter an index if it must vary. -/ #guard_msgs in inductive I2 (a : Nat) : Nat → Type where | mk (a b) : I2 a b /-! Can mix binder updates with defining new fields if they're done in separate binders. -/ inductive I2' (a : Nat) : Nat → Type where | mk (a) (b) : I2' a b /-- info: I2'.mk (a b : Nat) : I2' a b -/ #guard_msgs in #check I2'.mk