Lean source · namespace BFPP
BooleanGap.lean
BFPP/BooleanGap.lean · 108 lines
1import BFPP.ChainCompleteness2import Mathlib.Order.BooleanAlgebra.Basic34/-! # A gap in a maximal chain -/56namespace BFPP78set_option autoImplicit false9open Set1011variable (B : Type*) [Lattice B] [BoundedOrder B]1213/-- The order-theoretic gap before selecting cofinal ordinal sequences. -/14structure ChainGap where15 lower : Set B16 upper : Set B17 lower_chain : IsChain (· ≤ ·) lower18 upper_chain : IsChain (· ≤ ·) upper19 bot_mem : ⊥ ∈ lower20 top_mem : ⊤ ∈ upper21 cross : ∀ y ∈ lower, ∀ z ∈ upper, y ≤ z22 lower_no_max : ∀ y ∈ lower, ∃ y' ∈ lower, y < y'23 upper_no_min : ∀ z ∈ upper, ∃ z' ∈ upper, z' < z24 no_interpolant : ¬ ∃ b, (∀ y ∈ lower, y ≤ b) ∧ ∀ z ∈ upper, b ≤ z2526variable {B}2728theorem exists_chainGap (h : ∃ s : Set B, ¬ ∃ b, IsLUB s b) : Nonempty (ChainGap B) := by29 classical30 obtain ⟨c, hc, hn⟩ := exists_chain_without_isLUB h31 obtain ⟨M', hM', hcM⟩ := hc.exists_maxChain32 let M : Flag B := Flag.ofIsMaxChain M' hM'33 let Y : Set B := {y | y ∈ M ∧ ∃ a ∈ c, y ≤ a}34 let Z : Set B := {z | z ∈ M ∧ z ∉ Y}35 have hcY : c ⊆ Y := fun a ha => ⟨hcM ha, a, ha, le_rfl⟩36 have hnotub : ∀ y ∈ Y, y ∉ upperBounds c := by37 rintro y ⟨hyM, a, ha, hya⟩ hy38 apply hn39 exact ⟨y, hy, fun b hb => hya.trans (hb ha)⟩40 have hcross : ∀ y ∈ Y, ∀ z ∈ Z, y ≤ z := by41 rintro y ⟨hyM, a, ha, hya⟩ z ⟨hzM, hzY⟩42 rcases M.le_or_le hyM hzM with hyz | hzy43 · exact hyz44 · exact (hzY ⟨hzM, a, ha, hzy.trans hya⟩).elim45 have hYmax : ∀ y ∈ Y, ∃ y' ∈ Y, y < y' := by46 intro y hy47 have hbad := hnotub y hy48 change ¬ (∀ ⦃a⦄, a ∈ c → a ≤ y) at hbad49 push Not at hbad50 obtain ⟨a, ha, hay⟩ := hbad51 refine ⟨a, hcY ha, ?_⟩52 exact lt_of_le_not_ge ((M.le_or_le hy.1 (hcM ha)).resolve_right hay) hay53 have hZmin : ∀ z ∈ Z, ∃ z' ∈ Z, z' < z := by54 intro z hz55 by_contra hnone56 have hleast : ∀ z' ∈ Z, z ≤ z' := by57 intro z' hz'58 rcases M.le_or_le hz.1 hz'.1 with hzz | hzz59 · exact hzz60 · by_contra h61 exact hnone ⟨z', hz', lt_of_le_not_ge hzz h⟩62 have hzupper : z ∈ upperBounds c := fun a ha => hcross a (hcY ha) z hz63 apply hn64 refine ⟨z, hzupper, ?_⟩65 intro b hb66 have hmeetM : z ⊓ b ∈ M := by67 apply Flag.mem_iff_forall_le_or_ge.mpr68 intro m hm69 by_cases hmY : m ∈ Y70 · right71 obtain ⟨a, ha, hma⟩ := hmY.272 exact le_inf (hcross m hmY z hz) (hma.trans (hb ha))73 · exact Or.inl (inf_le_left.trans (hleast m ⟨hm, hmY⟩))74 have hmeetub : z ⊓ b ∈ upperBounds c := fun a ha => le_inf (hzupper ha) (hb ha)75 have hmeetZ : z ⊓ b ∈ Z := ⟨hmeetM, fun hY => hnotub _ hY hmeetub⟩76 exact (hleast _ hmeetZ).trans inf_le_right77 have hcne : c.Nonempty := by78 by_contra he79 rw [Set.not_nonempty_iff_eq_empty.mp he] at hn80 exact hn ⟨⊥, isLUB_empty⟩81 refine ⟨{82 lower := Y83 upper := Z84 lower_chain := M.chain_le.mono (fun _ h => h.1)85 upper_chain := M.chain_le.mono (fun _ h => h.1)86 bot_mem := ?_87 top_mem := ?_88 cross := hcross89 lower_no_max := hYmax90 upper_no_min := hZmin91 no_interpolant := ?_ }⟩92 · obtain ⟨a, ha⟩ := hcne93 exact ⟨M.bot_mem, a, ha, bot_le⟩94 · exact ⟨M.top_mem, fun ht => hnotub ⊤ ht (fun _ _ => le_top)⟩95 · rintro ⟨b, hYb, hbZ⟩96 have hbM : b ∈ M := by97 apply Flag.mem_iff_forall_le_or_ge.mpr98 intro m hm99 by_cases hmY : m ∈ Y100 · exact Or.inr (hYb m hmY)101 · exact Or.inl (hbZ m ⟨hm, hmY⟩)102 by_cases hbY : b ∈ Y103 · obtain ⟨b', hb', hlt⟩ := hYmax b hbY104 exact (not_le_of_gt hlt) (hYb b' hb')105 · obtain ⟨b', hb', hlt⟩ := hZmin b ⟨hbM, hbY⟩106 exact (not_le_of_gt hlt) (hbZ b' hb')107108end BFPPSHA-256
9aec82ae26fe68648266dbbdbd4609c2cfa9928a08ef21a762756fba17be7b42