import Mathlib.Data.Set.Basic
import Mathlib.Data.Set.Finite
import Mathlib.Tactic.Explode
set_option linter.unusedVariables false
set_option autoImplicit false
Note: This file is adapted from bridgekat/filter-game
namespace FilterGame
variable {Ξ±: Type ?u.2
Ξ± : Type _: Type (u_1 + 1)
Type _}
Given a type Ξ±
, a filter is a collection of subsets of Ξ±
which
structure Filter: Type u_1 β Type u_1
Filter (Ξ±: Type u_1
Ξ± : Type _: Type (u_1 + 1)
Type _) where
sets: {Ξ± : Type u_1} β Filter Ξ± β Set (Set Ξ±)
sets : Set: Type u_1 β Type u_1
Set (Set: Type u_1 β Type u_1
Set Ξ±: Type u_1
Ξ±)
univ_mem_sets: β {Ξ± : Type u_1} (self : Filter Ξ±), Set.univ β self.sets
univ_mem_sets : Set.univ: {Ξ± : Type u_1} β Set Ξ±
Set.univ β sets: Set (Set Ξ±)
sets
superset_mem_sets: β {Ξ± : Type u_1} (self : Filter Ξ±) {s t : Set Ξ±}, s β self.sets β s β t β t β self.sets
superset_mem_sets {s: Set Ξ±
s t: Set Ξ±
t} : s: Set Ξ±
s β sets: Set (Set Ξ±)
sets β s: Set Ξ±
s β t: Set Ξ±
t β t: Set Ξ±
t β sets: Set (Set Ξ±)
sets
inter_mem_sets: β {Ξ± : Type u_1} (self : Filter Ξ±) {s t : Set Ξ±}, s β self.sets β t β self.sets β s β© t β self.sets
inter_mem_sets {s: Set Ξ±
s t: Set Ξ±
t} : s: Set Ξ±
s β sets: Set (Set Ξ±)
sets β t: Set Ξ±
t β sets: Set (Set Ξ±)
sets β s: Set Ξ±
s β© t: Set Ξ±
t β sets: Set (Set Ξ±)
sets
s β f
If we have a filter f
, it is more convenient to write s β f
for s β f.sets
.
To define the notation, we simply provide an instance for the typeclass Membership
which has defined notation β
on it.
Providing an instance, is providing all fields of the class, some are data-like, some are function-like, and some are property-like.
We need to provide the data or function implementation for the first two kinds, prove the property for the last kind.
Here we only need to provide a function.
instance: {Ξ± : Type u_1} β Membership (Set Ξ±) (Filter Ξ±)
instance : Membership: outParam (Type u_1) β Type u_1 β Type u_1
Membership (Set: Type u_1 β Type u_1
Set Ξ±: Type u_1
Ξ±) (Filter: Type u_1 β Type u_1
Filter Ξ±: Type u_1
Ξ±) := {
mem := fun f: Filter Ξ±
f s: Set Ξ±
s β¦ s: Set Ξ±
s β f: Filter Ξ±
f.sets: {Ξ± : Type u_1} β Filter Ξ± β Set (Set Ξ±)
sets
}
To simplify, we can surround the ordered fields with β¨
and β©
, seperated by ,
.
instance: {Ξ± : Type u_1} β Membership (Set Ξ±) (Filter Ξ±)
instance : Membership: outParam (Type u_1) β Type u_1 β Type u_1
Membership (Set: Type u_1 β Type u_1
Set Ξ±: Type u_1
Ξ±) (Filter: Type u_1 β Type u_1
Filter Ξ±: Type u_1
Ξ±) :=
β¨fun f: Filter Ξ±
f s: Set Ξ±
s β¦ s: Set Ξ±
s β f: Filter Ξ±
f.sets: {Ξ± : Type u_1} β Filter Ξ± β Set (Set Ξ±)
setsβ©
Now that β
is defined.
We prove an obviously true statement.
example (example: β {Ξ± : Type u_1} (f : Filter Ξ±) (s : Set Ξ±), s β f β s β ff :f: Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ±) (Ξ±: Type u_1s :s: Set Ξ±SetSet: Type u_1 β Type u_1Ξ±) :Ξ±: Type u_1s βs: Set Ξ±f βf: Filter Ξ±s βs: Set Ξ±f :=f: Filter Ξ±Goals accomplished! πGoals accomplished! π
We then prove its propositional equality, and make it available for simp
.
@[simp] theoremFilter.mem_def (Filter.mem_def: β {Ξ± : Type u_1} (f : Filter Ξ±) (s : Set Ξ±), s β f β s β f.setsf :f: Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ±) (Ξ±: Type u_1s :s: Set Ξ±SetSet: Type u_1 β Type u_1Ξ±) :Ξ±: Type u_1s βs: Set Ξ±f βf: Filter Ξ±s βs: Set Ξ±f.f: Filter Ξ±sets :=sets: {Ξ± : Type u_1} β Filter Ξ± β Set (Set Ξ±)Goals accomplished! πGoals accomplished! π
If f.sets
and g.sets
are equal, we consider f
and g
to be equal, too.
@[simp] theoremFilter.eq_def (Filter.eq_def: β {Ξ± : Type u_1} (f g : Filter Ξ±), f = g β f.sets = g.setsff: Filter Ξ±g :g: Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ±) :Ξ±: Type u_1f =f: Filter Ξ±g βg: Filter Ξ±f.f: Filter Ξ±sets =sets: {Ξ± : Type u_1} β Filter Ξ± β Set (Set Ξ±)g.g: Filter Ξ±sets :=sets: {Ξ± : Type u_1} β Filter Ξ± β Set (Set Ξ±)Goals accomplished! πΞ±: Type u_1
f, g: Filter Ξ±
mpf = g β f.sets = g.setsΞ±: Type u_1
f, g: Filter Ξ±f.sets = g.sets β f = gΞ±: Type u_1
f, g: Filter Ξ±
mpf = g β f.sets = g.setsΞ±: Type u_1
f, g: Filter Ξ±
h: f = g
mpf.sets = g.setsΞ±: Type u_1
f, g: Filter Ξ±
h: f = g
mpf.sets = g.setsΞ±: Type u_1
f, g: Filter Ξ±
h: f = g
mpg.sets = g.setsGoals accomplished! πΞ±: Type u_1
f, g: Filter Ξ±
mprf.sets = g.sets β f = gΞ±: Type u_1
f, g: Filter Ξ±
h: f.sets = g.sets
mprf = gΞ±: Type u_1
g: Filter Ξ±
setsβ: Set (Set Ξ±)
univ_mem_setsβ: Set.univ β setsβ
superset_mem_setsβ: β {s t : Set Ξ±}, s β setsβ β s β t β t β setsβ
inter_mem_setsβ: β {s t : Set Ξ±}, s β setsβ β t β setsβ β s β© t β setsβ
h: { sets := setsβ, univ_mem_sets := univ_mem_setsβ, superset_mem_sets := superset_mem_setsβ, inter_mem_sets := inter_mem_setsβ }.sets = g.sets
mpr.mk{ sets := setsβ, univ_mem_sets := univ_mem_setsβ, superset_mem_sets := superset_mem_setsβ, inter_mem_sets := inter_mem_setsβ } = gΞ±: Type u_1
setsβΒΉ: Set (Set Ξ±)
univ_mem_setsβΒΉ: Set.univ β setsβΒΉ
superset_mem_setsβΒΉ: β {s t : Set Ξ±}, s β setsβΒΉ β s β t β t β setsβΒΉ
inter_mem_setsβΒΉ: β {s t : Set Ξ±}, s β setsβΒΉ β t β setsβΒΉ β s β© t β setsβΒΉ
setsβ: Set (Set Ξ±)
univ_mem_setsβ: Set.univ β setsβ
superset_mem_setsβ: β {s t : Set Ξ±}, s β setsβ β s β t β t β setsβ
inter_mem_setsβ: β {s t : Set Ξ±}, s β setsβ β t β setsβ β s β© t β setsβ
h: { sets := setsβΒΉ, univ_mem_sets := univ_mem_setsβΒΉ, superset_mem_sets := superset_mem_setsβΒΉ, inter_mem_sets := inter_mem_setsβΒΉ }.sets = { sets := setsβ, univ_mem_sets := univ_mem_setsβ, superset_mem_sets := superset_mem_setsβ, inter_mem_sets := inter_mem_setsβ }.sets
mpr.mk.mk{ sets := setsβΒΉ, univ_mem_sets := univ_mem_setsβΒΉ, superset_mem_sets := superset_mem_setsβΒΉ, inter_mem_sets := inter_mem_setsβΒΉ } = { sets := setsβ, univ_mem_sets := univ_mem_setsβ, superset_mem_sets := superset_mem_setsβ, inter_mem_sets := inter_mem_setsβ }Ξ±: Type u_1
setsβΒΉ: Set (Set Ξ±)
univ_mem_setsβΒΉ: Set.univ β setsβΒΉ
superset_mem_setsβΒΉ: β {s t : Set Ξ±}, s β setsβΒΉ β s β t β t β setsβΒΉ
inter_mem_setsβΒΉ: β {s t : Set Ξ±}, s β setsβΒΉ β t β setsβΒΉ β s β© t β setsβΒΉ
setsβ: Set (Set Ξ±)
univ_mem_setsβ: Set.univ β setsβ
superset_mem_setsβ: β {s t : Set Ξ±}, s β setsβ β s β t β t β setsβ
inter_mem_setsβ: β {s t : Set Ξ±}, s β setsβ β t β setsβ β s β© t β setsβ
h: { sets := setsβΒΉ, univ_mem_sets := univ_mem_setsβΒΉ, superset_mem_sets := superset_mem_setsβΒΉ, inter_mem_sets := inter_mem_setsβΒΉ }.sets = { sets := setsβ, univ_mem_sets := univ_mem_setsβ, superset_mem_sets := superset_mem_setsβ, inter_mem_sets := inter_mem_setsβ }.sets
mpr.mk.mk{ sets := setsβΒΉ, univ_mem_sets := univ_mem_setsβΒΉ, superset_mem_sets := superset_mem_setsβΒΉ, inter_mem_sets := inter_mem_setsβΒΉ } = { sets := setsβ, univ_mem_sets := univ_mem_setsβ, superset_mem_sets := superset_mem_setsβ, inter_mem_sets := inter_mem_setsβ }Ξ±: Type u_1
setsβΒΉ: Set (Set Ξ±)
univ_mem_setsβΒΉ: Set.univ β setsβΒΉ
superset_mem_setsβΒΉ: β {s t : Set Ξ±}, s β setsβΒΉ β s β t β t β setsβΒΉ
inter_mem_setsβΒΉ: β {s t : Set Ξ±}, s β setsβΒΉ β t β setsβΒΉ β s β© t β setsβΒΉ
setsβ: Set (Set Ξ±)
univ_mem_setsβ: Set.univ β setsβ
superset_mem_setsβ: β {s t : Set Ξ±}, s β setsβ β s β t β t β setsβ
inter_mem_setsβ: β {s t : Set Ξ±}, s β setsβ β t β setsβ β s β© t β setsβ
h: { sets := setsβΒΉ, univ_mem_sets := univ_mem_setsβΒΉ, superset_mem_sets := superset_mem_setsβΒΉ, inter_mem_sets := inter_mem_setsβΒΉ }.sets = { sets := setsβ, univ_mem_sets := univ_mem_setsβ, superset_mem_sets := superset_mem_setsβ, inter_mem_sets := inter_mem_setsβ }.sets
mpr.mk.mksetsβΒΉ = setsβΞ±: Type u_1
setsβΒΉ: Set (Set Ξ±)
univ_mem_setsβΒΉ: Set.univ β setsβΒΉ
superset_mem_setsβΒΉ: β {s t : Set Ξ±}, s β setsβΒΉ β s β t β t β setsβΒΉ
inter_mem_setsβΒΉ: β {s t : Set Ξ±}, s β setsβΒΉ β t β setsβΒΉ β s β© t β setsβΒΉ
setsβ: Set (Set Ξ±)
univ_mem_setsβ: Set.univ β setsβ
superset_mem_setsβ: β {s t : Set Ξ±}, s β setsβ β s β t β t β setsβ
inter_mem_setsβ: β {s t : Set Ξ±}, s β setsβ β t β setsβ β s β© t β setsβ
h: { sets := setsβΒΉ, univ_mem_sets := univ_mem_setsβΒΉ, superset_mem_sets := superset_mem_setsβΒΉ, inter_mem_sets := inter_mem_setsβΒΉ }.sets = { sets := setsβ, univ_mem_sets := univ_mem_setsβ, superset_mem_sets := superset_mem_setsβ, inter_mem_sets := inter_mem_setsβ }.sets
mpr.mk.mksetsβΒΉ = setsβtheoremGoals accomplished! πFilter.ext_iffβ (Filter.ext_iffβ: β (f g : Filter Ξ±), f = g β β (s : Set Ξ±), s β f β s β gff: Filter Ξ±g :g: Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ±) :Ξ±: Type u_1f =f: Filter Ξ±g β (βg: Filter Ξ±s,s: Set Ξ±s βs: Set Ξ±f βf: Filter Ξ±s βs: Set Ξ±g) :=g: Filter Ξ±Goals accomplished! πtheoremGoals accomplished! πFilter.ext_iffβ (Filter.ext_iffβ: β {Ξ± : Type u_1} (f g : Filter Ξ±), f = g β β (s : Set Ξ±), s β f β s β gff: Filter Ξ±g :g: Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ±) :Ξ±: Type u_1f =f: Filter Ξ±g β (βg: Filter Ξ±s,s: Set Ξ±s βs: Set Ξ±f βf: Filter Ξ±s βs: Set Ξ±g) :=g: Filter Ξ±Goals accomplished! πΞ±: Type u_1
f, g: Filter Ξ±
mpf = g β β (s : Set Ξ±), s β f β s β gΞ±: Type u_1
f, g: Filter Ξ±(β (s : Set Ξ±), s β f β s β g) β f = gΞ±: Type u_1
f, g: Filter Ξ±
mpf = g β β (s : Set Ξ±), s β f β s β gΞ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
mpβ (s : Set Ξ±), s β f β s β gΞ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
mps β f β s β gΞ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
mp.mps β f β s β gΞ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±s β g β s β fΞ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
mp.mps β f β s β gΞ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_f: s β f
mp.mps β gΞ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_f: s β f
mp.mps β gΞ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_f: s β f
mp.mps β fΞ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_f: s β f
mp.mps β fGoals accomplished! πΞ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
mp.mprs β g β s β fΞ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_g: s β g
mp.mprs β fΞ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_g: s β g
mp.mprs β fΞ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_g: s β g
mp.mprs β gΞ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_g: s β g
mp.mprs β gGoals accomplished! πΞ±: Type u_1
f, g: Filter Ξ±
mpr(β (s : Set Ξ±), s β f β s β g) β f = gΞ±: Type u_1
f, g: Filter Ξ±
set_mem_iff: β (s : Set Ξ±), s β f β s β g
mprf = gΞ±: Type u_1
f, g: Filter Ξ±
set_mem_iff: β (s : Set Ξ±), s β f β s β g
mprf = gΞ±: Type u_1
f, g: Filter Ξ±
set_mem_iff: β (s : Set Ξ±), s β f β s β g
mprf.sets = g.setsΞ±: Type u_1
f, g: Filter Ξ±
set_mem_iff: β (s : Set Ξ±), s β f β s β g
mprf.sets = g.setsΞ±: Type u_1
f, g: Filter Ξ±
set_mem_iff: β (s : Set Ξ±), s β f β s β g
mprf.sets = g.setsΞ±: Type u_1
f, g: Filter Ξ±
set_mem_iff: β (s : Set Ξ±), s β f β s β g
mprβ (x : Set Ξ±), x β f.sets β x β g.setsΞ±: Type u_1
f, g: Filter Ξ±
set_mem_iff: β (s : Set Ξ±), s β f β s β g
mprβ (x : Set Ξ±), x β f.sets β x β g.setsΞ±: Type u_1
f, g: Filter Ξ±
set_mem_iff: β (s : Set Ξ±), s β f β s β g
s: Set Ξ±
mprs β f.sets β s β g.setsΞ±: Type u_1
f, g: Filter Ξ±
s: Set Ξ±
set_mem_iff: s β f β s β g
mprs β f.sets β s β g.setstheoremGoals accomplished! πFilter.ext_iffβ (Filter.ext_iffβ: β (f g : Filter Ξ±), f = g β β (s : Set Ξ±), s β f β s β gff: Filter Ξ±g :g: Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ±) :Ξ±: Type u_1f =f: Filter Ξ±g β (βg: Filter Ξ±s,s: Set Ξ±s βs: Set Ξ±f βf: Filter Ξ±s βs: Set Ξ±g) :=g: Filter Ξ±Goals accomplished! πΞ±: Type u_1
f, g: Filter Ξ±f = g β β (s : Set Ξ±), s β f β s β gGoals accomplished! πΞ±: Type u_1
f, g: Filter Ξ±f = g β f.sets = g.setsΞ±: Type u_1
f, g: Filter Ξ±f.sets = g.sets β f.sets = g.setsGoals accomplished! π_: PropΞ±: Type u_1
f, g: Filter Ξ±f = g β β (s : Set Ξ±), s β f β s β gGoals accomplished! πΞ±: Type u_1
f, g: Filter Ξ±f.sets = g.sets β β (x : Set Ξ±), x β f.sets β x β g.setsΞ±: Type u_1
f, g: Filter Ξ±(β (x : Set Ξ±), x β f.sets β x β g.sets) β β (x : Set Ξ±), x β f.sets β x β g.setsGoals accomplished! π_: PropΞ±: Type u_1
f, g: Filter Ξ±f = g β β (s : Set Ξ±), s β f β s β gGoals accomplished! πΞ±: Type u_1
f, g: Filter Ξ±(β (x : Set Ξ±), x β f.sets β x β g.sets) β β (x : Set Ξ±), x β f β x β gGoals accomplished! πtheoremGoals accomplished! πFilter.ext_iffβ (Filter.ext_iffβ: β (f g : Filter Ξ±), f = g β β (s : Set Ξ±), s β f β s β gff: Filter Ξ±g :g: Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ±) :Ξ±: Type u_1f =f: Filter Ξ±g β (βg: Filter Ξ±s,s: Set Ξ±s βs: Set Ξ±f βf: Filter Ξ±s βs: Set Ξ±g) :=g: Filter Ξ±Goals accomplished! πΞ±: Type u_1
f, g: Filter Ξ±f = g β β (s : Set Ξ±), s β f β s β gGoals accomplished! πΞ±: Type u_1
f, g, fg: Filter Ξ±
x: Set Ξ±(x β fg.sets) = (x β fg)Ξ±: Type u_1
f, g, fg: Filter Ξ±
x: Set Ξ±(x β fg.sets) = (x β fg)Ξ±: Type u_1
f, g, fg: Filter Ξ±
x: Set Ξ±(x β fg.sets) = (x β fg.sets)Goals accomplished! πΞ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)f = g β β (s : Set Ξ±), s β f β s β gGoals accomplished! πΞ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)f = g β f.sets = g.setsΞ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)f.sets = g.sets β f.sets = g.setsGoals accomplished! π_: PropΞ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)f = g β β (s : Set Ξ±), s β f β s β gGoals accomplished! πΞ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)f.sets = g.sets β β (x : Set Ξ±), x β f.sets β x β g.setsΞ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)(β (x : Set Ξ±), x β f.sets β x β g.sets) β β (x : Set Ξ±), x β f.sets β x β g.setsGoals accomplished! π_: PropΞ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)f = g β β (s : Set Ξ±), s β f β s β gGoals accomplished! πΞ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)(β (x : Set Ξ±), x β f.sets β x β g.sets) β β (x : Set Ξ±), x β f β x β gΞ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)
x: Set Ξ±x β f.sets β x β g.setsΞ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)
x: Set Ξ±x β f.sets β x β g.setsΞ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)
x: Set Ξ±x β f β x β g.setsΞ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)
x: Set Ξ±x β f β x β g.setsΞ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)
x: Set Ξ±x β f β x β g.setsΞ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)
x: Set Ξ±x β f β x β g-- 19Ξ±: Type u_1
f, g: Filter Ξ±
mem_sets_eq_mem: β (fg : Filter Ξ±) (x : Set Ξ±), (x β fg.sets) = (x β fg)
x: Set Ξ±x β f β x β g-- 38-- 31-- 60def:Ξ± βΞ±: Type u_1Ξ± := funΞ±: Type u_1f => letf: Ξ±s :=s: β11: βsorrysorry: Ξ±
These lemmas directly follow from the definiton of the filters:
theoremFilter.univ_mem (Filter.univ_mem: β {Ξ± : Type u_1} (f : Filter Ξ±), Set.univ β ff :f: Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ±) :Ξ±: Type u_1Set.univ βSet.univ: {Ξ± : Type u_1} β Set Ξ±f :=f: Filter Ξ±Goals accomplished! πtheoremGoals accomplished! πFilter.superset_mem {Filter.superset_mem: β {Ξ± : Type u_1} {f : Filter Ξ±} {s t : Set Ξ±}, s β f β s β t β t β ff :f: Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ±} {Ξ±: Type u_1ss: Set Ξ±t :t: Set Ξ±SetSet: Type u_1 β Type u_1Ξ±} (Ξ±: Type u_1hs :hs: s β fs βs: Set Ξ±f) (f: Filter Ξ±h :h: s β ts βs: Set Ξ±t) :t: Set Ξ±t βt: Set Ξ±f :=f: Filter Ξ±Goals accomplished! πtheoremGoals accomplished! πFilter.inter_mem {Filter.inter_mem: β {f : Filter Ξ±} {s t : Set Ξ±}, s β f β t β f β s β© t β ff :f: Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ±} {Ξ±: Type u_1ss: Set Ξ±t :t: Set Ξ±SetSet: Type u_1 β Type u_1Ξ±} (Ξ±: Type u_1hs :hs: s β fs βs: Set Ξ±f) (f: Filter Ξ±ht :ht: t β ft βt: Set Ξ±f) :f: Filter Ξ±s β©s: Set Ξ±t βt: Set Ξ±f :=f: Filter Ξ±Goals accomplished! πtheoremGoals accomplished! πFilter.inter_memβ {Filter.inter_memβ: β {f : Filter Ξ±} {s t : Set Ξ±}, s β f β t β f β s β© t β ff :f: Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ±} {Ξ±: Type u_1ss: Set Ξ±t :t: Set Ξ±SetSet: Type u_1 β Type u_1Ξ±} (Ξ±: Type u_1hs :hs: s β fs βs: Set Ξ±f) (f: Filter Ξ±ht :ht: t β ft βt: Set Ξ±f) :f: Filter Ξ±s β©s: Set Ξ±t βt: Set Ξ±f :=f: Filter Ξ±f.f: Filter Ξ±inter_mem_setsinter_mem_sets: β {Ξ± : Type u_1} (self : Filter Ξ±) {s t : Set Ξ±}, s β self.sets β t β self.sets β s β© t β self.setshshs: s β fht theoremht: t β fSet.mem_iff (Set.mem_iff: β {Ξ± : Type u_1} (p : Ξ± β Prop) (y : Ξ±), y β {x | p x} β p yp :p: Ξ± β PropΞ± βΞ±: Type u_1Prop) (Prop: Typey :y: Ξ±Ξ±) :Ξ±: Type u_1y β {y: Ξ±x :x: Ξ±Ξ± |Ξ±: Type u_1pp: Ξ± β Propx} βx: Ξ±pp: Ξ± β Propy :=y: Ξ±Goals accomplished! π/-οΌ ## Examples of filters -/ example : Filter Ξ± := { sets := Set.univ univ_mem_sets :=Goals accomplished! πGoals accomplished! πsuperset_mem_sets :=Goals accomplished! πGoals accomplished! πΞ±: Type ?u.3162
s, t: Set Ξ±s β Set.univ β s β t β t β Set.univΞ±: Type ?u.3162
s, t: Set Ξ±
Β«s β univΒ»: s β Set.univ
Β«s β tΒ»: s β tt β Set.univinter_mem_sets :=Goals accomplished! πGoals accomplished! πΞ±: Type ?u.3162
s, t: Set Ξ±s β Set.univ β t β Set.univ β s β© t β Set.univΞ±: Type ?u.3162
s, t: Set Ξ±
Β«s β univΒ»: s β Set.univ
Β«t β univΒ»: t β Set.univs β© t β Set.univ} /-οΌ or, succinctly: -/Goals accomplished! πexample :example: {Ξ± : Type u_1} β Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ± := { sets :=Ξ±: Type u_1Set.univ univ_mem_sets :=Set.univ: {Ξ± : Type u_1} β Set Ξ±Goals accomplished! πsuperset_mem_sets :=Goals accomplished! πGoals accomplished! πΞ±: Type ?u.3230
sβ, tβ: Set Ξ±
aβΒΉ: sβ β Set.univ
aβ: sβ β tβtβ β Set.univinter_mem_sets :=Goals accomplished! πGoals accomplished! πΞ±: Type ?u.3230
sβ, tβ: Set Ξ±
aβΒΉ: sβ β Set.univ
aβ: tβ β Set.univsβ β© tβ β Set.univ}Goals accomplished! π
Hint: rw
using Set.mem_iff
to unfold the set-builder notation.
Mathlib lemmas Set.univ_subset_iff
and Set.inter_self
can be useful here.
Use simp? rw? exact? apply? aesop? to get hints.
example :example: {Ξ± : Type u_1} β Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ± := { sets := {Ξ±: Type u_1s :s: Set Ξ±SetSet: Type u_1 β Type u_1Ξ± |Ξ±: Type u_1s =s: Set Ξ±Set.univ} univ_mem_sets :=Set.univ: {Ξ± : Type u_1} β Set Ξ±Goals accomplished! πΞ±: Type ?u.3290Set.univ β {s | s = Set.univ}Ξ±: Type ?u.3290Set.univ = Set.univsuperset_mem_sets :=Goals accomplished! πGoals accomplished! πΞ±: Type ?u.3290β {s t : Set Ξ±}, s β {s | s = Set.univ} β s β t β t β {s | s = Set.univ}Ξ±: Type ?u.3290β {s t : Set Ξ±}, s = Set.univ β s β t β t = Set.univΞ±: Type ?u.3290β {s t : Set Ξ±}, s = Set.univ β s β t β t = Set.univΞ±: Type ?u.3290
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«s β tΒ»: s β tt = Set.univΞ±: Type ?u.3290
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«s β tΒ»: s β tSet.univ β tΞ±: Type ?u.3290
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«s β tΒ»: s β tSet.univ β tΞ±: Type ?u.3290
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«s β tΒ»: s β ts β tΞ±: Type ?u.3290
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«s β tΒ»: s β ts β tinter_mem_sets :=Goals accomplished! πGoals accomplished! πΞ±: Type ?u.3290β {s t : Set Ξ±}, s β {s | s = Set.univ} β t β {s | s = Set.univ} β s β© t β {s | s = Set.univ}Ξ±: Type ?u.3290β {s t : Set Ξ±}, s = Set.univ β t = Set.univ β s β© t = Set.univΞ±: Type ?u.3290β {s t : Set Ξ±}, s = Set.univ β t = Set.univ β s β© t = Set.univΞ±: Type ?u.3290
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«t = univΒ»: t = Set.univs β© t = Set.univΞ±: Type ?u.3290
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«t = univΒ»: t = Set.univs β© t = Set.univΞ±: Type ?u.3290
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«t = univΒ»: t = Set.univSet.univ β© t = Set.univΞ±: Type ?u.3290
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«t = univΒ»: t = Set.univSet.univ β© Set.univ = Set.univΞ±: Type ?u.3290
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«t = univΒ»: t = Set.univSet.univ β© Set.univ = Set.univ} /-οΌ or, succinctly: -/Goals accomplished! πexample :example: {Ξ± : Type u_1} β Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ± := { sets := {Ξ±: Type u_1s :s: Set Ξ±SetSet: Type u_1 β Type u_1Ξ± |Ξ±: Type u_1s =s: Set Ξ±Set.univ} univ_mem_sets :=Set.univ: {Ξ± : Type u_1} β Set Ξ±Goals accomplished! πΞ±: Type ?u.4032Set.univ β {s | s = Set.univ}Ξ±: Type ?u.4032Set.univ = Set.univsuperset_mem_sets :=Goals accomplished! πGoals accomplished! πΞ±: Type ?u.4032β {s t : Set Ξ±}, s β {s | s = Set.univ} β s β t β t β {s | s = Set.univ}Ξ±: Type ?u.4032β {s t : Set Ξ±}, s = Set.univ β s β t β t = Set.univΞ±: Type ?u.4032β {s t : Set Ξ±}, s = Set.univ β s β t β t = Set.univΞ±: Type ?u.4032
sβ, tβ: Set Ξ±
aβΒΉ: sβ = Set.univ
aβ: sβ β tβtβ = Set.univinter_mem_sets :=Goals accomplished! πGoals accomplished! πΞ±: Type ?u.4032β {s t : Set Ξ±}, s β {s | s = Set.univ} β t β {s | s = Set.univ} β s β© t β {s | s = Set.univ}Ξ±: Type ?u.4032β {s t : Set Ξ±}, s = Set.univ β t = Set.univ β s β© t = Set.univΞ±: Type ?u.4032β {s t : Set Ξ±}, s = Set.univ β t = Set.univ β s β© t = Set.univΞ±: Type ?u.4032
sβ, tβ: Set Ξ±
aβΒΉ: sβ = Set.univ
aβ: tβ = Set.univsβ β© tβ = Set.univ} /-οΌ The cofinite filter consists of subsets whose complements are finite. -/Goals accomplished! πexample :example: {Ξ± : Type u_1} β Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ± := { sets := {Ξ±: Type u_1s :s: Set Ξ±SetSet: Type u_1 β Type u_1Ξ± |Ξ±: Type u_1Set.FiniteSet.Finite: {Ξ± : Type u_1} β Set Ξ± β PropsαΆ} univ_mem_sets :=s: Set Ξ±Goals accomplished! πΞ±: Type ?u.4865Set.univ β {s | sαΆ.Finite}Ξ±: Type ?u.4865Set.univαΆ.FiniteΞ±: Type ?u.4865β .FiniteΞ±: Type ?u.4865β .Finitesuperset_mem_sets :=Goals accomplished! πGoals accomplished! πΞ±: Type ?u.4865
s, t: Set Ξ±s β {s | sαΆ.Finite} β s β t β t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±s β {s | sαΆ.Finite} β s β t β t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±sαΆ.Finite β s β t β t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±sαΆ.Finite β s β t β t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«s β tΒ»: s β tt β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«s β tΒ»: s β tt β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«s β tΒ»: s β ttαΆ.FiniteΞ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«s β tΒ»: s β ttαΆ.FiniteΞ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«s β tΒ»: s β ttαΆ.FiniteΞ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«s β tΒ»: tαΆ β sαΆtαΆ.FiniteΞ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«s β tΒ»: tαΆ β sαΆtαΆ.FiniteΞ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«s β tΒ»: tαΆ β sαΆtαΆ.Finiteinter_mem_sets :=Goals accomplished! πGoals accomplished! πΞ±: Type ?u.4865
s, t: Set Ξ±s β {s | sαΆ.Finite} β t β {s | sαΆ.Finite} β s β© t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: s β {s | sαΆ.Finite}
Β«tαΆ is finiteΒ»: t β {s | sαΆ.Finite}s β© t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: s β {s | sαΆ.Finite}
Β«tαΆ is finiteΒ»: t β {s | sαΆ.Finite}s β© t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«tαΆ is finiteΒ»: t β {s | sαΆ.Finite}s β© t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«tαΆ is finiteΒ»: t β {s | sαΆ.Finite}s β© t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«tαΆ is finiteΒ»: t β {s | sαΆ.Finite}s β© t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«tαΆ is finiteΒ»: t β {s | sαΆ.Finite}s β© t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«tαΆ is finiteΒ»: tαΆ.Finites β© t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«tαΆ is finiteΒ»: tαΆ.Finites β© t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«tαΆ is finiteΒ»: tαΆ.Finites β© t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«tαΆ is finiteΒ»: tαΆ.Finites β© t β {s | sαΆ.Finite}Ξ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«tαΆ is finiteΒ»: tαΆ.Finite(s β© t)αΆ.FiniteΞ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«tαΆ is finiteΒ»: tαΆ.Finite(s β© t)αΆ.FiniteΞ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«tαΆ is finiteΒ»: tαΆ.Finite(s β© t)αΆ.FiniteΞ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«tαΆ is finiteΒ»: tαΆ.Finite(sαΆ βͺ tαΆ).FiniteΞ±: Type ?u.4865
s, t: Set Ξ±
Β«sαΆ is finiteΒ»: sαΆ.Finite
Β«tαΆ is finiteΒ»: tαΆ.Finite(sαΆ βͺ tαΆ).Finite} /-οΌ or, succinctly: -/Goals accomplished! πexample :example: {Ξ± : Type u_1} β Filter Ξ±FilterFilter: Type u_1 β Type u_1Ξ± where sets := {Ξ±: Type u_1s :s: Set Ξ±SetSet: Type u_1 β Type u_1Ξ± |Ξ±: Type u_1Set.FiniteSet.Finite: {Ξ± : Type u_1} β Set Ξ± β PropsαΆ} univ_mem_sets :=s: Set Ξ±Goals accomplished! πsuperset_mem_setsGoals accomplished! πΒ«sαΆ is finite»«sαΆ is finiteΒ»: sβ β {s | sαΆ.Finite}Β«s β tΒ» :=Β«s β tΒ»: sβ β tβΒ«sαΆ is finiteΒ».Β«sαΆ is finiteΒ»: sβ β {s | sαΆ.Finite}subset <|subset: β {Ξ± : Type u_1} {s : Set Ξ±}, s.Finite β β {t : Set Ξ±}, t β s β t.FiniteSet.compl_subset_compl.Set.compl_subset_compl: β {Ξ± : Type u_1} {s t : Set Ξ±}, sαΆ β tαΆ β t β smprmpr: β {a b : Prop}, (a β b) β b β aΒ«s β tΒ» inter_mem_sets :=Β«s β tΒ»: sβ β tβGoals accomplished! πGoals accomplished! π
Given a type Ξ±
, a filter basis is a collection of subsets of Ξ±
which:
We represent it in Lean as a new type, which "packages" the collection of subsets, along with all the properties it should have.
structure Basis: Type u_1 β Type u_1
Basis (Ξ±: Type u_1
Ξ± : Type _: Type (u_1 + 1)
Type _) where
sets: {Ξ± : Type u_1} β Basis Ξ± β Set (Set Ξ±)
sets : Set: Type u_1 β Type u_1
Set (Set: Type u_1 β Type u_1
Set Ξ±: Type u_1
Ξ±)
sets_nonempty: β {Ξ± : Type u_1} (self : Basis Ξ±), β s, s β self.sets
sets_nonempty : β s: Set Ξ±
s, s: Set Ξ±
s β sets: Set (Set Ξ±)
sets
inter_mem_sets: β {Ξ± : Type u_1} (self : Basis Ξ±) {s t : Set Ξ±}, s β self.sets β t β self.sets β β u β self.sets, u β s β© t
inter_mem_sets {s: Set Ξ±
s t: Set Ξ±
t} : s: Set Ξ±
s β sets: Set (Set Ξ±)
sets β t: Set Ξ±
t β sets: Set (Set Ξ±)
sets β β u: Set Ξ±
u β sets: Set (Set Ξ±)
sets, u: Set Ξ±
u β s: Set Ξ±
s β© t: Set Ξ±
t
If we have a filter basis b
, it is more convenient to write s β b
for
s β b.sets
. We now define this notation.
instance: {Ξ± : Type u_1} β Membership (Set Ξ±) (Basis Ξ±)
instance : Membership: outParam (Type u_1) β Type u_1 β Type u_1
Membership (Set: Type u_1 β Type u_1
Set Ξ±: Type u_1
Ξ±) (Basis: Type u_1 β Type u_1
Basis Ξ±: Type u_1
Ξ±) :=
β¨fun b: Basis Ξ±
b s: Set Ξ±
s β¦ s: Set Ξ±
s β b: Basis Ξ±
b.sets: {Ξ± : Type u_1} β Basis Ξ± β Set (Set Ξ±)
setsβ©
The definition of β
.
@[simp] theoremBasis.mem_def (Basis.mem_def: β {Ξ± : Type u_1} (b : Basis Ξ±) (s : Set Ξ±), s β b β s β b.setsb :b: Basis Ξ±BasisBasis: Type u_1 β Type u_1Ξ±) (Ξ±: Type u_1s :s: Set Ξ±SetSet: Type u_1 β Type u_1Ξ±) :Ξ±: Type u_1s βs: Set Ξ±b βb: Basis Ξ±s βs: Set Ξ±b.b: Basis Ξ±sets :=sets: {Ξ± : Type u_1} β Basis Ξ± β Set (Set Ξ±)Goals accomplished! πGoals accomplished! π
The definition of equality between filter bases.
@[simp] theoremBasis.eq_def (Basis.eq_def: β (b c : Basis Ξ±), b = c β b.sets = c.setsbb: Basis Ξ±c :c: Basis Ξ±BasisBasis: Type u_1 β Type u_1Ξ±) :Ξ±: Type u_1b =b: Basis Ξ±c βc: Basis Ξ±b.b: Basis Ξ±sets =sets: {Ξ± : Type u_1} β Basis Ξ± β Set (Set Ξ±)c.c: Basis Ξ±sets :=sets: {Ξ± : Type u_1} β Basis Ξ± β Set (Set Ξ±)Goals accomplished! πΞ±: Type u_1
b, c: Basis Ξ±
mpb = c β b.sets = c.setsΞ±: Type u_1
b, c: Basis Ξ±b.sets = c.sets β b = cΞ±: Type u_1
b, c: Basis Ξ±
mpb = c β b.sets = c.setsΞ±: Type u_1
b, c: Basis Ξ±
Β«b = cΒ»: b = c
mpb.sets = c.setsΞ±: Type u_1
b, c: Basis Ξ±
Β«b = cΒ»: b = c
mpb.sets = c.setsΞ±: Type u_1
b, c: Basis Ξ±
Β«b = cΒ»: b = c
mpc.sets = c.setsGoals accomplished! πΞ±: Type u_1
b, c: Basis Ξ±
mprb.sets = c.sets β b = cΞ±: Type u_1
b, c: Basis Ξ±
Β«b.sets = c.setsΒ»: b.sets = c.sets
mprb = cΞ±: Type u_1
c: Basis Ξ±
setsβ: Set (Set Ξ±)
sets_nonemptyβ: β s, s β setsβ
inter_mem_setsβ: β {s t : Set Ξ±}, s β setsβ β t β setsβ β β u β setsβ, u β s β© t
Β«b.sets = c.setsΒ»: { sets := setsβ, sets_nonempty := sets_nonemptyβ, inter_mem_sets := inter_mem_setsβ }.sets = c.sets
mpr.mk{ sets := setsβ, sets_nonempty := sets_nonemptyβ, inter_mem_sets := inter_mem_setsβ } = cΞ±: Type u_1
setsβΒΉ: Set (Set Ξ±)
sets_nonemptyβΒΉ: β s, s β setsβΒΉ
inter_mem_setsβΒΉ: β {s t : Set Ξ±}, s β setsβΒΉ β t β setsβΒΉ β β u β setsβΒΉ, u β s β© t
setsβ: Set (Set Ξ±)
sets_nonemptyβ: β s, s β setsβ
inter_mem_setsβ: β {s t : Set Ξ±}, s β setsβ β t β setsβ β β u β setsβ, u β s β© t
Β«b.sets = c.setsΒ»: { sets := setsβΒΉ, sets_nonempty := sets_nonemptyβΒΉ, inter_mem_sets := inter_mem_setsβΒΉ }.sets = { sets := setsβ, sets_nonempty := sets_nonemptyβ, inter_mem_sets := inter_mem_setsβ }.sets
mpr.mk.mk{ sets := setsβΒΉ, sets_nonempty := sets_nonemptyβΒΉ, inter_mem_sets := inter_mem_setsβΒΉ } = { sets := setsβ, sets_nonempty := sets_nonemptyβ, inter_mem_sets := inter_mem_setsβ }-- 46Goals accomplished! πtheoremBasis.eq_defβ (Basis.eq_defβ: β {Ξ± : Type u_1} (b c : Basis Ξ±), b = c β b.sets = c.setsbb: Basis Ξ±c :c: Basis Ξ±BasisBasis: Type u_1 β Type u_1Ξ±) :Ξ±: Type u_1b =b: Basis Ξ±c βc: Basis Ξ±b.b: Basis Ξ±sets =sets: {Ξ± : Type u_1} β Basis Ξ± β Set (Set Ξ±)c.c: Basis Ξ±sets :=sets: {Ξ± : Type u_1} β Basis Ξ± β Set (Set Ξ±)Goals accomplished! πΞ±: Type u_1
b, c: Basis Ξ±
mpb = c β b.sets = c.setsΞ±: Type u_1
b, c: Basis Ξ±b.sets = c.sets β b = cΞ±: Type u_1
b, c: Basis Ξ±
mpb = c β b.sets = c.setsΞ±: Type u_1
b, c: Basis Ξ±
Β«b = cΒ»: b = c
mpb.sets = c.setsΞ±: Type u_1
b, c: Basis Ξ±
Β«b = cΒ»: b = c
mpb.sets = c.setsΞ±: Type u_1
b, c: Basis Ξ±
Β«b = cΒ»: b = c
mpc.sets = c.setsGoals accomplished! πΞ±: Type u_1
b, c: Basis Ξ±
mprb.sets = c.sets β b = cΞ±: Type u_1
b, c: Basis Ξ±
Β«b.sets = c.setsΒ»: b.sets = c.sets
mprb = cΞ±: Type u_1
c: Basis Ξ±
setsβ: Set (Set Ξ±)
sets_nonemptyβ: β s, s β setsβ
inter_mem_setsβ: β {s t : Set Ξ±}, s β setsβ β t β setsβ β β u β setsβ, u β s β© t
Β«b.sets = c.setsΒ»: { sets := setsβ, sets_nonempty := sets_nonemptyβ, inter_mem_sets := inter_mem_setsβ }.sets = c.sets
mpr.mk{ sets := setsβ, sets_nonempty := sets_nonemptyβ, inter_mem_sets := inter_mem_setsβ } = cΞ±: Type u_1
setsβΒΉ: Set (Set Ξ±)
sets_nonemptyβΒΉ: β s, s β setsβΒΉ
inter_mem_setsβΒΉ: β {s t : Set Ξ±}, s β setsβΒΉ β t β setsβΒΉ β β u β setsβΒΉ, u β s β© t
setsβ: Set (Set Ξ±)
sets_nonemptyβ: β s, s β setsβ
inter_mem_setsβ: β {s t : Set Ξ±}, s β setsβ β t β setsβ β β u β setsβ, u β s β© t
Β«b.sets = c.setsΒ»: { sets := setsβΒΉ, sets_nonempty := sets_nonemptyβΒΉ, inter_mem_sets := inter_mem_setsβΒΉ }.sets = { sets := setsβ, sets_nonempty := sets_nonemptyβ, inter_mem_sets := inter_mem_setsβ }.sets
mpr.mk.mk{ sets := setsβΒΉ, sets_nonempty := sets_nonemptyβΒΉ, inter_mem_sets := inter_mem_setsβΒΉ } = { sets := setsβ, sets_nonempty := sets_nonemptyβ, inter_mem_sets := inter_mem_setsβ }-- 53Goals accomplished! π