Zulip Chat Archive

Stream: Is there code for X?

Topic: Chains of irreflexive relation is Finite


SnO2WMaN (Jul 18 2024 at 13:04):

I am looking for / want to prove that "there are at most finite number of chains by ireflexive and transitive relations on finite elements". Roughly speaking, there are at most |α|! (|α| is number of elements), so might be obviously, but if you can think of a simple proof, please let me know.

import Mathlib.Init.Logic
import Mathlib.Data.Finite.Defs

theorem List.chains_finite [Finite α] {R : α  α  Prop} (R_trans : Transitive R) (R_irrefl : Irreflexive R) : Finite { l : List α // l.Chain' R } := by
  sorry;

https://live.lean-lang.org/#code=import%20Mathlib.Init.Logic%0Aimport%20Mathlib.Data.Finite.Defs%0A%0Atheorem%20List.chains_finite%20%5BFinite%20%CE%B1%5D%20%7BR%20%3A%20%CE%B1%20%E2%86%92%20%CE%B1%20%E2%86%92%20Prop%7D%20(R_trans%20%3A%20Transitive%20R)%20(R_irrefl%20%3A%20Irreflexive%20R)%20%3A%20Finite%20%7B%20l%20%3A%20List%20%CE%B1%20%2F%2F%20l.Chain'%20R%20%7D%20%3A%3D%20by%0A%20%20sorry%3B

Floris van Doorn (Jul 18 2024 at 13:20):

Please edit your post to include a full #mwe with imports/variables

Floris van Doorn (Jul 18 2024 at 13:22):

It seems false if R is not transitive: Can't [a,b,a,b,a,b,a,b] be part of your subtype?

SnO2WMaN (Jul 18 2024 at 13:24):

Sorry I made mistake, thanks for advice.

SnO2WMaN (Jul 18 2024 at 13:29):

Added mwe.

Floris van Doorn (Jul 18 2024 at 13:37):

I recommend proving { l : List α | l.Nodup }.Finite and l.Chain' R  → l.Nodup

SnO2WMaN (Jul 21 2024 at 06:02):

Thanks @Floris van Doorn , I proved.
I think this lemma might be useful in as if there's in Mathlib, How's about?

import Mathlib.Init.Logic
import Mathlib.Data.Finite.Defs
import Mathlib.Data.List.Duplicate
import Mathlib.Data.List.Chain
import Mathlib.Data.Fintype.List
import Mathlib.Data.Fintype.Card

variable {l l₁ l₂ : List α}
variable {R : α  α  Prop}

lemma Chain'.nodup_of_trans_irreflex (R_trans : Transitive R) (R_irrefl : Irreflexive R) (h_chain : l.Chain' R) : l.Nodup := by
  by_contra hC;
  replace d, hC := List.exists_duplicate_iff_not_nodup.mpr hC;
  have := List.duplicate_iff_sublist.mp hC;
  have := @List.Chain'.sublist α R [d, d] l by aesop h_chain this;
  simp at this;
  exact R_irrefl d this;

instance finiteNodupList [DecidableEq α] [Finite α] : Finite { l : List α // l.Nodup } := @fintypeNodupList α _ (Fintype.ofFinite α) |>.finite

lemma chains_finite [DecidableEq α] [Finite α] (R_trans : Transitive R) (R_irrefl : Irreflexive R) : Finite { l : List α // l.Chain' R } := by
  apply @Finite.of_injective { l : List α // l.Chain' R } { l : List α // l.Nodup } _ ?f;
  case f => intro l, hl⟩; refine l, List.Chain'.nodup_of_trans_irreflex R_trans R_irrefl hl⟩;
  simp [Function.Injective];

https://live.lean-lang.org/#code=import%20Mathlib.Init.Logic%0Aimport%20Mathlib.Data.Finite.Defs%0Aimport%20Mathlib.Data.List.Duplicate%0Aimport%20Mathlib.Data.List.Chain%0Aimport%20Mathlib.Data.Fintype.List%0Aimport%20Mathlib.Data.Fintype.Card%0A%0Anamespace%20List%0A%0Avariable%20%7Bl%20l%E2%82%81%20l%E2%82%82%20%3A%20List%20%CE%B1%7D%0Avariable%20%7BR%20%3A%20%CE%B1%20%E2%86%92%20%CE%B1%20%E2%86%92%20Prop%7D%0A%0Alemma%20Chain'.nodup_of_trans_irreflex%20(R_trans%20%3A%20Transitive%20R)%20(R_irrefl%20%3A%20Irreflexive%20R)%20(h_chain%20%3A%20l.Chain'%20R)%20%3A%20l.Nodup%20%3A%3D%20by%0A%20%20by_contra%20hC%3B%0A%20%20replace%20%E2%9F%A8d%2C%20hC%E2%9F%A9%20%3A%3D%20List.exists_duplicate_iff_not_nodup.mpr%20hC%3B%0A%20%20have%20%3A%3D%20List.duplicate_iff_sublist.mp%20hC%3B%0A%20%20have%20%3A%3D%20%40List.Chain'.sublist%20%CE%B1%20R%20%5Bd%2C%20d%5D%20l%20%E2%9F%A8by%20aesop%E2%9F%A9%20h_chain%20this%3B%0A%20%20simp%20at%20this%3B%0A%20%20exact%20R_irrefl%20d%20this%3B%0A%0Ainstance%20finiteNodupList%20%5BDecidableEq%20%CE%B1%5D%20%5BFinite%20%CE%B1%5D%20%3A%20Finite%20%7B%20l%20%3A%20List%20%CE%B1%20%2F%2F%20l.Nodup%20%7D%20%3A%3D%20%40fintypeNodupList%20%CE%B1%20_%20(Fintype.ofFinite%20%CE%B1)%20%7C%3E.finite%0A%0Alemma%20chains_finite%20%5BDecidableEq%20%CE%B1%5D%20%5BFinite%20%CE%B1%5D%20(R_trans%20%3A%20Transitive%20R)%20(R_irrefl%20%3A%20Irreflexive%20R)%20%3A%20Finite%20%7B%20l%20%3A%20List%20%CE%B1%20%2F%2F%20l.Chain'%20R%20%7D%20%3A%3D%20by%0A%20%20apply%20%40Finite.of_injective%20%7B%20l%20%3A%20List%20%CE%B1%20%2F%2F%20l.Chain'%20R%20%7D%20%7B%20l%20%3A%20List%20%CE%B1%20%2F%2F%20l.Nodup%20%7D%20_%20%3Ff%3B%0A%20%20case%20f%20%3D%3E%20intro%20%E2%9F%A8l%2C%20hl%E2%9F%A9%3B%20refine%20%E2%9F%A8l%2C%20List.Chain'.nodup_of_trans_irreflex%20R_trans%20R_irrefl%20hl%E2%9F%A9%3B%0A%20%20simp%20%5BFunction.Injective%5D%3B%0A%0Aend%20List%0A


Last updated: May 02 2025 at 03:31 UTC