Lean source · namespace BFPP
LatticeFixedPoint.lean
BFPP/LatticeFixedPoint.lean · 102 lines
1import BFPP.InvariantIntervals2import Mathlib.Topology.MetricSpace.Lipschitz3import Mathlib.Tactic.Linarith45/-! # A fixed point theorem for complete lattices with interval metric balls -/67namespace BFPP89set_option autoImplicit false10open Set1112variable {A : Type*} [MetricSpace A] [CompleteLattice A]1314theorem fixedPoint_of_interval_balls15 (hballs : ∀ x : A, ∀ r : ℝ, 0 ≤ r → ∃ a b, Metric.closedBall x r = Icc a b)16 (hmid : ∀ l u : A, l ≤ u → ∃ m ∈ Icc l u, ∀ z ∈ Icc l u, dist m z ≤ dist l u / 2)17 (T : A → A) (hLip : LipschitzWith 1 T) : ∃ x, T x = x := by18 classical19 obtain ⟨l, u, hlu, hT, hmin⟩ := exists_minimal_invariant_interval T20 let M := Icc l u21 let r := dist l u / 222 have hr : 0 ≤ r := div_nonneg dist_nonneg (by norm_num)23 let N : Set A := {x | x ∈ M ∧ ∀ y ∈ M, dist x y ≤ r}24 obtain ⟨m, hmM, hm⟩ := hmid l u hlu25 have hmN : m ∈ N := ⟨hmM, hm⟩26 choose a b hab using fun y : M => hballs y.val r hr27 let L := l ⊔ ⨆ y : M, a y28 let U := u ⊓ ⨅ y : M, b y29 have hN : N = Icc L U := by30 ext x31 constructor32 · rintro ⟨hxM, hx⟩33 have hxI : ∀ y : M, x ∈ Icc (a y) (b y) := by34 intro y35 rw [← hab y]36 exact hx y.val y.property37 exact ⟨sup_le hxM.1 (iSup_le (fun y => (hxI y).1)),38 le_inf hxM.2 (le_iInf (fun y => (hxI y).2))⟩39 · intro hx40 refine ⟨⟨le_sup_left.trans hx.1, hx.2.trans inf_le_left⟩, ?_⟩41 intro y hy42 have hxI : x ∈ Icc (a ⟨y, hy⟩) (b ⟨y, hy⟩) :=43 ⟨(le_iSup a ⟨y, hy⟩).trans (le_sup_right.trans hx.1),44 (hx.2.trans inf_le_right).trans (iInf_le b ⟨y, hy⟩)⟩45 rw [← hab ⟨y, hy⟩] at hxI46 exact hxI47 have hLU : L ≤ U := by48 have hmI := hN ▸ hmN49 exact hmI.1.trans hmI.250 have hNT : MapsTo T N N := by51 intro x hx52 have hTx : T x ∈ M := hT hx.153 refine ⟨hTx, ?_⟩54 obtain ⟨a', b', hball⟩ := hballs (T x) r hr55 let p := l ⊔ a'56 let q := u ⊓ b'57 have hsub : Icc p q ⊆ M := fun z hz =>58 ⟨le_sup_left.trans hz.1, hz.2.trans inf_le_left⟩59 have hself : T x ∈ Icc a' b' := by60 rw [← hball]61 simpa using hr62 have hTxI : T x ∈ Icc p q :=63 ⟨sup_le hTx.1 hself.1, le_inf hTx.2 hself.2⟩64 have hpq : p ≤ q := hTxI.1.trans hTxI.265 have hinv : MapsTo T (Icc p q) (Icc p q) := by66 intro z hz67 have hzM := hsub hz68 have hTz := hT hzM69 have hd : dist (T z) (T x) ≤ r := by70 have hdist : dist (T z) (T x) ≤ dist z x := by71 simpa only [NNReal.coe_one, one_mul] using hLip.dist_le_mul z x72 exact hdist.trans (by simpa only [dist_comm] using hx.2 z hzM)73 have hTzI : T z ∈ Icc a' b' := by74 rw [← hball]75 exact hd76 exact ⟨sup_le hTz.1 hTzI.1, le_inf hTz.2 hTzI.2⟩77 have hMsub := hmin p q hpq hsub hinv78 intro y hy79 have hyI := hMsub hy80 have hyab : y ∈ Icc a' b' :=81 ⟨le_sup_right.trans hyI.1, hyI.2.trans inf_le_right⟩82 rw [← hball] at hyab83 simpa only [Metric.mem_closedBall, dist_comm] using hyab84 have hNM : Icc L U ⊆ Icc l u := by85 rw [← hN]86 exact fun x hx => hx.187 have hTN : MapsTo T (Icc L U) (Icc L U) := hN ▸ hNT88 have hMN : M ⊆ N := by89 rw [hN]90 exact hmin L U hLU hNM hTN91 have hlN := hMN (show l ∈ M from ⟨le_rfl, hlu⟩)92 have hdiam := hlN.2 u (show u ∈ M from ⟨hlu, le_rfl⟩)93 have heq : l = u := by94 apply dist_eq_zero.mp95 dsimp [r] at hdiam96 linarith [dist_nonneg (x := l) (y := u)]97 refine ⟨l, ?_⟩98 have hTl := hT (show l ∈ Icc l u from ⟨le_rfl, hlu⟩)99 rw [← heq] at hTl100 exact le_antisymm hTl.2 hTl.1101102end BFPPSHA-256
e3f3f1ac11dbc61d95e8e52bbf5bc635080026831e9d0e3ca6c9ad4153a281e3