This PR allow structures to have non-bracketed binders, making it consistent with `inductive`. The change allows the following to be written instead of having to write `S (n)`: ```lean structure S n where field : Fin n ```
104 lines
2.2 KiB
Text
104 lines
2.2 KiB
Text
/-!
|
||
# Testing structure declarations, including unbracketed parameters
|
||
-/
|
||
|
||
/-!
|
||
Structure with no parameters, no type, named constructor, and derived instance
|
||
-/
|
||
structure NatPair where
|
||
mkPair ::
|
||
fst : Nat
|
||
snd : Nat
|
||
deriving Inhabited
|
||
|
||
/-- info: NatPair : Type -/
|
||
#guard_msgs in
|
||
#check NatPair
|
||
|
||
/-- info: NatPair.mkPair (fst snd : Nat) : NatPair -/
|
||
#guard_msgs in
|
||
#check NatPair.mkPair
|
||
|
||
/-- info: instInhabitedNatPair -/
|
||
#guard_msgs in
|
||
#synth Inhabited NatPair
|
||
|
||
/-!
|
||
Structure with type and no parameters
|
||
-/
|
||
structure Pointed : Type u where
|
||
α : Sort u
|
||
x : α
|
||
|
||
/-- info: Pointed.{u} : Type u -/
|
||
#guard_msgs in
|
||
#check Pointed
|
||
|
||
/-- info: Pointed.mk.{u} (α : Sort u) (x : α) : Pointed -/
|
||
#guard_msgs in
|
||
#check Pointed.mk
|
||
|
||
/-!
|
||
Structure with unbracketed parameter, no type, and derived instance
|
||
-/
|
||
structure Δ n where
|
||
val : Fin (n + 1)
|
||
deriving Inhabited
|
||
|
||
/-- info: Δ (n : Nat) : Type -/
|
||
#guard_msgs in
|
||
#check Δ
|
||
|
||
/-- info: Δ.mk {n : Nat} (val : Fin (n + 1)) : Δ n -/
|
||
#guard_msgs in
|
||
#check Δ.mk
|
||
|
||
/-- info: @instInhabitedΔ -/
|
||
#guard_msgs in
|
||
#synth ∀ n, Inhabited (Δ n)
|
||
|
||
/-!
|
||
Structure with unbracketed parameters, type, and extends
|
||
-/
|
||
structure Prod₃ α β γ : Type u extends toProd : α × β where
|
||
trd : (γ : Type u)
|
||
|
||
/-- info: Prod₃.{u} (α β γ : Type u) : Type u -/
|
||
#guard_msgs in
|
||
#check Prod₃
|
||
|
||
/-- info: Prod₃.mk.{u} {α β γ : Type u} (toProd : α × β) (trd : γ) : Prod₃ α β γ -/
|
||
#guard_msgs in
|
||
#check Prod₃.mk
|
||
|
||
/-- info: Prod₃.toProd.{u} {α β γ : Type u} (self : Prod₃ α β γ) : α × β -/
|
||
#guard_msgs in
|
||
#check Prod₃.toProd
|
||
|
||
/-!
|
||
Structure with no type and mixture of bracketed and unbracketed parameters
|
||
-/
|
||
structure IsLt {n} (i : Fin n) j where
|
||
pf : i < j
|
||
|
||
/-- info: IsLt {n : Nat} (i j : Fin n) : Prop -/
|
||
#guard_msgs in
|
||
#check IsLt
|
||
|
||
/-- info: IsLt.mk {n : Nat} {i j : Fin n} (pf : i < j) : IsLt i j -/
|
||
#guard_msgs in
|
||
#check IsLt.mk
|
||
|
||
/-!
|
||
Structure with type and mixture of bracketed and unbracketed parameters
|
||
-/
|
||
structure Eval {n} (F : Fin n → Sort u) i : Sort (max 1 u) where
|
||
value : F i
|
||
|
||
/-- info: Eval.{u} {n : Nat} (F : Fin n → Sort u) (i : Fin n) : Sort (max 1 u) -/
|
||
#guard_msgs in
|
||
#check Eval
|
||
|
||
/-- info: Eval.mk.{u} {n : Nat} {F : Fin n → Sort u} {i : Fin n} (value : F i) : Eval F i -/
|
||
#guard_msgs in
|
||
#check Eval.mk
|