Zulip Chat Archive
Stream: lean4
Topic: Proving Nat less than is well-founded
Brandon Brown (Jul 21 2021 at 05:41):
I'm trying to prove the well-foundedness of the less-than relation on the natural numbers using the accessibility inductive type approach, but I'm either misunderstanding how to use Acc
, missing some valid moves in Lean4 or misunderstanding the proof.
I'd like to be able to prove that Acc Nat.lt x -> Acc Nat.lt (succ x)
because I can then easily use that lemma to prove that ∀ x : Nat, Acc Nat. lt x
(i.e. that it is well-founded), but I'm having a hard time with this.
theorem acc_succ : ∀ x : Nat, Acc Nat.lt x → Acc Nat.lt x.succ := by
intros x h
apply Acc.intro;
intros y h2;
apply Acc.inv h; -- stuck
-- ⊢ y < x
Since I assume Acc Nat.lt x
, then that means all y < x
are accessible too. And since x
is the immediate predecessor of x.succ
, then we know that all y < x.succ
are accessible, and if we should know that then we know that Acc Nat.lt (succ x)
open Nat
theorem zero_acc : Acc Nat.lt 0 := by
apply Acc.intro
intros y h
apply False.elim
cases h
theorem succ_acc {x : Nat} : Acc Nat.lt x.succ → Acc Nat.lt x := by
intros h
apply Acc.intro
intros y h2
apply Acc.inv h
apply Nat.leSuccOfLe
exact h2
theorem acc_succ : ∀ x : Nat, Acc Nat.lt x → Acc Nat.lt x.succ := by
intros x h
apply Acc.intro;
intros y h2;
apply Acc.inv h; -- stuck
-- ⊢ y < x
def well_founded {α : Type _} (r : α → α → Prop) : Prop := ∀ x : α, Acc r x
theorem nat_lt_is_wf : well_founded Nat.lt := sorry
Mario Carneiro (Jul 21 2021 at 05:50):
Don't use Acc.inv
, that's the inverse to intro
so you won't get anywhere
Mario Carneiro (Jul 21 2021 at 05:51):
Since you are proving that nat is inductively generated by less than, the proof is naturally going to go via induction
Mario Carneiro (Jul 21 2021 at 05:59):
theorem Nat.eq_or_lt_of_lt_succ : m < Nat.succ n → m = n ∨ m < n := sorry
theorem acc_succ : ∀ x : Nat, Acc Nat.lt x := by
intro x
induction x with (apply Acc.intro; intro y h)
| zero => cases h
| succ n ih => ?_
match Nat.eq_or_lt_of_lt_succ h with
| Or.inl rfl => exact ih
| Or.inr h' => exact ih.inv h'
Brandon Brown (Jul 21 2021 at 19:48):
Thanks, Mario! I wasn't familiar with the induction x with (apply Acc.intro; intro y h)
syntax, but it looks like it just adds it into each case similar to generalizing
, good to know
equivalent to
theorem acc_succ : ∀ x : Nat, Acc Nat.lt x := by
intro x
induction x with
| zero =>
apply Acc.intro; intro y h
cases h
| succ n ih => ?_
apply Acc.intro; intro y h
match Nat.eq_or_lt_of_lt_succ h with
| Or.inl rfl => exact ih
| Or.inr h' => exact ih.inv h'
Last updated: Dec 20 2023 at 11:08 UTC