Zulip Chat Archive

Stream: lean4

Topic: Prove by definition of type


Op From The Start (Jul 13 2024 at 22:05):

See simpler example in the second post

inductive Game : Ordinal.{u}  Type (u+2)
  | mk (α β: Ordinal.{u}) (l: (αi : Ordinal.{u})  (lt: αi < α)  (Game αi))
                          (r: (βi : Ordinal.{u})  (lt: βi < β)  (Game βi)) : Game (max α β)
  | p (α : Ordinal.{u}) (p: α < β) (g: Game α) : Game β
   -- Couldnt use Option so im doing this
  | None : Game γ

def sur_zero : Game 0 := (Ordinal.max_zero_left 0)  Game.mk 0 0
  (fun (αi: Ordinal) (p: αi<0) => absurd p (Ordinal.not_lt_zero αi))
  (fun (βi: Ordinal) (p: βi<0) => absurd p (Ordinal.not_lt_zero βi))


def sur_one : Game 1 := (Ordinal.max_zero_right 1)  Game.mk 1 0
  (fun (αi: Ordinal) (p: αi<1) => Ordinal.lt_one_iff_zero.mp p  sur_zero)
  (fun (βi: Ordinal) (p: βi<0) => absurd p (Ordinal.not_lt_zero βi))

theorem max_succ_max : {α β : Ordinal}  max (Order.succ (max α β)) β = Order.succ (max α β) := by
  intro a b
  rw [succ_max, max_assoc, max_eq_left_of_lt (Order.lt_succ b)]

-- Simplest element larger than Game α, maybe
def rsucc : {α : Ordinal}  (Game α)  (Game (Order.succ α)) := by
intro α g
match g with
 | Game.mk   glm grm =>
    have gs : Game (Order.succ (max  )) := max_succ_max  Game.mk (Order.succ (max  )) 
      (fun (αi: Ordinal) (p: αi<(Order.succ (max  ))) => by
        have αlt : αi <   Game αi := glm αi
        have αeq : αi >=   (αi < α)   Game αi := by
          intro eq 
          exact Game.None
        have αeqeq : (αi=α)  Game αi := by
          intro eq
          rw [eq]
          exact g

      )
      (fun (βi: Ordinal) (p: βi<) => grm βi p)
  | Game.p  p g =>
    exact @Game.p (Order.succ α)  (lt_trans p (Order.lt_succ α)) g
  | Game.None => exact Game.None

How do I prove that max gα gβ = α in the mk case? Its definitionally true but I'm new so idk how to solve it.

Op From The Start (Jul 13 2024 at 23:26):

A simpler example is of the following:

inductive Summ : Nat  Type
  | mk (a b : Nat) : Summ (a+b)

def summ_adds : (s: Nat)  Summ s  Prop := fun (s: Nat) (sm: Summ s) => by
  match sm with
   | Summ.mk a b => exact a+b=s

theorem summ_adds_proof : (s: Nat)   sm: Summ s, summ_adds s sm := by
  intro s sm

How would I go about solving this?

Eric Wieser (Jul 13 2024 at 23:31):

  cases sm
  rw [summ_adds] -- or `rfl`

finishes the proof

Op From The Start (Jul 14 2024 at 00:00):

That works for that but not in my first example, I guess what I am really asking is, given that Summ structure, how can I create a proof of a+b=s within another def?


Last updated: May 02 2025 at 03:31 UTC