Encyclopedia Foundation Foundation Pair Kernel Lattice3 Pair Min Ge Via Two Disjoint Walks
Foundation Pair Kernel Lattice3 Pair Min Ge Via Two Disjoint Walks
A theorem about the minimum cost of connecting two points in a network, proved by finding two separate routes.
The two-path lower bound
In graph theory, the effective resistance between two nodes is a measure of how hard it is to push current between them through a network of resistors. The Recognition Science framework's ledger, a discrete record of events, treats this resistance as a cost: the minimum energy needed to connect two sites. The declaration pairMin_ge_via_two_paths proves a lower bound on this cost using a simple geometric idea. If two distinct paths connect the same pair of points, and each path is made of unit-cost steps, then the minimum cost is at least 1. The proof constructs a flow that splits evenly between the two paths, and the energy of that flow is exactly 1, so the true minimum cannot be smaller.
The result is a theorem in the machine-checked library of formal theorems, proved without any additional axioms. It applies to any graph whose edge weights are either 0 or 1, and it requires the two paths to share no vertices except their endpoints. The theorem is a sharpening of an earlier bound: a single path of length m only gives the weaker bound 1/m, which shrinks as the path grows. Two disjoint paths give a constant bound that does not shrink, because the flow can be split between them. This is the first step toward a deeper fact: in three dimensions, the minimum cost between distant points stays bounded away from zero, unlike in one dimension where it decays like 1/distance.
The theorem does not claim that two paths always exist, nor that the bound is tight. It only says that if two disjoint unit-cost paths exist, then the cost is at least 1. In the three-dimensional lattice box where this theorem is applied, the two paths are constructed explicitly along two different axes, giving the constant lower bound that the dimension dichotomy requires. The theorem is a tool, not a conclusion: it provides the lower bound, but the full statement about three-dimensional behavior remains an open target.
THEOREM pairMin_ge_one_via_two_paths · IndisputableMonolith/Foundation/PairKernelLattice3.lean
/-- **Two-parallel-paths lower bound (graph-generic).** Let `a, u, v, b` be four distinct sites of
a 0/1-weighted ledger graph, with the four edges `a—u`, `u—b`, `a—v`, `v—b` all present
(weight `1`). Then `pairMin G a b ≥ 1`, even though `a, b` need not be adjacent: the unit flow
that splits `½ : ½` between the two length-2 paths dissipates energy exactly `1`, and Thomson
duality (`pairMin_ge_inv_flowEnergy`) turns that into the lower bound. Contrast the 1D chain,
where a distance-2 pair has `pairMin ≤ ½` (`pairMin_band_le_inv_dist`) because no second
parallel route exists — this is the smallest strict recurrence/transience witness. -/
theorem pairMin_ge_one_via_two_paths {n : ℕ} (G : WeightedLedgerGraph n)
(hw01 : ∀ i j, G.weight i j = 0 ∨ G.weight i j = 1)
{a u v b : Fin n}
(hau : a ≠ u) (hav : a ≠ v) (hab : a ≠ b)
(hub : u ≠ b) (hvb : v ≠ b) (huv : u ≠ v)
(wau : G.weight a u = 1) (wub : G.weight u b = 1)
(wav : G.weight a v = 1) (wvb : G.weight v b = 1) :
(1:ℝ) ≤ pairMin G a b := by
have hua := hau.symm
have hva := hav.symm
have hba := hab.symm
have hbu := hub.symm
have hbv := hvb.symm
have hvu := huv.symm
have htheta : ∀ i j : Fin n, twoPathFlow a u v b i j
= (1 / 2) * ((if i = a ∧ j = u then (1:ℝ) else if i = u ∧ j = a then (-1:ℝ) else 0)
+ (if i = u ∧ j = b then (1:ℝ) else if i = b ∧ j = u then (-1:ℝ) else 0)
+ (if i = a ∧ j = v then (1:ℝ) else if i = v ∧ j = a then (-1:ℝ) else 0)
+ (if i = v ∧ j = b then (1:ℝ) else if i = b ∧ j = v then (-1:ℝ) else 0)) := by
intro i j
unfold twoPathFlow fourEdgeSum
rw [ep_val hau i j, ep_val hub i j, ep_val hav i j, ep_val hvb i j]
have tau_au : twoPathFlow a u v b a u = 1 / 2 := by
rw [htheta a u, if_pos (⟨rfl, rfl⟩ : a = a ∧ u = u),
if_neg (fun h => hau h.1), if_neg (fun h => hab h.1),
if_neg (fun h => huv h.2), if_neg (fun h => hav h.1),
if_neg (fun h => hav h.1), if_neg (fun h => hab h.1)]
norm_num
have tau_av : twoPathFlow a u v b a v = 1 / 2 := by
rw [htheta a v,
if_neg (fun h => hvu h.2), if_neg (fun h => hau h.1),
if_neg (fun h => hau h.1), if_neg (fun h => hab h.1),
if_pos (⟨rfl, rfl⟩ : a = a ∧ v = v),
if_neg (fun h => hav h.1), if_neg (fun h => hab h.1)]
norm_num
have tau_ua : twoPathFlow a u v b u a = -1 / 2 := by
rw [htheta u a,
if_neg (fun h => hua h.1), if_pos (⟨rfl, rfl⟩ : u = u ∧ a = a),
if_neg (fun h => hab h.2), if_neg (fun h => hub h.1),
if_neg (fun h => hua h.1), if_neg (fun h => huv h.1),
if_neg (fun h => huv h.1), if_neg (fun h => hub h.1)]
norm_num
have tau_ub : twoPathFlow a u v b u b = 1 / 2 := by
rw [htheta u b,
if_neg (fun h => hua h.1), if_neg (fun h => hba h.2),
if_pos (⟨rfl, rfl⟩ : u = u ∧ b = b),
if_neg (fun h => hua h.1), if_neg (fun h => huv h.1),
if_neg (fun h => huv h.1), if_neg (fun h => hub h.1)]
norm_num
have tau_va : twoPathFlow a u v b v a = -1 / 2 := by
rw [htheta v a,
if_neg (fun h => hva h.1), if_neg (fun h => hvu h.1),
if_neg (fun h => hvu h.1), if_neg (fun h => hvb h.1),
if_neg (fun h => hva h.1), if_pos (⟨rfl, rfl⟩ : v = v ∧ a = a),
if_neg (fun h => hab h.2), if_neg (fun h => hvb h.1)]
norm_num
have tau_vb : twoPathFlow a u v b v b = 1 / 2 := by
rw [htheta v b,
if_neg (fun h => hva h.1), if_neg (fun h => hvu h.1),
if_neg (fun h => hvu h.1), if_neg (fun h => hvb h.1),
if_neg (fun h => hva h.1), if_neg (fun h => hba h.2),
if_pos (⟨rfl, rfl⟩ : v = v ∧ b = b)]
norm_num
have tau_bu : twoPathFlow a u v b b u = -1 / 2 := by
rw [htheta b u,
if_neg (fun h => hba h.1), if_neg (fun h => hbu h.1),
if_neg (fun h => hbu h.1), if_pos (⟨rfl, rfl⟩ : b = b ∧ u = u),
if_neg (fun h => hba h.1), if_neg (fun h => hbv h.1),
if_neg (fun h => hbv h.1), if_neg (fun h => huv h.2)]
norm_num
have tau_bv : twoPathFlow a u v b b v = -1 / 2 := by
rw [htheta b v,
if_neg (fun h => hba h.1), if_neg (fun h => hbu h.1),
if_neg (fun h => hbu h.1), if_neg (fun h => hvu h.2),
if_neg (fun h => hba h.1), if_neg (fun h => hbv h.1),
if_neg (fun h => hbv h.1), if_pos (⟨rfl, rfl⟩ : b = b ∧ v = v)]
norm_num
have theta_a_off : ∀ j : Fin n, j ≠ u → j ≠ v → twoPathFlow a u v b a j = 0 := by
intro j hju hjv
rw [htheta a j,
if_neg (fun h => hju h.2), if_neg (fun h => hau h.1),
if_neg (fun h => hau h.1), if_neg (fun h => hab h.1),
if_neg (fun h => hjv h.2), if_neg (fun h => hav h.1),
if_neg (fun h => hav h.1), if_neg (fun h => hab h.1)]
norm_num
have theta_u_off : ∀ j : Fin n, j ≠ a → j ≠ b → twoPathFlow a u v b u j = 0 := by
intro j hja hjb
rw [htheta u j,
if_neg (fun h => hua h.1), if_neg (fun h => hja h.2),
if_neg (fun h => hjb h.2), if_neg (fun h => hub h.1),
if_neg (fun h => hua h.1), if_neg (fun h => huv h.1),
if_neg (fun h => huv h.1), if_neg (fun h => hub h.1)]
norm_num
have theta_v_off : ∀ j : Fin n, j ≠ a → j ≠ b → twoPathFlow a u v b v j = 0 := by
intro j hja hjb
rw [htheta v j,
if_neg (fun h => hva h.1), if_neg (fun h => hvu h.1),
if_neg (fun h => hvu h.1), if_neg (fun h => hvb h.1),
if_neg (fun h => hva h.1), if_neg (fun h => hja h.2),
if_neg (fun h => hjb h.2), if_neg (fun h => hvb h.1)]
norm_num
have theta_b_off : ∀ j : Fin n, j ≠ u → j ≠ v → twoPathFlow a u v b b j = 0 := by
intro j hju hjv
rw [htheta b j,
if_neg (fun h => hba h.1), if_neg (fun h => hbu h.1),
if_neg (fun h => hbu h.1), if_neg (fun h => hju h.2),
if_neg (fun h => hba h.1), if_neg (fun h => hbv h.1),
if_neg (fun h => hbv h.1), if_neg (fun h => hjv h.2)]
norm_num
have theta_row_zero : ∀ i j : Fin n, i ≠ a → i ≠ u → i ≠ v → i ≠ b →
twoPathFlow a u v b i j = 0 := by
intro i j hia hiu hiv hib
rw [htheta i j,
if_neg (fun h => hia h.1), if_neg (fun h => hiu h.1),
if_neg (fun h => hiu h.1), if_neg (fun h => hib h.1),
if_neg (fun h => hia h.1), if_neg (fun h => hiv h.1),
if_neg (fun h => hiv h.1), if_neg (fun h => hib h.1)]
norm_num
have rowa : (∑ j : Fin n, twoPathFlow a u v b a j ^ 2) = 1 / 2 := by
have hz : ∀ j ∈ (Finset.univ : Finset (Fin n)), j ∉ ({u, v} : Finset (Fin n)) →
twoPathFlow a u v b a j ^ 2 = 0 := by
intro j _ hj
simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hj
rw [theta_a_off j hj.1 hj.2]; norm_num
rw [← Finset.sum_subset (Finset.subset_univ ({u, v} : Finset (Fin n))) hz,
Finset.sum_pair huv, tau_au, tau_av]
norm_num
have rowu : (∑ j : Fin n, twoPathFlow a u v b u j ^ 2) = 1 / 2 := by
have hz : ∀ j ∈ (Finset.univ : Finset (Fin n)), j ∉ ({a, b} : Finset (Fin n)) →
twoPathFlow a u v b u j ^ 2 = 0 := by
intro j _ hj
simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hj
rw [theta_u_off j hj.1 hj.2]; norm_num
rw [← Finset.sum_subset (Finset.subset_univ ({a, b} : Finset (Fin n))) hz,
Finset.sum_pair hab, tau_ua, tau_ub]
norm_num
have rowv : (∑ j : Fin n, twoPathFlow a u v b v j ^ 2) = 1 / 2 := by
have hz : ∀ j ∈ (Finset.univ : Finset (Fin n)), j ∉ ({a, b} : Finset (Fin n)) →
twoPathFlow a u v b v j ^ 2 = 0 := by
intro j _ hj
simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hj
rw [theta_v_off j hj.1 hj.2]; norm_num
rw [← Finset.sum_subset (Finset.subset_univ ({a, b} : Finset (Fin n))) hz,
Finset.sum_pair hab, tau_va, tau_vb]
norm_num
have rowb : (∑ j : Fin n, twoPathFlow a u v b b j ^ 2) = 1 / 2 := by
have hz : ∀ j ∈ (Finset.univ : Finset (Fin n)), j ∉ ({u, v} : Finset (Fin n)) →
twoPathFlow a u v b b j ^ 2 = 0 := by
intro j _ hj
simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hj
rw [theta_b_off j hj.1 hj.2]; norm_num
rw [← Finset.sum_subset (Finset.subset_univ ({u, v} : Finset (Fin n))) hz,
Finset.sum_pair huv, tau_bu, tau_bv]
norm_num
have hset : (∑ i ∈ ({a, u, v, b} : Finset (Fin n)), ∑ j : Fin n, twoPathFlow a u v b i j ^ 2)
= (∑ j : Fin n, twoPathFlow a u v b a j ^ 2)
+ (∑ j : Fin n, twoPathFlow a u v b u j ^ 2)
+ (∑ j : Fin n, twoPathFlow a u v b v j ^ 2)
+ (∑ j : Fin n, twoPathFlow a u v b b j ^ 2) := by
rw [Finset.sum_insert (by
simp only [Finset.mem_insert, Finset.mem_singleton, not_or]; exact ⟨hau, hav, hab⟩),
Finset.sum_insert (by
simp only [Finset.mem_insert, Finset.mem_singleton, not_or]; exact ⟨huv, hub⟩),
Finset.sum_insert (by
simp only [Finset.mem_singleton]; exact hvb),
Finset.sum_singleton]
ring
have hE : flowEnergy (twoPathFlow a u v b) = 1 := by
unfold flowEnergy
have hz : ∀ i ∈ (Finset.univ : Finset (Fin n)), i ∉ ({a, u, v, b} : Finset (Fin n)) →
(∑ j : Fin n, twoPathFlow a u v b i j ^ 2) = 0 := by
intro i _ hi
simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hi
exact Finset.sum_eq_zero (fun j _ => by
rw [theta_row_zero i j hi.1 hi.2.1 hi.2.2.1 hi.2.2.2]; norm_num)
rw [← Finset.sum_subset (Finset.subset_univ ({a, u, v, b} : Finset (Fin n))) hz,
hset, rowa, rowu, rowv, rowb]
norm_num
have hsupp : ∀ i j, G.weight i j = 0 → twoPathFlow a u v b i j = 0 := by
intro i j hw
unfold twoPathFlow fourEdgeSum
rw [ep_zero_of_weight_zero G hau wau i j hw, ep_zero_of_weight_zero G hub wub i j hw,
ep_zero_of_weight_zero G hav wav i j hw, ep_zero_of_weight_zero G hvb wvb i j hw]
ring
have hdiva : divF (twoPathFlow a u v b) a = 1 := by
rw [twoPathFlow_divF, elementaryPosting_div_source a u hau, ep_div_off u b a hau hab,
elementaryPosting_div_source a v hav, ep_div_off v b a hav hab]
norm_num
have hdiv0 : ∀ i, i ≠ a → i ≠ b → divF (twoPathFlow a u v b) i = 0 := by
intro i hia hib
rw [twoPathFlow_divF]
by_cases hiu : i = u
· rw [hiu, elementaryPosting_div_sink a u hau, elementaryPosting_div_source u b hub,
ep_div_off a v u hua huv, ep_div_off v b u huv hub]
norm_num
· by_cases hiv : i = v
· rw [hiv, ep_div_off a u v hva hvu, ep_div_off u b v hvu hvb,
elementaryPosting_div_sink a v hav, elementaryPosting_div_source v b hvb]
norm_num
· rw [ep_div_off a u i hia hiu, ep_div_off u b i hiu hib,
ep_div_off a v i hia hiv, ep_div_off v b i hiv hib]
norm_num
have hEpos : 0 < flowEnergy (twoPathFlow a u v b) := by rw [hE]; norm_num
have hbound := pairMin_ge_inv_flowEnergy G hw01 hab (twoPathFlow a u v b)
(twoPathFlow_antisym a u v b) hsupp hdiva hdiv0 hEpos
rw [hE] at hbound
norm_num at hbound
exact hbound
What this page does not claim
The theorem does not prove that two disjoint paths always exist in any given graph. The theorem does not establish the three-dimensional dimension dichotomy, which remains an open target. The theorem does not claim the bound is tight or that the minimum cost equals 1.
Verify this page
Every tagged claim above names its theorem. To check one yourself rather than trust this page, elaborate the source module with Lean 4 and audit its axiom basis:
$ lake env lean IndisputableMonolith/Foundation/PairKernelLattice3.lean
expected axiom basis: [propext, Classical.choice, Quot.sound] (the Lean kernel's standard three; no RS-specific axioms)
A page whose claims cannot be reproduced this way does not ship. In production, every anchor links to the exact declaration in the public source release, and this block carries the build receipt for the page itself.
Derived articles
This page is generated by a question-recursion engine: the questions its answers raise become the next pages. The current agenda, with open targets marked red:
- What is the exact asymptotic behavior of the minimum cost in three dimensions?
- How does the two-path bound generalize to more than two disjoint paths?
- What is the precise relationship between this bound and the lattice Green's function?
MACHINE LAYER · GROUNDED CLAIM TABLE · CLICK TO EXPAND
THEOREM pairMin_ge_one_via_two_paths · IndisputableMonolith/Foundation/PairKernelLattice3.lean
/-- **Two-parallel-paths lower bound (graph-generic).** Let `a, u, v, b` be four distinct sites of a 0/1-weighted ledger graph, with the four edges `a—u`, `u—b`, `a—v`, `v—b` all present (weight `1`). Then `pairMin G a b ≥ 1`, even though `a, b` need not be adjacent: the unit flow that splits `½ : ½` between the two length-2 paths dissipates energy exactly `1`, and Thomson duality (`pairMin_ge_inv_flowEnergy`) turns that into the lower bound. Contrast the 1D chain, where a distance-2 pair has `pairMin ≤ ½` (`pairMin_band_le_inv_dist`) because no second parallel route exists — this is the smallest strict recurrence/transience witness. -/ theorem pairMin_ge_one_via_two_paths {n : ℕ} (G : WeightedLedgerGraph n) (hw01 : ∀ i j, G.weight i j = 0 ∨ G.weight i j = 1) {a u v b : Fin n} (hau : a ≠ u) (hav : a ≠ v) (hab : a ≠ b) (hub : u ≠ b) (hvb : v ≠ b) (huv : u ≠ v) (wau : G.weight a u = 1) (wub : G.weight u b = 1) (wav : G.weight a v = 1) (wvb : G.weight v b = 1) : (1:ℝ) ≤ pairMin G a b := by have hua := hau.symm have hva := hav.symm have hba := hab.symm have hbu := hub.symm have hbv := hvb.symm have hvu := huv.symm have htheta : ∀ i j : Fin n, twoPathFlow a u v b i j = (1 / 2) * ((if i = a ∧ j = u then (1:ℝ) else if i = u ∧ j = a then (-1:ℝ) else 0) + (if i = u ∧ j = b then (1:ℝ) else if i = b ∧ j = u then (-1:ℝ) else 0) + (if i = a ∧ j = v then (1:ℝ) else if i = v ∧ j = a then (-1:ℝ) else 0) + (if i = v ∧ j = b then (1:ℝ) else if i = b ∧ j = v then (-1:ℝ) else 0)) := by intro i j unfold twoPathFlow fourEdgeSum rw [ep_val hau i j, ep_val hub i j, ep_val hav i j, ep_val hvb i j] have tau_au : twoPathFlow a u v b a u = 1 / 2 := by rw [htheta a u, if_pos (⟨rfl, rfl⟩ : a = a ∧ u = u), if_neg (fun h => hau h.1), if_neg (fun h => hab h.1), if_neg (fun h => huv h.2), if_neg (fun h => hav h.1), if_neg (fun h => hav h.1), if_neg (fun h => hab h.1)] norm_num have tau_av : twoPathFlow a u v b a v = 1 / 2 := by rw [htheta a v, if_neg (fun h => hvu h.2), if_neg (fun h => hau h.1), if_neg (fun h => hau h.1), if_neg (fun h => hab h.1), if_pos (⟨rfl, rfl⟩ : a = a ∧ v = v), if_neg (fun h => hav h.1), if_neg (fun h => hab h.1)] norm_num have tau_ua : twoPathFlow a u v b u a = -1 / 2 := by rw [htheta u a, if_neg (fun h => hua h.1), if_pos (⟨rfl, rfl⟩ : u = u ∧ a = a), if_neg (fun h => hab h.2), if_neg (fun h => hub h.1), if_neg (fun h => hua h.1), if_neg (fun h => huv h.1), if_neg (fun h => huv h.1), if_neg (fun h => hub h.1)] norm_num have tau_ub : twoPathFlow a u v b u b = 1 / 2 := by rw [htheta u b, if_neg (fun h => hua h.1), if_neg (fun h => hba h.2), if_pos (⟨rfl, rfl⟩ : u = u ∧ b = b), if_neg (fun h => hua h.1), if_neg (fun h => huv h.1), if_neg (fun h => huv h.1), if_neg (fun h => hub h.1)] norm_num have tau_va : twoPathFlow a u v b v a = -1 / 2 := by rw [htheta v a, if_neg (fun h => hva h.1), if_neg (fun h => hvu h.1), if_neg (fun h => hvu h.1), if_neg (fun h => hvb h.1), if_neg (fun h => hva h.1), if_pos (⟨rfl, rfl⟩ : v = v ∧ a = a), if_neg (fun h => hab h.2), if_neg (fun h => hvb h.1)] norm_num have tau_vb : twoPathFlow a u v b v b = 1 / 2 := by rw [htheta v b, if_neg (fun h => hva h.1), if_neg (fun h => hvu h.1), if_neg (fun h => hvu h.1), if_neg (fun h => hvb h.1), if_neg (fun h => hva h.1), if_neg (fun h => hba h.2), if_pos (⟨rfl, rfl⟩ : v = v ∧ b = b)] norm_num have tau_bu : twoPathFlow a u v b b u = -1 / 2 := by rw [htheta b u, if_neg (fun h => hba h.1), if_neg (fun h => hbu h.1), if_neg (fun h => hbu h.1), if_pos (⟨rfl, rfl⟩ : b = b ∧ u = u), if_neg (fun h => hba h.1), if_neg (fun h => hbv h.1), if_neg (fun h => hbv h.1), if_neg (fun h => huv h.2)] norm_num have tau_bv : twoPathFlow a u v b b v = -1 / 2 := by rw [htheta b v, if_neg (fun h => hba h.1), if_neg (fun h => hbu h.1), if_neg (fun h => hbu h.1), if_neg (fun h => hvu h.2), if_neg (fun h => hba h.1), if_neg (fun h => hbv h.1), if_neg (fun h => hbv h.1), if_pos (⟨rfl, rfl⟩ : b = b ∧ v = v)] norm_num have theta_a_off : ∀ j : Fin n, j ≠ u → j ≠ v → twoPathFlow a u v b a j = 0 := by intro j hju hjv rw [htheta a j, if_neg (fun h => hju h.2), if_neg (fun h => hau h.1), if_neg (fun h => hau h.1), if_neg (fun h => hab h.1), if_neg (fun h => hjv h.2), if_neg (fun h => hav h.1), if_neg (fun h => hav h.1), if_neg (fun h => hab h.1)] norm_num have theta_u_off : ∀ j : Fin n, j ≠ a → j ≠ b → twoPathFlow a u v b u j = 0 := by intro j hja hjb rw [htheta u j, if_neg (fun h => hua h.1), if_neg (fun h => hja h.2), if_neg (fun h => hjb h.2), if_neg (fun h => hub h.1), if_neg (fun h => hua h.1), if_neg (fun h => huv h.1), if_neg (fun h => huv h.1), if_neg (fun h => hub h.1)] norm_num have theta_v_off : ∀ j : Fin n, j ≠ a → j ≠ b → twoPathFlow a u v b v j = 0 := by intro j hja hjb rw [htheta v j, if_neg (fun h => hva h.1), if_neg (fun h => hvu h.1), if_neg (fun h => hvu h.1), if_neg (fun h => hvb h.1), if_neg (fun h => hva h.1), if_neg (fun h => hja h.2), if_neg (fun h => hjb h.2), if_neg (fun h => hvb h.1)] norm_num have theta_b_off : ∀ j : Fin n, j ≠ u → j ≠ v → twoPathFlow a u v b b j = 0 := by intro j hju hjv rw [htheta b j, if_neg (fun h => hba h.1), if_neg (fun h => hbu h.1), if_neg (fun h => hbu h.1), if_neg (fun h => hju h.2), if_neg (fun h => hba h.1), if_neg (fun h => hbv h.1), if_neg (fun h => hbv h.1), if_neg (fun h => hjv h.2)] norm_num have theta_row_zero : ∀ i j : Fin n, i ≠ a → i ≠ u → i ≠ v → i ≠ b → twoPathFlow a u v b i j = 0 := by intro i j hia hiu hiv hib rw [htheta i j, if_neg (fun h => hia h.1), if_neg (fun h => hiu h.1), if_neg (fun h => hiu h.1), if_neg (fun h => hib h.1), if_neg (fun h => hia h.1), if_neg (fun h => hiv h.1), if_neg (fun h => hiv h.1), if_neg (fun h => hib h.1)] norm_num have rowa : (∑ j : Fin n, twoPathFlow a u v b a j ^ 2) = 1 / 2 := by have hz : ∀ j ∈ (Finset.univ : Finset (Fin n)), j ∉ ({u, v} : Finset (Fin n)) → twoPathFlow a u v b a j ^ 2 = 0 := by intro j _ hj simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hj rw [theta_a_off j hj.1 hj.2]; norm_num rw [← Finset.sum_subset (Finset.subset_univ ({u, v} : Finset (Fin n))) hz, Finset.sum_pair huv, tau_au, tau_av] norm_num have rowu : (∑ j : Fin n, twoPathFlow a u v b u j ^ 2) = 1 / 2 := by have hz : ∀ j ∈ (Finset.univ : Finset (Fin n)), j ∉ ({a, b} : Finset (Fin n)) → twoPathFlow a u v b u j ^ 2 = 0 := by intro j _ hj simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hj rw [theta_u_off j hj.1 hj.2]; norm_num rw [← Finset.sum_subset (Finset.subset_univ ({a, b} : Finset (Fin n))) hz, Finset.sum_pair hab, tau_ua, tau_ub] norm_num have rowv : (∑ j : Fin n, twoPathFlow a u v b v j ^ 2) = 1 / 2 := by have hz : ∀ j ∈ (Finset.univ : Finset (Fin n)), j ∉ ({a, b} : Finset (Fin n)) → twoPathFlow a u v b v j ^ 2 = 0 := by intro j _ hj simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hj rw [theta_v_off j hj.1 hj.2]; norm_num rw [← Finset.sum_subset (Finset.subset_univ ({a, b} : Finset (Fin n))) hz, Finset.sum_pair hab, tau_va, tau_vb] norm_num have rowb : (∑ j : Fin n, twoPathFlow a u v b b j ^ 2) = 1 / 2 := by have hz : ∀ j ∈ (Finset.univ : Finset (Fin n)), j ∉ ({u, v} : Finset (Fin n)) → twoPathFlow a u v b b j ^ 2 = 0 := by intro j _ hj simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hj rw [theta_b_off j hj.1 hj.2]; norm_num rw [← Finset.sum_subset (Finset.subset_univ ({u, v} : Finset (Fin n))) hz, Finset.sum_pair huv, tau_bu, tau_bv] norm_num have hset : (∑ i ∈ ({a, u, v, b} : Finset (Fin n)), ∑ j : Fin n, twoPathFlow a u v b i j ^ 2) = (∑ j : Fin n, twoPathFlow a u v b a j ^ 2) + (∑ j : Fin n, twoPathFlow a u v b u j ^ 2) + (∑ j : Fin n, twoPathFlow a u v b v j ^ 2) + (∑ j : Fin n, twoPathFlow a u v b b j ^ 2) := by rw [Finset.sum_insert (by simp only [Finset.mem_insert, Finset.mem_singleton, not_or]; exact ⟨hau, hav, hab⟩), Finset.sum_insert (by simp only [Finset.mem_insert, Finset.mem_singleton, not_or]; exact ⟨huv, hub⟩), Finset.sum_insert (by simp only [Finset.mem_singleton]; exact hvb), Finset.sum_singleton] ring have hE : flowEnergy (twoPathFlow a u v b) = 1 := by unfold flowEnergy have hz : ∀ i ∈ (Finset.univ : Finset (Fin n)), i ∉ ({a, u, v, b} : Finset (Fin n)) → (∑ j : Fin n, twoPathFlow a u v b i j ^ 2) = 0 := by intro i _ hi simp only [Finset.mem_insert, Finset.mem_singleton, not_or] at hi exact Finset.sum_eq_zero (fun j _ => by rw [theta_row_zero i j hi.1 hi.2.1 hi.2.2.1 hi.2.2.2]; norm_num) rw [← Finset.sum_subset (Finset.subset_univ ({a, u, v, b} : Finset (Fin n))) hz, hset, rowa, rowu, rowv, rowb] norm_num have hsupp : ∀ i j, G.weight i j = 0 → twoPathFlow a u v b i j = 0 := by intro i j hw unfold twoPathFlow fourEdgeSum rw [ep_zero_of_weight_zero G hau wau i j hw, ep_zero_of_weight_zero G hub wub i j hw, ep_zero_of_weight_zero G hav wav i j hw, ep_zero_of_weight_zero G hvb wvb i j hw] ring have hdiva : divF (twoPathFlow a u v b) a = 1 := by rw [twoPathFlow_divF, elementaryPosting_div_source a u hau, ep_div_off u b a hau hab, elementaryPosting_div_source a v hav, ep_div_off v b a hav hab] norm_num have hdiv0 : ∀ i, i ≠ a → i ≠ b → divF (twoPathFlow a u v b) i = 0 := by intro i hia hib rw [twoPathFlow_divF] by_cases hiu : i = u · rw [hiu, elementaryPosting_div_sink a u hau, elementaryPosting_div_source u b hub, ep_div_off a v u hua huv, ep_div_off v b u huv hub] norm_num · by_cases hiv : i = v · rw [hiv, ep_div_off a u v hva hvu, ep_div_off u b v hvu hvb, elementaryPosting_div_sink a v hav, elementaryPosting_div_source v b hvb] norm_num · rw [ep_div_off a u i hia hiu, ep_div_off u b i hiu hib, ep_div_off a v i hia hiv, ep_div_off v b i hiv hib] norm_num have hEpos : 0 < flowEnergy (twoPathFlow a u v b) := by rw [hE]; norm_num have hbound := pairMin_ge_inv_flowEnergy G hw01 hab (twoPathFlow a u v b) (twoPathFlow_antisym a u v b) hsupp hdiva hdiv0 hEpos rw [hE] at hbound norm_num at hbound exact hboundIf two distinct unit-cost paths connect the same pair of points, then the minimum cost is at least 1. pairMin_ge_one_via_two_paths · IndisputableMonolith/Foundation/PairKernelLattice3.lean