Lean source · namespace BFPP

Envelopes.lean

BFPP/Envelopes.lean · 101 lines

1import BFPP.BoundedFamilies23/-!4# Upper and lower ordinal envelopes56The metric proof works on any nonempty preorder. Instantiating the index type7with the ordinals below a nonzero limit gives precisely Section 2.1 of the paper.8-/910namespace BFPP1112set_option autoImplicit false1314open Set1516universe u17variable {ι : Type u} [Preorder ι]1819noncomputable def upperTail (f : BoundedFamily ι) (b : ι) : ℝ :=20  BoundedFamily.supremum (BoundedFamily.reindex (fun j : Ici b => j.val) f)2122noncomputable def lowerTail (f : BoundedFamily ι) (b : ι) : ℝ :=23  BoundedFamily.infimum (BoundedFamily.reindex (fun j : Ici b => j.val) f)2425theorem abs_upperTail_le (f : BoundedFamily ι) (b : ι) : |upperTail f b| ≤ ‖f‖ := by26  letI : Nonempty (Ici b) := ⟨⟨b, le_rfl⟩⟩27  apply abs_le.mpr28  constructor29  · calc30      -‖f‖ ≤ f b := (abs_le.mp (f.abs_apply_le_norm b)).131      _ ≤ upperTail f b :=32        le_ciSup (BoundedFamily.bddAbove_range33          (BoundedFamily.reindex (fun j : Ici b => j.val) f)) ⟨b, le_rfl⟩34  · apply ciSup_le35    intro j36    exact (abs_le.mp (f.abs_apply_le_norm j.val)).23738theorem abs_lowerTail_le (f : BoundedFamily ι) (b : ι) : |lowerTail f b| ≤ ‖f‖ := by39  letI : Nonempty (Ici b) := ⟨⟨b, le_rfl⟩⟩40  apply abs_le.mpr41  constructor42  · apply le_ciInf43    intro j44    exact (abs_le.mp (f.abs_apply_le_norm j.val)).145  · calc46      lowerTail f b ≤ f b :=47        ciInf_le (BoundedFamily.bddBelow_range48          (BoundedFamily.reindex (fun j : Ici b => j.val) f)) ⟨b, le_rfl⟩49      _ ≤ ‖f‖ := (abs_le.mp (f.abs_apply_le_norm b)).25051noncomputable def upperTails (f : BoundedFamily ι) : BoundedFamily ι :=52  BoundedFamily.ofBound (upperTail f) ‖f‖ (abs_upperTail_le f)5354noncomputable def lowerTails (f : BoundedFamily ι) : BoundedFamily ι :=55  BoundedFamily.ofBound (lowerTail f) ‖f‖ (abs_lowerTail_le f)5657theorem upperTails_nonexpansive : LipschitzWith 1 (upperTails : BoundedFamily ι → _) := by58  apply LipschitzWith.of_dist_le_mul59  intro f g60  simp only [NNReal.coe_one, one_mul]61  apply (BoundedFamily.dist_le_iff _ _ dist_nonneg).262  intro b63  letI : Nonempty (Ici b) := ⟨⟨b, le_rfl⟩⟩64  have h := (BoundedFamily.supremum_nonexpansive.comp65    (BoundedFamily.reindex_nonexpansive (fun j : Ici b => j.val))).dist_le_mul f g66  simpa only [NNReal.coe_mul, NNReal.coe_one, mul_one, one_mul,67    Real.dist_eq, upperTails, BoundedFamily.ofBound_apply, upperTail,68    Function.comp_def] using h6970theorem lowerTails_nonexpansive : LipschitzWith 1 (lowerTails : BoundedFamily ι → _) := by71  apply LipschitzWith.of_dist_le_mul72  intro f g73  simp only [NNReal.coe_one, one_mul]74  apply (BoundedFamily.dist_le_iff _ _ dist_nonneg).275  intro b76  letI : Nonempty (Ici b) := ⟨⟨b, le_rfl⟩⟩77  have h := (BoundedFamily.infimum_nonexpansive.comp78    (BoundedFamily.reindex_nonexpansive (fun j : Ici b => j.val))).dist_le_mul f g79  simpa only [NNReal.coe_mul, NNReal.coe_one, mul_one, one_mul,80    Real.dist_eq, lowerTails, BoundedFamily.ofBound_apply, lowerTail,81    Function.comp_def] using h8283noncomputable def upperEnvelope (f : BoundedFamily ι) : ℝ :=84  BoundedFamily.infimum (upperTails f)8586noncomputable def lowerEnvelope (f : BoundedFamily ι) : ℝ :=87  BoundedFamily.supremum (lowerTails f)8889theorem upperEnvelope_nonexpansive [Nonempty ι] :90    LipschitzWith 1 (upperEnvelope : BoundedFamily ι → ℝ) := by91  change LipschitzWith 1 (fun f : BoundedFamily ι => BoundedFamily.infimum (upperTails f))92  simpa only [mul_one, Function.comp_def, upperEnvelope] using93    BoundedFamily.infimum_nonexpansive.comp upperTails_nonexpansive9495theorem lowerEnvelope_nonexpansive [Nonempty ι] :96    LipschitzWith 1 (lowerEnvelope : BoundedFamily ι → ℝ) := by97  change LipschitzWith 1 (fun f : BoundedFamily ι => BoundedFamily.supremum (lowerTails f))98  simpa only [mul_one, Function.comp_def, lowerEnvelope] using99    BoundedFamily.supremum_nonexpansive.comp lowerTails_nonexpansive100101end BFPP

SHA-256

8f53391e1053d89c104cb7602d950af094e454fb7b4babc0e1c3324c3b000db0