

structure A0.{u} (α : Type u) :=
(x : α)

structure A.{u} (α : Type u) extends A0 α :=
(y : α)

structure B.{u} (α : Type u) :=
(z : α)

variable (β : Type _)
variable (β' : Type _)

universe u

structure C.{v} (α : Type _) (δ : Type u) (η : Type v) extends A β, B α :=
mk2 :: (w : Nat := 10)

#check C
#check @C
#check @C.mk2
#check { x := 10, y := 20, z := 30, w := 40 : C Nat Nat Nat Nat }
#check @C.recOn
#check C.w
#check fun (c : C Nat Nat Nat Nat) => c.x

def f0 (c : C Nat Nat Nat Nat) : A Nat :=
c.toA

def f1 (c : C Nat Nat Nat Nat) :=
c.x + c.w

class Tst (α : Type u) extends Mul α :=
(comm : ∀ (a b : α), a * b = b * a)

#check @Tst.comm
#check @Tst.toMul

def foo {α} [Tst α] (a b : α) :=
a * b

#check { x := 10, y := 20, z := 30 : C Nat Nat Nat Nat }

class Foo (α : Type u) extends Add α :=
(x : α)

class Boo (α : Type u) extends Foo α :=
(y : α := x + x)

#check @Boo.y._default

#check { add := Nat.add, x := 10 : Boo Nat}
