#lang lean4

universes w₁ w₂ w₃

namespace Struct
structure S1.{r, s} (α : Type s) : Type (max s r) :=
  up :: (down : α)

def ex1.{u, v} (α : Type u) (σ : Type (max v u)) (h : σ = S1.{v, u} α) : True :=
  trivial

structure S2.{u, v} (α : Sort u) (β : Sort v) :=
  (a : α)
  (b : β)

def ex2.{u, v} (α : Sort u) (β : Sort v) (σ : Sort (max u v 1)) (h : σ = S2 α β) : True :=
  trivial

structure S3.{u, v} (α : Type u) (β : Type v) :=
  (a : α)
  (b : β)

def ex3.{u, v} (α : Type u) (β : Type v) (σ : Type (max u v)) (h : σ = S3 α β) : True :=
  trivial

structure S4.{u, v} (α : Sort u) (β : Sort v) : Type _ := -- Error: inference procedure failed
  (a : α)
  (b : β)

structure S5.{u, v} (α : Type (u+1)) (β : Type v) :=
  (a : α)
  (b : β)

def ex5.{u, v} (α : Type (u+1)) (β : Type v) (σ : Type (max (u+1) v)) (h : σ = S5 α β) : True :=
  trivial

structure S6.{u, v} (α : Sort (max u v)) (β : Type v) :=
  (a : α)
  (b : β)

#check S6.{w₁, w₂}

def ex6.{u, v} (α : Sort (max u v)) (β : Type v) (σ : Sort max u (v+1)) (h : σ = S6.{u, v} α β) : True :=
  trivial

structure S7.{u, v} (α : Sort u) (β : Sort v) : Sort (max u v) :=  -- Error: invalid universe polymorphic type
  (a : α) (b : β)

end Struct

namespace Induct

inductive S2.{u, v} (α : Sort u) (β : Sort v)
  | mk (a : α) (b : β)

def ex2.{u, v} (α : Sort u) (β : Sort v) (σ : Sort (max u v 1)) (h : σ = S2 α β) : True :=
  trivial

inductive S3.{u, v} (α : Type u) (β : Type v)
  | mk (a : α) (b : β)

def ex3.{u, v} (α : Type u) (β : Type v) (σ : Type (max u v)) (h : σ = S3 α β) : True :=
  trivial

inductive S4.{u, v} (α : Sort u) (β : Sort v) : Type _  -- Error: inference procedure failed
  | mk (a : α) (b : β)

inductive S5.{u, v} (α : Type (u+1)) (β : Type v)
  | mk (a : α) (b : β)

def ex5.{u, v} (α : Type (u+1)) (β : Type v) (σ : Type (max (u+1) v)) (h : σ = S5 α β) : True :=
  trivial

inductive S6.{u, v} (α : Sort u) (β : Sort v) : Sort (max u v)
  | mk (a : α) (b : β)

inductive Term
  | Var : Nat → Term
  | App : Term → Term → Term
  | All : (Nat → Term) → Term

inductive S7.{u, v} (α : Sort u) (β : Sort v) : Sort (max u v)  -- Error: invalid universe polymorphic type
  | mk (a : α) (b : β)

open Lean

inductive Stx
  | node   (args : Array Stx) : Stx

def ex7 (h : Stx = Nat) : True :=
  trivial

end Induct
