Built with
doc-gen4 , running Lean4.
Bubbles (
) indicate interactive fragments: hover for details, tap to reveal contents.
Use
Ctrl+↑ Ctrl+↓ to navigate,
Ctrl+🖱️ to focus.
On Mac, use
Cmd instead of
Ctrl .
/-
Copyright (c) 2020 Adam Topaz. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Adam Topaz
! This file was ported from Lean 3 source module data.set.constructions
! leanprover-community/mathlib commit 9003f28797c0664a49e4179487267c494477d853
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Data.Finset.Basic
/-!
# Constructions involving sets of sets.
## Finite Intersections
We define a structure `FiniteInter` which asserts that a set `S` of subsets of `α` is
closed under finite intersections.
We define `finiteInterClosure` which, given a set `S` of subsets of `α`, is the smallest
set of subsets of `α` which is closed under finite intersections.
`finiteInterClosure S` is endowed with a term of type `FiniteInter` using
`finiteInterClosure_finiteInter`.
-/
variable { α : Type _ } ( S : Set ( Set α ))
/-- A structure encapsulating the fact that a set of sets is closed under finite intersection. -/
structure FiniteInter : Prop where
/-- `univ_mem` states that `Set.univ` is in `S`. -/
univ_mem : Set.univ ∈ S
/-- `inter_mem` states that any two intersections of sets in `S` is also in `S`. -/
inter_mem : ∀ ⦃ s ⦄, s ∈ S → ∀ ⦃ t ⦄, t ∈ S → s ∩ t ∈ S
#align has_finite_inter FiniteInter
namespace FiniteInter
/-- The smallest set of sets containing `S` which is closed under finite intersections. -/
inductive finiteInterClosure : Set (Set α )finiteInterClosure : Set ( Set α )
| basic { s } : s ∈ S → finiteInterClosure : Set (Set α )finiteInterClosure s
| univ : finiteInterClosure : Set (Set α )finiteInterClosure Set.univ : {α : Type ?u.230} → Set α Set.univ
| inter { s t } : finiteInterClosure : Set (Set α )finiteInterClosure s → finiteInterClosure : Set (Set α )finiteInterClosure t → finiteInterClosure : Set (Set α )finiteInterClosure ( s ∩ t )
#align has_finite_inter.finite_inter_closure FiniteInter.finiteInterClosure
theorem finiteInterClosure_finiteInter : FiniteInter ( finiteInterClosure S ) :=
{ univ_mem := finiteInterClosure.univ
inter_mem := fun _ h _ => finiteInterClosure.inter h }
#align has_finite_inter.finite_inter_closure_has_finite_inter FiniteInter.finiteInterClosure_finiteInter
variable { S }
theorem finiteInter_mem ( cond : FiniteInter S ) ( F : Finset ( Set α )) :
↑ F ⊆ S → ⋂₀ (↑ F : Set ( Set α )) ∈ S := by
classical
refine' Finset.induction_on F ( fun _ => _ ) _
· simp [ cond . univ_mem ]
· intro a s _ h1 h2
suffices a ∩ ⋂₀ ↑ s ∈ S by simpa
exact
cond . inter_mem ( h2 ( Finset.mem_insert_self a s ))
( h1 fun x hx => h2 <| Finset.mem_insert_of_mem hx )
#align has_finite_inter.finite_inter_mem FiniteInter.finiteInter_mem
theorem finiteInterClosure_insert { A : Set α } ( cond : FiniteInter S ) ( P )
( H : P ∈ finiteInterClosure ( insert A S )) : P ∈ S ∨ ∃ Q ∈ S , P = A ∩ Q := by
P ∈ S ∨ ∃ Q , Q ∈ S ∧ P = A ∩ Q induction' H with S h T1 T2 _ _ h1 h2 basic S ∈ S✝ ∨ ∃ Q , Q ∈ S✝ ∧ S = A ∩ Q univ Set.univ ∈ S ∨ ∃ Q , Q ∈ S ∧ Set.univ = A ∩ Q inter T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q
P ∈ S ∨ ∃ Q , Q ∈ S ∧ P = A ∩ Q · basic S ∈ S✝ ∨ ∃ Q , Q ∈ S✝ ∧ S = A ∩ Q basic S ∈ S✝ ∨ ∃ Q , Q ∈ S✝ ∧ S = A ∩ Q univ Set.univ ∈ S ∨ ∃ Q , Q ∈ S ∧ Set.univ = A ∩ Q inter T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q cases h basic.inl S ∈ S✝ ∨ ∃ Q , Q ∈ S✝ ∧ S = A ∩ Q basic.inr S ∈ S✝ ∨ ∃ Q , Q ∈ S✝ ∧ S = A ∩ Q
basic S ∈ S✝ ∨ ∃ Q , Q ∈ S✝ ∧ S = A ∩ Q · basic.inl S ∈ S✝ ∨ ∃ Q , Q ∈ S✝ ∧ S = A ∩ Q basic.inl S ∈ S✝ ∨ ∃ Q , Q ∈ S✝ ∧ S = A ∩ Q basic.inr S ∈ S✝ ∨ ∃ Q , Q ∈ S✝ ∧ S = A ∩ Q exact Or.inr : ∀ {a b : Prop }, b → a ∨ b Or.inr ⟨ Set.univ : {α : Type ?u.1969} → Set α Set.univ, cond . univ_mem , basic.inl S ∈ S✝ ∨ ∃ Q , Q ∈ S✝ ∧ S = A ∩ Q by simpa ⟩
basic S ∈ S✝ ∨ ∃ Q , Q ∈ S✝ ∧ S = A ∩ Q · basic.inr S ∈ S✝ ∨ ∃ Q , Q ∈ S✝ ∧ S = A ∩ Q basic.inr S ∈ S✝ ∨ ∃ Q , Q ∈ S✝ ∧ S = A ∩ Q exact Or.inl : ∀ {a b : Prop }, a → a ∨ b Or.inl ( basic.inr S ∈ S✝ ∨ ∃ Q , Q ∈ S✝ ∧ S = A ∩ Q by assumption )
P ∈ S ∨ ∃ Q , Q ∈ S ∧ P = A ∩ Q · univ Set.univ ∈ S ∨ ∃ Q , Q ∈ S ∧ Set.univ = A ∩ Q univ Set.univ ∈ S ∨ ∃ Q , Q ∈ S ∧ Set.univ = A ∩ Q inter T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q exact Or.inl : ∀ {a b : Prop }, a → a ∨ b Or.inl cond . univ_mem
P ∈ S ∨ ∃ Q , Q ∈ S ∧ P = A ∩ Q · inter T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q inter T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q rcases h1 with (h | ⟨Q, hQ, rfl⟩) : ?m.1867 T1 a✝¹
(h h | ⟨Q, hQ, rfl⟩ : ?m.1867 T1 a✝¹
| ⟨Q, hQ, rfl⟩ : ∃ Q , Q ∈ S ∧ T1 = A ∩ Q ⟨Q ⟨Q, hQ, rfl⟩ : ∃ Q , Q ∈ S ∧ T1 = A ∩ Q , hQ ⟨Q, hQ, rfl⟩ : ∃ Q , Q ∈ S ∧ T1 = A ∩ Q , rfl ⟨Q, hQ, rfl⟩ : ∃ Q , Q ∈ S ∧ T1 = A ∩ Q ⟩(h | ⟨Q, hQ, rfl⟩) : ?m.1867 T1 a✝¹
)inter.inl T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q inter.inr.intro.intro A ∩ Q ∩ T2 ∈ S ∨ ∃ Q_1 , Q_1 ∈ S ∧ A ∩ Q ∩ T2 = A ∩ Q_1 inter T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q <;> inter.inl T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q inter.inr.intro.intro A ∩ Q ∩ T2 ∈ S ∨ ∃ Q_1 , Q_1 ∈ S ∧ A ∩ Q ∩ T2 = A ∩ Q_1 inter T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q rcases h2 with (i | ⟨R, hR, rfl⟩) : ?m.1867 T2 a✝¹
(i i | ⟨R, hR, rfl⟩ : ?m.1867 T2 a✝¹
| ⟨R, hR, rfl⟩ : ∃ Q , Q ∈ S ∧ T2 = A ∩ Q ⟨R ⟨R, hR, rfl⟩ : ∃ Q , Q ∈ S ∧ T2 = A ∩ Q , hR ⟨R, hR, rfl⟩ : ∃ Q , Q ∈ S ∧ T2 = A ∩ Q , rfl ⟨R, hR, rfl⟩ : ∃ Q , Q ∈ S ∧ T2 = A ∩ Q ⟩(i | ⟨R, hR, rfl⟩) : ?m.1867 T2 a✝¹
)inter.inl.inl T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q inter.inl.inr.intro.intro T1 ∩ (A ∩ R ) ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ (A ∩ R ) = A ∩ Q
inter T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q · inter.inl.inl T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q inter.inl.inl T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q inter.inl.inr.intro.intro T1 ∩ (A ∩ R ) ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ (A ∩ R ) = A ∩ Q inter.inr.intro.intro.inl A ∩ Q ∩ T2 ∈ S ∨ ∃ Q_1 , Q_1 ∈ S ∧ A ∩ Q ∩ T2 = A ∩ Q_1 inter.inr.intro.intro.inr.intro.intro A ∩ Q ∩ (A ∩ R ) ∈ S ∨ ∃ Q_1 , Q_1 ∈ S ∧ A ∩ Q ∩ (A ∩ R ) = A ∩ Q_1 exact Or.inl : ∀ {a b : Prop }, a → a ∨ b Or.inl ( cond . inter_mem h i )
inter T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q · inter.inl.inr.intro.intro T1 ∩ (A ∩ R ) ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ (A ∩ R ) = A ∩ Q inter.inl.inr.intro.intro T1 ∩ (A ∩ R ) ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ (A ∩ R ) = A ∩ Q inter.inr.intro.intro.inl A ∩ Q ∩ T2 ∈ S ∨ ∃ Q_1 , Q_1 ∈ S ∧ A ∩ Q ∩ T2 = A ∩ Q_1 inter.inr.intro.intro.inr.intro.intro A ∩ Q ∩ (A ∩ R ) ∈ S ∨ ∃ Q_1 , Q_1 ∈ S ∧ A ∩ Q ∩ (A ∩ R ) = A ∩ Q_1 exact
Or.inr : ∀ {a b : Prop }, b → a ∨ b Or.inr ⟨ T1 ∩ R , cond . inter_mem h hR , inter.inl.inr.intro.intro T1 ∩ (A ∩ R ) ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ (A ∩ R ) = A ∩ Q by T1 ∩ (A ∩ R ) = A ∩ (T1 ∩ R )simp only [← Set.inter_assoc : ∀ {α : Type ?u.2396} (a b c : Set α ), a ∩ b ∩ c = a ∩ (b ∩ c ) Set.inter_assoc, Set.inter_comm : ∀ {α : Type ?u.2416} (a b : Set α ), a ∩ b = b ∩ a Set.inter_comm _ A ] ⟩
inter T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q · inter.inr.intro.intro.inl A ∩ Q ∩ T2 ∈ S ∨ ∃ Q_1 , Q_1 ∈ S ∧ A ∩ Q ∩ T2 = A ∩ Q_1 inter.inr.intro.intro.inl A ∩ Q ∩ T2 ∈ S ∨ ∃ Q_1 , Q_1 ∈ S ∧ A ∩ Q ∩ T2 = A ∩ Q_1 inter.inr.intro.intro.inr.intro.intro A ∩ Q ∩ (A ∩ R ) ∈ S ∨ ∃ Q_1 , Q_1 ∈ S ∧ A ∩ Q ∩ (A ∩ R ) = A ∩ Q_1 exact Or.inr : ∀ {a b : Prop }, b → a ∨ b Or.inr ⟨ Q ∩ T2 , cond . inter_mem hQ i , inter.inr.intro.intro.inl A ∩ Q ∩ T2 ∈ S ∨ ∃ Q_1 , Q_1 ∈ S ∧ A ∩ Q ∩ T2 = A ∩ Q_1 by A ∩ Q ∩ T2 = A ∩ (Q ∩ T2 )simp only [ Set.inter_assoc : ∀ {α : Type ?u.2566} (a b c : Set α ), a ∩ b ∩ c = a ∩ (b ∩ c ) Set.inter_assoc] ⟩
inter T1 ∩ T2 ∈ S ∨ ∃ Q , Q ∈ S ∧ T1 ∩ T2 = A ∩ Q · inter.inr.intro.intro.inr.intro.intro A ∩ Q ∩ (A ∩ R ) ∈ S ∨ ∃ Q_1 , Q_1 ∈ S ∧ A ∩ Q ∩ (A ∩ R ) = A ∩ Q_1 inter.inr.intro.intro.inr.intro.intro A ∩ Q ∩ (A ∩ R ) ∈ S ∨ ∃ Q_1 , Q_1 ∈ S ∧ A ∩ Q ∩ (A ∩ R ) = A ∩ Q_1 exact
Or.inr : ∀ {a b : Prop }, b → a ∨ b Or.inr
⟨ Q ∩ R , cond . inter_mem hQ hR , inter.inr.intro.intro.inr.intro.intro A ∩ Q ∩ (A ∩ R ) ∈ S ∨ ∃ Q_1 , Q_1 ∈ S ∧ A ∩ Q ∩ (A ∩ R ) = A ∩ Q_1 by
ext x
constructor h.mp x ∈ A ∩ Q ∩ (A ∩ R ) → x ∈ A ∩ (Q ∩ R )h.mpr x ∈ A ∩ (Q ∩ R ) → x ∈ A ∩ Q ∩ (A ∩ R ) <;> h.mp x ∈ A ∩ Q ∩ (A ∩ R ) → x ∈ A ∩ (Q ∩ R )h.mpr x ∈ A ∩ (Q ∩ R ) → x ∈ A ∩ Q ∩ (A ∩ R ) simp ( config := { contextual := true }) ⟩
#align has_finite_inter.finite_inter_closure_insert FiniteInter.finiteInterClosure_insert
end FiniteInter