Built with Alectryon. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+πŸ–±οΈ to focus. On Mac, use ⌘ instead of Ctrl.
Hover-Settings: Show types: Show goals:
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_1
Ξ±
:
Type _: Type (u_1 + 1)
Type _
}

Filters

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

Notation 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
s: Set Ξ±
s
f: Filter Ξ±
f
↦
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
s: Set Ξ±
s
f: Filter Ξ±
f
↦
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: βˆ€ {Ξ± : Type u_1} (f : Filter Ξ±) (s : Set Ξ±), s ∈ f ↔ s ∈ f
example
(
f: Filter Ξ±
f
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
) (
s: Set Ξ±
s
:
Set: Type u_1 β†’ Type u_1
Set
Ξ±: Type u_1
Ξ±
) :
s: Set Ξ±
s
∈
f: Filter Ξ±
f
↔
s: Set Ξ±
s
∈
f: Filter Ξ±
f
:=

Goals accomplished! πŸ™

Goals accomplished! πŸ™

We then prove its propositional equality, and make it available for simp.

@[simp]
theorem 
Filter.mem_def: βˆ€ {Ξ± : Type u_1} (f : Filter Ξ±) (s : Set Ξ±), s ∈ f ↔ s ∈ f.sets
Filter.mem_def
(
f: Filter Ξ±
f
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
) (
s: Set Ξ±
s
:
Set: Type u_1 β†’ Type u_1
Set
Ξ±: Type u_1
Ξ±
) :
s: Set Ξ±
s
∈
f: Filter Ξ±
f
↔
s: Set Ξ±
s
∈
f: Filter Ξ±
f
.
sets: {Ξ± : Type u_1} β†’ Filter Ξ± β†’ Set (Set Ξ±)
sets
:=

Goals accomplished! πŸ™

Goals accomplished! πŸ™

The equality between filters

If f.sets and g.sets are equal, we consider f and g to be equal, too.

@[simp]
theorem 
Filter.eq_def: βˆ€ (f g : Filter Ξ±), f = g ↔ f.sets = g.sets
Filter.eq_def
(
f: Filter Ξ±
f
g: Filter Ξ±
g
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
) :
f: Filter Ξ±
f
=
g: Filter Ξ±
g
↔
f: Filter Ξ±
f
.
sets: {Ξ± : Type u_1} β†’ Filter Ξ± β†’ Set (Set Ξ±)
sets
=
g: Filter Ξ±
g
.
sets: {Ξ± : Type u_1} β†’ Filter Ξ± β†’ Set (Set Ξ±)
sets
:=

Goals accomplished! πŸ™
Ξ±: Type u_1
f, g: Filter Ξ±

mp
f = g β†’ f.sets = g.sets
Ξ±: Type u_1
f, g: Filter Ξ±
f.sets = g.sets β†’ f = g
Ξ±: Type u_1
f, g: Filter Ξ±

mp
f = g β†’ f.sets = g.sets
Ξ±: Type u_1
f, g: Filter Ξ±
h: f = g

mp
f.sets = g.sets
Ξ±: Type u_1
f, g: Filter Ξ±
h: f = g

mp
f.sets = g.sets
Ξ±: Type u_1
f, g: Filter Ξ±
h: f = g

mp
g.sets = g.sets

Goals accomplished! πŸ™
Ξ±: Type u_1
f, g: Filter Ξ±

mpr
f.sets = g.sets β†’ f = g
Ξ±: Type u_1
f, g: Filter Ξ±
h: f.sets = g.sets

mpr
f = 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.mk
sets✝¹ = 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✝

Goals accomplished! πŸ™
theorem
Filter.ext_iff₁: βˆ€ {Ξ± : Type u_1} (f g : Filter Ξ±), f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g
Filter.ext_iff₁
(
f: Filter Ξ±
f
g: Filter Ξ±
g
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
) :
f: Filter Ξ±
f
=
g: Filter Ξ±
g
↔ (βˆ€
s: Set Ξ±
s
,
s: Set Ξ±
s
∈
f: Filter Ξ±
f
↔
s: Set Ξ±
s
∈
g: Filter Ξ±
g
) :=

Goals accomplished! πŸ™

Goals accomplished! πŸ™
theorem
Filter.ext_iffβ‚‚: βˆ€ {Ξ± : Type u_1} (f g : Filter Ξ±), f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g
Filter.ext_iffβ‚‚
(
f: Filter Ξ±
f
g: Filter Ξ±
g
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
) :
f: Filter Ξ±
f
=
g: Filter Ξ±
g
↔ (βˆ€
s: Set Ξ±
s
,
s: Set Ξ±
s
∈
f: Filter Ξ±
f
↔
s: Set Ξ±
s
∈
g: Filter Ξ±
g
) :=

Goals accomplished! πŸ™
Ξ±: Type u_1
f, g: Filter Ξ±

mp
f = 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 Ξ±

mp
f = 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 Ξ±

mp
s ∈ f ↔ s ∈ g
Ξ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±

mp.mp
s ∈ 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.mp
s ∈ f β†’ s ∈ g
Ξ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_f: s ∈ f

mp.mp
s ∈ g
Ξ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_f: s ∈ f

mp.mp
s ∈ g
Ξ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_f: s ∈ f

mp.mp
s ∈ f
Ξ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_f: s ∈ f

mp.mp
s ∈ f

Goals accomplished! πŸ™
Ξ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±

mp.mpr
s ∈ g β†’ s ∈ f
Ξ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_g: s ∈ g

mp.mpr
s ∈ f
Ξ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_g: s ∈ g

mp.mpr
s ∈ f
Ξ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_g: s ∈ g

mp.mpr
s ∈ g
Ξ±: Type u_1
f, g: Filter Ξ±
f_eq_g: f = g
s: Set Ξ±
s_mem_g: s ∈ g

mp.mpr
s ∈ g

Goals 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

mpr
f = g
Ξ±: Type u_1
f, g: Filter Ξ±
set_mem_iff: βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g

mpr
f = g
Ξ±: Type u_1
f, g: Filter Ξ±
set_mem_iff: βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g

mpr
f.sets = g.sets
Ξ±: Type u_1
f, g: Filter Ξ±
set_mem_iff: βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g

mpr
f.sets = g.sets
Ξ±: Type u_1
f, g: Filter Ξ±
set_mem_iff: βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g

mpr
f.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 Ξ±

mpr
s ∈ f.sets ↔ s ∈ g.sets
Ξ±: Type u_1
f, g: Filter Ξ±
s: Set Ξ±
set_mem_iff: s ∈ f ↔ s ∈ g

mpr
s ∈ f.sets ↔ s ∈ g.sets

Goals accomplished! πŸ™
theorem
Filter.ext_iff₃: βˆ€ {Ξ± : Type u_1} (f g : Filter Ξ±), f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g
Filter.ext_iff₃
(
f: Filter Ξ±
f
g: Filter Ξ±
g
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
) :
f: Filter Ξ±
f
=
g: Filter Ξ±
g
↔ (βˆ€
s: Set Ξ±
s
,
s: Set Ξ±
s
∈
f: Filter Ξ±
f
↔
s: Set Ξ±
s
∈
g: Filter Ξ±
g
) :=

Goals accomplished! πŸ™
Ξ±: Type u_1
f, g: Filter Ξ±

f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g

Goals 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.sets

Goals accomplished! πŸ™
_: Prop
Ξ±: Type u_1
f, g: Filter Ξ±

f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g

Goals 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.sets

Goals accomplished! πŸ™
_: Prop
Ξ±: Type u_1
f, g: Filter Ξ±

f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g

Goals accomplished! πŸ™
Ξ±: Type u_1
f, g: Filter Ξ±

(βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g

Goals accomplished! πŸ™

Goals accomplished! πŸ™
theorem
Filter.ext_iffβ‚„: βˆ€ {Ξ± : Type u_1} (f g : Filter Ξ±), f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g
Filter.ext_iffβ‚„
(
f: Filter Ξ±
f
g: Filter Ξ±
g
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
) :
f: Filter Ξ±
f
=
g: Filter Ξ±
g
↔ (βˆ€
s: Set Ξ±
s
,
s: Set Ξ±
s
∈
f: Filter Ξ±
f
↔
s: Set Ξ±
s
∈
g: Filter Ξ±
g
) :=

Goals accomplished! πŸ™
Ξ±: Type u_1
f, g: Filter Ξ±

f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g

Goals 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 ∈ g

Goals 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.sets

Goals 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 ∈ g

Goals 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.sets

Goals 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 ∈ g

Goals 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
Ξ±: 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
Filter.ext_iff₁ : βˆ€ {Ξ± : Type u_1} (f g : Filter Ξ±), f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g 0 β”‚ β”‚ Ξ± β”œ Type u_1 1 β”‚ β”‚ f β”œ Filter Ξ± 2 β”‚ β”‚ g β”œ Filter Ξ± 3 β”‚ β”‚ _auxLemma.2 β”‚ (f = g) = (f.sets = g.sets) 4 β”‚ β”‚ _auxLemma.3 β”‚ (f.sets = g.sets) = βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 5 β”‚3,4 β”‚ Eq.trans β”‚ (f = g) = βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 6 β”‚5 β”‚ congrArg β”‚ Iff (f = g) = Iff (βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) 7 β”‚ β”‚ s β”‚ β”Œ Set Ξ± 8 β”‚ β”‚ _auxLemma.1 β”‚ β”‚ (s ∈ f) = (s ∈ f.sets) 9 β”‚8 β”‚ congrArg β”‚ β”‚ Iff (s ∈ f) = Iff (s ∈ f.sets) 10β”‚ β”‚ _auxLemma.1 β”‚ β”‚ (s ∈ g) = (s ∈ g.sets) 11β”‚9,10 β”‚ congr β”‚ β”‚ (s ∈ f ↔ s ∈ g) = (s ∈ f.sets ↔ s ∈ g.sets) 12β”‚7,11 β”‚ βˆ€I β”‚ βˆ€ (s : Set Ξ±), (s ∈ f ↔ s ∈ g) = (s ∈ f.sets ↔ s ∈ g.sets) 13β”‚12 β”‚ forall_congr β”‚ (βˆ€ (a : Set Ξ±), a ∈ f ↔ a ∈ g) = βˆ€ (a : Set Ξ±), a ∈ f.sets ↔ a ∈ g.sets 14β”‚6,13 β”‚ congr β”‚ (f = g ↔ βˆ€ (a : Set Ξ±), a ∈ f ↔ a ∈ g) = ((βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (a : Set Ξ±), a ∈ f.sets ↔ a ∈ g.sets) 15β”‚ β”‚ iff_self β”‚ ((βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) = True 16β”‚14,15 β”‚ Eq.trans β”‚ (f = g ↔ βˆ€ (a : Set Ξ±), a ∈ f ↔ a ∈ g) = True 17β”‚16 β”‚ of_eq_true β”‚ f = g ↔ βˆ€ (a : Set Ξ±), a ∈ f ↔ a ∈ g 18β”‚0,1,2,17β”‚ βˆ€I β”‚ βˆ€ {Ξ± : Type u_1} (f g : Filter Ξ±), f = g ↔ βˆ€ (a : Set Ξ±), a ∈ f ↔ a ∈ g
-- 38
Filter.ext_iffβ‚‚ : βˆ€ {Ξ± : Type u_1} (f g : Filter Ξ±), f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g 0 β”‚ β”‚ Ξ± β”œ Type u_1 1 β”‚ β”‚ f β”œ Filter Ξ± 2 β”‚ β”‚ g β”œ Filter Ξ± 3 β”‚ β”‚ f_eq_g β”‚ β”Œ f = g 4 β”‚ β”‚ s β”‚ β”œ Set Ξ± 5 β”‚ β”‚ s_mem_f β”‚ β”‚ β”Œ s ∈ f 6 β”‚3 β”‚ Eq.symm β”‚ β”‚ β”‚ g = f 7 β”‚6 β”‚ congrArg β”‚ β”‚ β”‚ (s ∈ g) = (s ∈ f) 8 β”‚7 β”‚ id β”‚ β”‚ β”‚ (s ∈ g) = (s ∈ f) 9 β”‚8,5 β”‚ Eq.mpr β”‚ β”‚ β”‚ s ∈ g 10β”‚5,9 β”‚ βˆ€I β”‚ β”‚ s ∈ f β†’ s ∈ g 11β”‚ β”‚ s_mem_g β”‚ β”‚ β”Œ s ∈ g 12β”‚3 β”‚ congrArg β”‚ β”‚ β”‚ (s ∈ f) = (s ∈ g) 13β”‚12 β”‚ id β”‚ β”‚ β”‚ (s ∈ f) = (s ∈ g) 14β”‚13,11 β”‚ Eq.mpr β”‚ β”‚ β”‚ s ∈ f 15β”‚11,14 β”‚ βˆ€I β”‚ β”‚ s ∈ g β†’ s ∈ f 16β”‚10,15 β”‚ Iff.intro β”‚ β”‚ s ∈ f ↔ s ∈ g 17β”‚3,4,16 β”‚ βˆ€I β”‚ f = g β†’ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g 18β”‚ β”‚ set_mem_iff β”‚ β”Œ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g 19β”‚ β”‚ Filter.eq_def β”‚ β”‚ f = g ↔ f.sets = g.sets 20β”‚19 β”‚ propext β”‚ β”‚ (f = g) = (f.sets = g.sets) 21β”‚20 β”‚ congrArg β”‚ β”‚ (f = g) = (f.sets = g.sets) 22β”‚21 β”‚ id β”‚ β”‚ (f = g) = (f.sets = g.sets) 23β”‚ β”‚ Set.ext_iff β”‚ β”‚ f.sets = g.sets ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 24β”‚23 β”‚ propext β”‚ β”‚ (f.sets = g.sets) = βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 25β”‚24 β”‚ congrArg β”‚ β”‚ (f.sets = g.sets) = βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 26β”‚25 β”‚ id β”‚ β”‚ (f.sets = g.sets) = βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 27β”‚ β”‚ s β”‚ β”‚ β”Œ Set Ξ± 28β”‚18 β”‚ βˆ€E β”‚ β”‚ β”‚ s ∈ f ↔ s ∈ g 29β”‚27,28 β”‚ βˆ€I β”‚ β”‚ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g 30β”‚26,29 β”‚ Eq.mpr β”‚ β”‚ f.sets = g.sets 31β”‚22,30 β”‚ Eq.mpr β”‚ β”‚ f = g 32β”‚18,31 β”‚ βˆ€I β”‚ (βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g) β†’ f = g 33β”‚17,32 β”‚ Iff.intro β”‚ f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g 34β”‚0,1,2,33β”‚ βˆ€I β”‚ βˆ€ {Ξ± : Type u_1} (f g : Filter Ξ±), f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g
-- 31
Filter.ext_iff₃ : βˆ€ {Ξ± : Type u_1} (f g : Filter Ξ±), f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g 0 β”‚ β”‚ Ξ± β”œ Type u_1 1 β”‚ β”‚ f β”œ Filter Ξ± 2 β”‚ β”‚ g β”œ Filter Ξ± 3 β”‚ β”‚ Filter.eq_def β”‚ f = g ↔ f.sets = g.sets 4 β”‚3 β”‚ propext β”‚ (f = g) = (f.sets = g.sets) 5 β”‚4 β”‚ congrArg β”‚ (f = g ↔ f.sets = g.sets) = (f.sets = g.sets ↔ f.sets = g.sets) 6 β”‚5 β”‚ id β”‚ (f = g ↔ f.sets = g.sets) = (f.sets = g.sets ↔ f.sets = g.sets) 7 β”‚ β”‚ Iff.rfl β”‚ f.sets = g.sets ↔ f.sets = g.sets 8 β”‚6,7 β”‚ Eq.mpr β”‚ f = g ↔ f.sets = g.sets 9 β”‚ β”‚ Set.ext_iff β”‚ f.sets = g.sets ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 10β”‚9 β”‚ propext β”‚ (f.sets = g.sets) = βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 11β”‚10 β”‚ congrArg β”‚ (f.sets = g.sets ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) = ((βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) 12β”‚11 β”‚ id β”‚ (f.sets = g.sets ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) = ((βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) 13β”‚ β”‚ Iff.rfl β”‚ (βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 14β”‚12,13 β”‚ Eq.mpr β”‚ f.sets = g.sets ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 15β”‚8,14 β”‚ Trans.trans β”‚ f = g ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 16β”‚ β”‚ x β”‚ β”Œ Set Ξ± 17β”‚ β”‚ _auxLemma.1 β”‚ β”‚ (x ∈ f) = (x ∈ f.sets) 18β”‚17 β”‚ congrArg β”‚ β”‚ Iff (x ∈ f) = Iff (x ∈ f.sets) 19β”‚ β”‚ _auxLemma.1 β”‚ β”‚ (x ∈ g) = (x ∈ g.sets) 20β”‚18,19 β”‚ congr β”‚ β”‚ (x ∈ f ↔ x ∈ g) = (x ∈ f.sets ↔ x ∈ g.sets) 21β”‚16,20 β”‚ βˆ€I β”‚ βˆ€ (x : Set Ξ±), (x ∈ f ↔ x ∈ g) = (x ∈ f.sets ↔ x ∈ g.sets) 22β”‚21 β”‚ forall_congr β”‚ (βˆ€ (a : Set Ξ±), a ∈ f ↔ a ∈ g) = βˆ€ (a : Set Ξ±), a ∈ f.sets ↔ a ∈ g.sets 23β”‚22 β”‚ congrArg β”‚ ((βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (a : Set Ξ±), a ∈ f ↔ a ∈ g) = ((βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (a : Set Ξ±), a ∈ f.sets ↔ a ∈ g.sets) 24β”‚ β”‚ iff_self β”‚ ((βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) = True 25β”‚23,24 β”‚ Eq.trans β”‚ ((βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (a : Set Ξ±), a ∈ f ↔ a ∈ g) = True 26β”‚25 β”‚ of_eq_true β”‚ (βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (a : Set Ξ±), a ∈ f ↔ a ∈ g 27β”‚15,26 β”‚ Trans.trans β”‚ f = g ↔ βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g 28β”‚0,1,2,27β”‚ βˆ€I β”‚ βˆ€ {Ξ± : Type u_1} (f g : Filter Ξ±), f = g ↔ βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g
-- 60
Filter.ext_iffβ‚„ : βˆ€ {Ξ± : Type u_1} (f g : Filter Ξ±), f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g 0 β”‚ β”‚ Ξ± β”œ Type u_1 1 β”‚ β”‚ f β”œ Filter Ξ± 2 β”‚ β”‚ g β”œ Filter Ξ± 3 β”‚ β”‚ fg β”‚ β”Œ Filter Ξ± 4 β”‚ β”‚ x β”‚ β”œ Set Ξ± 5 β”‚ β”‚ Filter.mem_def β”‚ β”‚ x ∈ fg ↔ x ∈ fg.sets 6 β”‚5 β”‚ propext β”‚ β”‚ (x ∈ fg) = (x ∈ fg.sets) 7 β”‚6 β”‚ congrArg β”‚ β”‚ ((x ∈ fg.sets) = (x ∈ fg)) = ((x ∈ fg.sets) = (x ∈ fg.sets)) 8 β”‚7 β”‚ id β”‚ β”‚ ((x ∈ fg.sets) = (x ∈ fg)) = ((x ∈ fg.sets) = (x ∈ fg.sets)) 9 β”‚ β”‚ Eq.refl β”‚ β”‚ (x ∈ fg.sets) = (x ∈ fg.sets) 10β”‚8,9 β”‚ Eq.mpr β”‚ β”‚ (x ∈ fg.sets) = (x ∈ fg) 11β”‚3,4,10 β”‚ βˆ€I β”‚ βˆ€ (fg : Filter Ξ±) (x : Set Ξ±), (x ∈ fg.sets) = (x ∈ fg) 12β”‚ β”‚ mem_sets_eq_mem β”‚ β”Œ βˆ€ (fg : Filter Ξ±) (x : Set Ξ±), (x ∈ fg.sets) = (x ∈ fg) 13β”‚ β”‚ Filter.eq_def β”‚ β”‚ f = g ↔ f.sets = g.sets 14β”‚13 β”‚ propext β”‚ β”‚ (f = g) = (f.sets = g.sets) 15β”‚14 β”‚ congrArg β”‚ β”‚ (f = g ↔ f.sets = g.sets) = (f.sets = g.sets ↔ f.sets = g.sets) 16β”‚15 β”‚ id β”‚ β”‚ (f = g ↔ f.sets = g.sets) = (f.sets = g.sets ↔ f.sets = g.sets) 17β”‚ β”‚ Iff.rfl β”‚ β”‚ f.sets = g.sets ↔ f.sets = g.sets 18β”‚16,17 β”‚ Eq.mpr β”‚ β”‚ f = g ↔ f.sets = g.sets 19β”‚ β”‚ Set.ext_iff β”‚ β”‚ f.sets = g.sets ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 20β”‚19 β”‚ propext β”‚ β”‚ (f.sets = g.sets) = βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 21β”‚20 β”‚ congrArg β”‚ β”‚ (f.sets = g.sets ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) = ((βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) 22β”‚21 β”‚ id β”‚ β”‚ (f.sets = g.sets ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) = ((βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) 23β”‚ β”‚ Iff.rfl β”‚ β”‚ (βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 24β”‚22,23 β”‚ Eq.mpr β”‚ β”‚ f.sets = g.sets ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 25β”‚18,24 β”‚ Trans.trans β”‚ β”‚ f = g ↔ βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets 26β”‚ β”‚ a✝ β”‚ β”‚ β”Œ Prop 27β”‚ β”‚ a β”‚ β”‚ β”œ Prop 28β”‚ β”‚ e_a β”‚ β”‚ β”œ a✝ = a 29β”‚ β”‚ b✝ β”‚ β”‚ β”‚ β”Œ Prop 30β”‚ β”‚ b β”‚ β”‚ β”‚ β”œ Prop 31β”‚ β”‚ e_b β”‚ β”‚ β”‚ β”œ b✝ = b 32β”‚ β”‚ Eq.refl β”‚ β”‚ β”‚ β”‚ (a✝ ↔ b✝) = (a✝ ↔ b✝) 33β”‚32,31 β”‚ Eq.rec β”‚ β”‚ β”‚ β”‚ (a✝ ↔ b✝) = (a✝ ↔ b) 34β”‚29,30,31,33β”‚ βˆ€I β”‚ β”‚ β”‚ βˆ€ (b b_1 : Prop), b = b_1 β†’ (a✝ ↔ b) = (a✝ ↔ b_1) 35β”‚34,28 β”‚ Eq.rec β”‚ β”‚ β”‚ βˆ€ (b b_1 : Prop), b = b_1 β†’ (a✝ ↔ b) = (a ↔ b_1) 36β”‚26,27,28,35β”‚ βˆ€I β”‚ β”‚ βˆ€ (a a_1 : Prop), a = a_1 β†’ βˆ€ (b b_1 : Prop), b = b_1 β†’ (a ↔ b) = (a_1 ↔ b_1) 37β”‚ β”‚ x β”‚ β”‚ β”Œ Set Ξ± 38β”‚12 β”‚ βˆ€E β”‚ β”‚ β”‚ (x ∈ f.sets) = (x ∈ f) 39β”‚38 β”‚ congrArg β”‚ β”‚ β”‚ (x ∈ f.sets ↔ x ∈ g.sets) = (x ∈ f ↔ x ∈ g.sets) 40β”‚12 β”‚ βˆ€E β”‚ β”‚ β”‚ (x ∈ g.sets) = (x ∈ g) 41β”‚40 β”‚ congrArg β”‚ β”‚ β”‚ (x ∈ f ↔ x ∈ g.sets) = (x ∈ f ↔ x ∈ g) 42β”‚ β”‚ Eq.refl β”‚ β”‚ β”‚ (x ∈ f ↔ x ∈ g) = (x ∈ f ↔ x ∈ g) 43β”‚41,42 β”‚ Eq.trans β”‚ β”‚ β”‚ (x ∈ f ↔ x ∈ g.sets) = (x ∈ f ↔ x ∈ g) 44β”‚39,43 β”‚ Eq.trans β”‚ β”‚ β”‚ (x ∈ f.sets ↔ x ∈ g.sets) = (x ∈ f ↔ x ∈ g) 45β”‚37,44 β”‚ βˆ€I β”‚ β”‚ βˆ€ (x : Set Ξ±), (x ∈ f.sets ↔ x ∈ g.sets) = (x ∈ f ↔ x ∈ g) 46β”‚45 β”‚ forall_congr β”‚ β”‚ (βˆ€ (a : Set Ξ±), a ∈ f.sets ↔ a ∈ g.sets) = βˆ€ (a : Set Ξ±), a ∈ f ↔ a ∈ g 47β”‚ β”‚ Eq.refl β”‚ β”‚ (βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g) = βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g 48β”‚36,46,47 β”‚ βˆ€E β”‚ β”‚ ((βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g) = ((βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g) ↔ βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g) 49β”‚48 β”‚ id β”‚ β”‚ ((βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g) = ((βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g) ↔ βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g) 50β”‚ β”‚ Iff.rfl β”‚ β”‚ (βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g) ↔ βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g 51β”‚49,50 β”‚ Eq.mpr β”‚ β”‚ (βˆ€ (x : Set Ξ±), x ∈ f.sets ↔ x ∈ g.sets) ↔ βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g 52β”‚25,51 β”‚ Trans.trans β”‚ β”‚ f = g ↔ βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g 53β”‚12,52 β”‚ βˆ€I β”‚ (βˆ€ (fg : Filter Ξ±) (x : Set Ξ±), (x ∈ fg.sets) = (x ∈ fg)) β†’ (f = g ↔ βˆ€ (x : Set Ξ±), x ∈ f ↔ x ∈ g) 54β”‚11,53 β”‚ letFun β”‚ f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g 55β”‚0,1,2,54 β”‚ βˆ€I β”‚ βˆ€ {Ξ± : Type u_1} (f g : Filter Ξ±), f = g ↔ βˆ€ (s : Set Ξ±), s ∈ f ↔ s ∈ g
def
Warning: declaration uses 'sorry'
:
Ξ±: Type u_1
Ξ±
β†’
Ξ±: Type u_1
Ξ±
:= fun
f: Ξ±
f
=> let
s: β„•
s
:=
1: β„•
1
sorry: Ξ±
sorry

Trivial lemmas

These lemmas directly follow from the definiton of the filters:

theorem 
Filter.univ_mem: βˆ€ {Ξ± : Type u_1} (f : Filter Ξ±), Set.univ ∈ f
Filter.univ_mem
(
f: Filter Ξ±
f
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
) :
Set.univ: {Ξ± : Type u_1} β†’ Set Ξ±
Set.univ
∈
f: Filter Ξ±
f
:=

Goals accomplished! πŸ™

Goals accomplished! πŸ™
theorem
Filter.superset_mem: βˆ€ {Ξ± : Type u_1} {f : Filter Ξ±} {s t : Set Ξ±}, s ∈ f β†’ s βŠ† t β†’ t ∈ f
Filter.superset_mem
{
f: Filter Ξ±
f
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
} {
s: Set Ξ±
s
t: Set Ξ±
t
:
Set: Type u_1 β†’ Type u_1
Set
Ξ±: Type u_1
Ξ±
} (
hs: s ∈ f
hs
:
s: Set Ξ±
s
∈
f: Filter Ξ±
f
) (
h: s βŠ† t
h
:
s: Set Ξ±
s
βŠ†
t: Set Ξ±
t
) :
t: Set Ξ±
t
∈
f: Filter Ξ±
f
:=

Goals accomplished! πŸ™

Goals accomplished! πŸ™
theorem
Filter.inter_mem: βˆ€ {Ξ± : Type u_1} {f : Filter Ξ±} {s t : Set Ξ±}, s ∈ f β†’ t ∈ f β†’ s ∩ t ∈ f
Filter.inter_mem
{
f: Filter Ξ±
f
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
} {
s: Set Ξ±
s
t: Set Ξ±
t
:
Set: Type u_1 β†’ Type u_1
Set
Ξ±: Type u_1
Ξ±
} (
hs: s ∈ f
hs
:
s: Set Ξ±
s
∈
f: Filter Ξ±
f
) (
ht: t ∈ f
ht
:
t: Set Ξ±
t
∈
f: Filter Ξ±
f
) :
s: Set Ξ±
s
∩
t: Set Ξ±
t
∈
f: Filter Ξ±
f
:=

Goals accomplished! πŸ™

Goals accomplished! πŸ™
theorem
Filter.inter_mem₁: βˆ€ {f : Filter Ξ±} {s t : Set Ξ±}, s ∈ f β†’ t ∈ f β†’ s ∩ t ∈ f
Filter.inter_mem₁
{
f: Filter Ξ±
f
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
} {
s: Set Ξ±
s
t: Set Ξ±
t
:
Set: Type u_1 β†’ Type u_1
Set
Ξ±: Type u_1
Ξ±
} (
hs: s ∈ f
hs
:
s: Set Ξ±
s
∈
f: Filter Ξ±
f
) (
ht: t ∈ f
ht
:
t: Set Ξ±
t
∈
f: Filter Ξ±
f
) :
s: Set Ξ±
s
∩
t: Set Ξ±
t
∈
f: Filter Ξ±
f
:=
f: Filter Ξ±
f
.
inter_mem_sets: βˆ€ {Ξ± : Type u_1} (self : Filter Ξ±) {s t : Set Ξ±}, s ∈ self.sets β†’ t ∈ self.sets β†’ s ∩ t ∈ self.sets
inter_mem_sets
hs: s ∈ f
hs
ht: t ∈ f
ht
theorem
Set.mem_iff: βˆ€ (p : Ξ± β†’ Prop) (y : Ξ±), y ∈ {x | p x} ↔ p y
Set.mem_iff
(
p: Ξ± β†’ Prop
p
:
Ξ±: Type u_1
Ξ±
β†’
Prop: Type
Prop
) (
y: Ξ±
y
:
Ξ±: Type u_1
Ξ±
) :
y: Ξ±
y
∈ {
x: Ξ±
x
:
Ξ±: Type u_1
Ξ±
|
p: Ξ± β†’ Prop
p
x: Ξ±
x
} ↔
p: Ξ± β†’ Prop
p
y: Ξ±
y
:=

Goals accomplished! πŸ™

Goals accomplished! πŸ™
/-! ## Examples of filters -/ example : Filter α := { sets := Set.univ univ_mem_sets :=

Goals accomplished! πŸ™

Goals accomplished! πŸ™
superset_mem_sets :=

Goals accomplished! πŸ™
Ξ±: Type ?u.3017
s, t: Set Ξ±

s ∈ Set.univ β†’ s βŠ† t β†’ t ∈ Set.univ
Ξ±: Type ?u.3017
s, t: Set Ξ±
«s ∈ univ»: s ∈ Set.univ
Β«s βŠ† tΒ»: s βŠ† t

t ∈ Set.univ

Goals accomplished! πŸ™
inter_mem_sets :=

Goals accomplished! πŸ™
Ξ±: Type ?u.3017
s, t: Set Ξ±

s ∈ Set.univ β†’ t ∈ Set.univ β†’ s ∩ t ∈ Set.univ
Ξ±: Type ?u.3017
s, t: Set Ξ±
«s ∈ univ»: s ∈ Set.univ
«t ∈ univ»: t ∈ Set.univ

s ∩ t ∈ Set.univ

Goals accomplished! πŸ™
} /-! or, succinctly: -/
example: {Ξ± : Type u_1} β†’ Filter Ξ±
example
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
:= { sets :=
Set.univ: {Ξ± : Type u_1} β†’ Set Ξ±
Set.univ
univ_mem_sets :=

Goals accomplished! πŸ™

Goals accomplished! πŸ™
superset_mem_sets :=

Goals accomplished! πŸ™
Ξ±: Type ?u.3085
s✝, t✝: Set α
a✝¹: s✝ ∈ Set.univ
a✝: s✝ βŠ† t✝

t✝ ∈ Set.univ

Goals accomplished! πŸ™
inter_mem_sets :=

Goals accomplished! πŸ™
Ξ±: Type ?u.3085
s✝, t✝: Set α
a✝¹: s✝ ∈ Set.univ
a✝: t✝ ∈ Set.univ

s✝ ∩ 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: {Ξ± : Type u_1} β†’ Filter Ξ±
example
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
:= { sets := {
s: Set Ξ±
s
:
Set: Type u_1 β†’ Type u_1
Set
Ξ±: Type u_1
Ξ±
|
s: Set Ξ±
s
=
Set.univ: {Ξ± : Type u_1} β†’ Set Ξ±
Set.univ
} univ_mem_sets :=

Goals accomplished! πŸ™
Ξ±: Type ?u.3145

Set.univ ∈ {s | s = Set.univ}
Ξ±: Type ?u.3145

Set.univ = Set.univ

Goals accomplished! πŸ™
superset_mem_sets :=

Goals accomplished! πŸ™
Ξ±: Type ?u.3145

βˆ€ {s t : Set Ξ±}, s ∈ {s | s = Set.univ} β†’ s βŠ† t β†’ t ∈ {s | s = Set.univ}
Ξ±: Type ?u.3145

βˆ€ {s t : Set Ξ±}, s = Set.univ β†’ s βŠ† t β†’ t = Set.univ
Ξ±: Type ?u.3145

βˆ€ {s t : Set Ξ±}, s = Set.univ β†’ s βŠ† t β†’ t = Set.univ
Ξ±: Type ?u.3145
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«s βŠ† tΒ»: s βŠ† t

t = Set.univ
Ξ±: Type ?u.3145
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«s βŠ† tΒ»: s βŠ† t

Set.univ βŠ† t
Ξ±: Type ?u.3145
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«s βŠ† tΒ»: s βŠ† t

Set.univ βŠ† t
Ξ±: Type ?u.3145
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«s βŠ† tΒ»: s βŠ† t

s βŠ† t
Ξ±: Type ?u.3145
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«s βŠ† tΒ»: s βŠ† t

s βŠ† t

Goals accomplished! πŸ™
inter_mem_sets :=

Goals accomplished! πŸ™
Ξ±: Type ?u.3145

βˆ€ {s t : Set Ξ±}, s ∈ {s | s = Set.univ} β†’ t ∈ {s | s = Set.univ} β†’ s ∩ t ∈ {s | s = Set.univ}
Ξ±: Type ?u.3145

βˆ€ {s t : Set Ξ±}, s = Set.univ β†’ t = Set.univ β†’ s ∩ t = Set.univ
Ξ±: Type ?u.3145

βˆ€ {s t : Set Ξ±}, s = Set.univ β†’ t = Set.univ β†’ s ∩ t = Set.univ
Ξ±: Type ?u.3145
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«t = univΒ»: t = Set.univ

s ∩ t = Set.univ
Ξ±: Type ?u.3145
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«t = univΒ»: t = Set.univ

s ∩ t = Set.univ
Ξ±: Type ?u.3145
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«t = univΒ»: t = Set.univ

Set.univ ∩ t = Set.univ
Ξ±: Type ?u.3145
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«t = univΒ»: t = Set.univ

Set.univ ∩ Set.univ = Set.univ
Ξ±: Type ?u.3145
s, t: Set Ξ±
Β«s = univΒ»: s = Set.univ
Β«t = univΒ»: t = Set.univ

Set.univ ∩ Set.univ = Set.univ

Goals accomplished! πŸ™
} /-! or, succinctly: -/
example: {Ξ± : Type u_1} β†’ Filter Ξ±
example
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
:= { sets := {
s: Set Ξ±
s
:
Set: Type u_1 β†’ Type u_1
Set
Ξ±: Type u_1
Ξ±
|
s: Set Ξ±
s
=
Set.univ: {Ξ± : Type u_1} β†’ Set Ξ±
Set.univ
} univ_mem_sets :=

Goals accomplished! πŸ™
Ξ±: Type ?u.3942

Set.univ ∈ {s | s = Set.univ}
Ξ±: Type ?u.3942

Set.univ = Set.univ

Goals accomplished! πŸ™
superset_mem_sets :=

Goals accomplished! πŸ™
Ξ±: Type ?u.3942

βˆ€ {s t : Set Ξ±}, s ∈ {s | s = Set.univ} β†’ s βŠ† t β†’ t ∈ {s | s = Set.univ}
Ξ±: Type ?u.3942

βˆ€ {s t : Set Ξ±}, s = Set.univ β†’ s βŠ† t β†’ t = Set.univ
Ξ±: Type ?u.3942

βˆ€ {s t : Set Ξ±}, s = Set.univ β†’ s βŠ† t β†’ t = Set.univ
Ξ±: Type ?u.3942
s✝, t✝: Set α
a✝¹: s✝ = Set.univ
a✝: s✝ βŠ† t✝

t✝ = Set.univ

Goals accomplished! πŸ™
inter_mem_sets :=

Goals accomplished! πŸ™
Ξ±: Type ?u.3942

βˆ€ {s t : Set Ξ±}, s ∈ {s | s = Set.univ} β†’ t ∈ {s | s = Set.univ} β†’ s ∩ t ∈ {s | s = Set.univ}
Ξ±: Type ?u.3942

βˆ€ {s t : Set Ξ±}, s = Set.univ β†’ t = Set.univ β†’ s ∩ t = Set.univ
Ξ±: Type ?u.3942

βˆ€ {s t : Set Ξ±}, s = Set.univ β†’ t = Set.univ β†’ s ∩ t = Set.univ
Ξ±: Type ?u.3942
s✝, t✝: Set α
a✝¹: s✝ = Set.univ
a✝: t✝ = Set.univ

s✝ ∩ t✝ = Set.univ

Goals accomplished! πŸ™
} /-! The cofinite filter consists of subsets whose complements are finite. -/
example: {Ξ± : Type u_1} β†’ Filter Ξ±
example
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
:= { sets := {
s: Set Ξ±
s
:
Set: Type u_1 β†’ Type u_1
Set
Ξ±: Type u_1
Ξ±
|
Set.Finite: {Ξ± : Type u_1} β†’ Set Ξ± β†’ Prop
Set.Finite
s: Set Ξ±
s
ᢜ} univ_mem_sets :=

Goals accomplished! πŸ™
Ξ±: Type ?u.4771

Set.univ ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771

Set.univᢜ.Finite
Ξ±: Type ?u.4771

βˆ….Finite
Ξ±: Type ?u.4771

βˆ….Finite

Goals accomplished! πŸ™
superset_mem_sets :=

Goals accomplished! πŸ™
Ξ±: Type ?u.4771
s, t: Set Ξ±

s ∈ {s | sᢜ.Finite} β†’ s βŠ† t β†’ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±

s ∈ {s | sᢜ.Finite} β†’ s βŠ† t β†’ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±

sᢜ.Finite β†’ s βŠ† t β†’ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±

sᢜ.Finite β†’ s βŠ† t β†’ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
Β«s βŠ† tΒ»: s βŠ† t

t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
Β«s βŠ† tΒ»: s βŠ† t

t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
Β«s βŠ† tΒ»: s βŠ† t

tᢜ.Finite
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
Β«s βŠ† tΒ»: s βŠ† t

tᢜ.Finite
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
Β«s βŠ† tΒ»: s βŠ† t

tᢜ.Finite
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
Β«s βŠ† tΒ»: tᢜ βŠ† sᢜ

tᢜ.Finite
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
Β«s βŠ† tΒ»: tᢜ βŠ† sᢜ

tᢜ.Finite
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
Β«s βŠ† tΒ»: tᢜ βŠ† sᢜ

tᢜ.Finite

Goals accomplished! πŸ™
inter_mem_sets :=

Goals accomplished! πŸ™
Ξ±: Type ?u.4771
s, t: Set Ξ±

s ∈ {s | sᢜ.Finite} β†’ t ∈ {s | sᢜ.Finite} β†’ s ∩ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: s ∈ {s | sᢜ.Finite}
«tᢜ is finite»: t ∈ {s | sᢜ.Finite}

s ∩ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: s ∈ {s | sᢜ.Finite}
«tᢜ is finite»: t ∈ {s | sᢜ.Finite}

s ∩ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
«tᢜ is finite»: t ∈ {s | sᢜ.Finite}

s ∩ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
«tᢜ is finite»: t ∈ {s | sᢜ.Finite}

s ∩ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
«tᢜ is finite»: t ∈ {s | sᢜ.Finite}

s ∩ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
«tᢜ is finite»: t ∈ {s | sᢜ.Finite}

s ∩ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
«tᢜ is finite»: tᢜ.Finite

s ∩ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
«tᢜ is finite»: tᢜ.Finite

s ∩ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
«tᢜ is finite»: tᢜ.Finite

s ∩ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
«tᢜ is finite»: tᢜ.Finite

s ∩ t ∈ {s | sᢜ.Finite}
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
«tᢜ is finite»: tᢜ.Finite

(s ∩ t)ᢜ.Finite
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
«tᢜ is finite»: tᢜ.Finite

(s ∩ t)ᢜ.Finite
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
«tᢜ is finite»: tᢜ.Finite

(s ∩ t)ᢜ.Finite
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
«tᢜ is finite»: tᢜ.Finite

(sᢜ βˆͺ tᢜ).Finite
Ξ±: Type ?u.4771
s, t: Set Ξ±
«sᢜ is finite»: sᢜ.Finite
«tᢜ is finite»: tᢜ.Finite

(sᢜ βˆͺ tᢜ).Finite

Goals accomplished! πŸ™
} /-! or, succinctly: -/
example: {Ξ± : Type u_1} β†’ Filter Ξ±
example
:
Filter: Type u_1 β†’ Type u_1
Filter
Ξ±: Type u_1
Ξ±
where sets := {
s: Set Ξ±
s
:
Set: Type u_1 β†’ Type u_1
Set
Ξ±: Type u_1
Ξ±
|
Set.Finite: {Ξ± : Type u_1} β†’ Set Ξ± β†’ Prop
Set.Finite
s: Set Ξ±
s
ᢜ} univ_mem_sets :=

Goals accomplished! πŸ™

Goals accomplished! πŸ™
superset_mem_sets
«sᢜ is finite»: s✝ ∈ {s | sᢜ.Finite}
«sᢜ is finite»
Β«s βŠ† tΒ»: s✝ βŠ† t✝
Β«s βŠ† tΒ»
:=
«sᢜ is finite»: s✝ ∈ {s | sᢜ.Finite}
«sᢜ is finite»
.
subset: βˆ€ {Ξ± : Type u_1} {s : Set Ξ±}, s.Finite β†’ βˆ€ {t : Set Ξ±}, t βŠ† s β†’ t.Finite
subset
<|
Set.compl_subset_compl: βˆ€ {Ξ± : Type u_1} {s t : Set Ξ±}, sᢜ βŠ† tᢜ ↔ t βŠ† s
Set.compl_subset_compl
.
mpr: βˆ€ {a b : Prop}, (a ↔ b) β†’ b β†’ a
mpr
Β«s βŠ† tΒ»: s✝ βŠ† t✝
Β«s βŠ† tΒ»
inter_mem_sets :=

Goals accomplished! πŸ™

Goals accomplished! πŸ™

Filter bases

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
s: Set Ξ±
s
b: Basis Ξ±
b
↦
s: Set Ξ±
s
∈
b: Basis Ξ±
b
.
sets: {Ξ± : Type u_1} β†’ Basis Ξ± β†’ Set (Set Ξ±)
sets
⟩

The definition of ∈.

@[simp]
theorem 
Basis.mem_def: βˆ€ {Ξ± : Type u_1} (b : Basis Ξ±) (s : Set Ξ±), s ∈ b ↔ s ∈ b.sets
Basis.mem_def
(
b: Basis Ξ±
b
:
Basis: Type u_1 β†’ Type u_1
Basis
Ξ±: Type u_1
Ξ±
) (
s: Set Ξ±
s
:
Set: Type u_1 β†’ Type u_1
Set
Ξ±: Type u_1
Ξ±
) :
s: Set Ξ±
s
∈
b: Basis Ξ±
b
↔
s: Set Ξ±
s
∈
b: Basis Ξ±
b
.
sets: {Ξ± : Type u_1} β†’ Basis Ξ± β†’ Set (Set Ξ±)
sets
:=

Goals accomplished! πŸ™

Goals accomplished! πŸ™

The definition of equality between filter bases.

@[simp]
theorem 
Basis.eq_def: βˆ€ {Ξ± : Type u_1} (b c : Basis Ξ±), b = c ↔ b.sets = c.sets
Basis.eq_def
(
b: Basis Ξ±
b
c: Basis Ξ±
c
:
Basis: Type u_1 β†’ Type u_1
Basis
Ξ±: Type u_1
Ξ±
) :
b: Basis Ξ±
b
=
c: Basis Ξ±
c
↔
b: Basis Ξ±
b
.
sets: {Ξ± : Type u_1} β†’ Basis Ξ± β†’ Set (Set Ξ±)
sets
=
c: Basis Ξ±
c
.
sets: {Ξ± : Type u_1} β†’ Basis Ξ± β†’ Set (Set Ξ±)
sets
:=

Goals accomplished! πŸ™
Ξ±: Type u_1
b, c: Basis Ξ±

mp
b = c β†’ b.sets = c.sets
Ξ±: Type u_1
b, c: Basis Ξ±
b.sets = c.sets β†’ b = c
Ξ±: Type u_1
b, c: Basis Ξ±

mp
b = c β†’ b.sets = c.sets
Ξ±: Type u_1
b, c: Basis Ξ±
Β«b = cΒ»: b = c

mp
b.sets = c.sets
Ξ±: Type u_1
b, c: Basis Ξ±
Β«b = cΒ»: b = c

mp
b.sets = c.sets
Ξ±: Type u_1
b, c: Basis Ξ±
Β«b = cΒ»: b = c

mp
c.sets = c.sets

Goals accomplished! πŸ™
Ξ±: Type u_1
b, c: Basis Ξ±

mpr
b.sets = c.sets β†’ b = c
Ξ±: Type u_1
b, c: Basis Ξ±
Β«b.sets = c.setsΒ»: b.sets = c.sets

mpr
b = 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✝ }

Goals accomplished! πŸ™
-- 46
Basis.eq_def : βˆ€ {Ξ± : Type u_1} (b c : Basis Ξ±), b = c ↔ b.sets = c.sets 0 β”‚ β”‚ Ξ± β”œ Type u_1 1 β”‚ β”‚ b β”œ Basis Ξ± 2 β”‚ β”‚ c β”œ Basis Ξ± 3 β”‚ β”‚ Β«b = cΒ» β”‚ β”Œ b = c 4 β”‚3 β”‚ congrArg β”‚ β”‚ (b.sets = c.sets) = (c.sets = c.sets) 5 β”‚4 β”‚ id β”‚ β”‚ (b.sets = c.sets) = (c.sets = c.sets) 6 β”‚ β”‚ Eq.refl β”‚ β”‚ c.sets = c.sets 7 β”‚5,6 β”‚ Eq.mpr β”‚ β”‚ b.sets = c.sets 8 β”‚3,7 β”‚ βˆ€I β”‚ b = c β†’ b.sets = c.sets 9 β”‚ β”‚ Β«b.sets = c.setsΒ» β”‚ β”Œ b.sets = c.sets 10β”‚ β”‚ sets✝ β”‚ β”‚ β”Œ Set (Set Ξ±) 11β”‚ β”‚ sets_nonempty✝ β”‚ β”‚ β”œ βˆƒ s, s ∈ sets✝ 12β”‚ β”‚ inter_mem_sets✝ β”‚ β”‚ β”œ βˆ€ {s t : Set Ξ±}, s ∈ sets✝ β†’ t ∈ sets✝ β†’ βˆƒ u ∈ sets✝, u βŠ† s ∩ t 13β”‚ β”‚ h✝ β”‚ β”‚ β”œ b = { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ } 14β”‚ β”‚ Β«b.sets = c.setsΒ» β”‚ β”‚ β”‚ β”Œ { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ }.sets = c.sets 15β”‚ β”‚ sets✝ β”‚ β”‚ β”‚ β”‚ β”Œ Set (Set Ξ±) 16β”‚ β”‚ sets_nonempty✝ β”‚ β”‚ β”‚ β”‚ β”œ βˆƒ s, s ∈ sets✝ 17β”‚ β”‚ inter_mem_sets✝ β”‚ β”‚ β”‚ β”‚ β”œ βˆ€ {s t : Set Ξ±}, s ∈ sets✝ β†’ t ∈ sets✝ β†’ βˆƒ u ∈ sets✝, u βŠ† s ∩ t 18β”‚ β”‚ h✝ β”‚ β”‚ β”‚ β”‚ β”œ c = { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ } 19β”‚ β”‚ Β«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 20β”‚ β”‚ Ξ± β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œ Type u_1 21β”‚ β”‚ sets✝ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œ Set (Set Ξ±) 22β”‚ β”‚ sets β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œ Set (Set Ξ±) 23β”‚ β”‚ e_sets β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œ sets✝ = sets 24β”‚ β”‚ sets_nonempty β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œ βˆƒ s, s ∈ sets✝ 25β”‚ β”‚ inter_mem_sets β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œ βˆ€ {s t : Set Ξ±}, s ∈ sets✝ β†’ t ∈ sets✝ β†’ βˆƒ u ∈ sets✝, u βŠ† s ∩ t 26β”‚ β”‚ Eq.refl β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ { sets := sets✝, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } = { sets := sets✝, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } 27β”‚24,25,26 β”‚ βˆ€I β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ βˆ€ (sets_nonempty : βˆƒ s, s ∈ sets✝) (inter_mem_sets : βˆ€ {s t : Set Ξ±}, s ∈ sets✝ β†’ t ∈ sets✝ β†’ βˆƒ u ∈ sets✝, u βŠ† s ∩ t), { sets := sets✝, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } = { sets := sets✝, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } 28β”‚27,23 β”‚ Eq.rec β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ βˆ€ (sets_nonempty : βˆƒ s, s ∈ sets✝) (inter_mem_sets : βˆ€ {s t : Set Ξ±}, s ∈ sets✝ β†’ t ∈ sets✝ β†’ βˆƒ u ∈ sets✝, u βŠ† s ∩ t), { sets := sets✝, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } = { sets := sets, sets_nonempty := β‹―, inter_mem_sets := β‹― } 29β”‚20,21,22,23,28β”‚ βˆ€I β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ βˆ€ {Ξ± : Type u_1} (sets sets_1 : Set (Set Ξ±)) (e_sets : sets = sets_1) (sets_nonempty : βˆƒ s, s ∈ sets) (inter_mem_sets : βˆ€ {s t : Set Ξ±}, s ∈ sets β†’ t ∈ sets β†’ βˆƒ u ∈ sets, u βŠ† s ∩ t), { sets := sets, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } = { sets := sets_1, sets_nonempty := β‹―, inter_mem_sets := β‹― } 30β”‚29,19,11,12 β”‚ βˆ€E β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ { sets := sets✝¹, sets_nonempty := sets_nonempty✝¹, inter_mem_sets := inter_mem_sets✝¹ } = { sets := sets✝, sets_nonempty := β‹―, inter_mem_sets := β‹― } 31β”‚19,30 β”‚ βˆ€I β”‚ β”‚ β”‚ β”‚ β”‚ βˆ€ (Β«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), { sets := sets✝¹, sets_nonempty := sets_nonempty✝¹, inter_mem_sets := inter_mem_sets✝¹ } = { sets := sets✝, sets_nonempty := β‹―, inter_mem_sets := β‹― } 32β”‚18 β”‚ Eq.symm β”‚ β”‚ β”‚ β”‚ β”‚ { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ } = c 33β”‚31,32,14 β”‚ Eq.ndrec β”‚ β”‚ β”‚ β”‚ β”‚ { sets := sets✝¹, sets_nonempty := sets_nonempty✝¹, inter_mem_sets := inter_mem_sets✝¹ } = c 34β”‚15,16,17,18,33β”‚ βˆ€I β”‚ β”‚ β”‚ β”‚ βˆ€ (sets : Set (Set Ξ±)) (sets_nonempty : βˆƒ s, s ∈ sets) (inter_mem_sets : βˆ€ {s t : Set Ξ±}, s ∈ sets β†’ t ∈ sets β†’ βˆƒ u ∈ sets, u βŠ† s ∩ t), c = { sets := sets, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } β†’ { sets := sets✝¹, sets_nonempty := sets_nonempty✝¹, inter_mem_sets := inter_mem_sets✝¹ } = c 35β”‚ β”‚ Eq.refl β”‚ β”‚ β”‚ β”‚ c = c 36β”‚34,35 β”‚ Basis.casesOn β”‚ β”‚ β”‚ β”‚ { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ } = c 37β”‚14,36 β”‚ βˆ€I β”‚ β”‚ β”‚ { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ }.sets = c.sets β†’ { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ } = c 38β”‚13 β”‚ Eq.symm β”‚ β”‚ β”‚ { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ } = b 39β”‚37,38,9 β”‚ Eq.ndrec β”‚ β”‚ β”‚ b = c 40β”‚10,11,12,13,39β”‚ βˆ€I β”‚ β”‚ βˆ€ (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 := sets, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } β†’ b = c 41β”‚ β”‚ Eq.refl β”‚ β”‚ b = b 42β”‚40,41 β”‚ Basis.casesOn β”‚ β”‚ b = c 43β”‚9,42 β”‚ βˆ€I β”‚ b.sets = c.sets β†’ b = c 44β”‚8,43 β”‚ Iff.intro β”‚ b = c ↔ b.sets = c.sets 45β”‚0,1,2,44 β”‚ βˆ€I β”‚ βˆ€ {Ξ± : Type u_1} (b c : Basis Ξ±), b = c ↔ b.sets = c.sets
theorem
Basis.eq_def₁: βˆ€ (b c : Basis Ξ±), b = c ↔ b.sets = c.sets
Basis.eq_def₁
(
b: Basis Ξ±
b
c: Basis Ξ±
c
:
Basis: Type u_1 β†’ Type u_1
Basis
Ξ±: Type u_1
Ξ±
) :
b: Basis Ξ±
b
=
c: Basis Ξ±
c
↔
b: Basis Ξ±
b
.
sets: {Ξ± : Type u_1} β†’ Basis Ξ± β†’ Set (Set Ξ±)
sets
=
c: Basis Ξ±
c
.
sets: {Ξ± : Type u_1} β†’ Basis Ξ± β†’ Set (Set Ξ±)
sets
:=

Goals accomplished! πŸ™
Ξ±: Type u_1
b, c: Basis Ξ±

mp
b = c β†’ b.sets = c.sets
Ξ±: Type u_1
b, c: Basis Ξ±
b.sets = c.sets β†’ b = c
Ξ±: Type u_1
b, c: Basis Ξ±

mp
b = c β†’ b.sets = c.sets
Ξ±: Type u_1
b, c: Basis Ξ±
Β«b = cΒ»: b = c

mp
b.sets = c.sets
Ξ±: Type u_1
b, c: Basis Ξ±
Β«b = cΒ»: b = c

mp
b.sets = c.sets
Ξ±: Type u_1
b, c: Basis Ξ±
Β«b = cΒ»: b = c

mp
c.sets = c.sets

Goals accomplished! πŸ™
Ξ±: Type u_1
b, c: Basis Ξ±

mpr
b.sets = c.sets β†’ b = c
Ξ±: Type u_1
b, c: Basis Ξ±
Β«b.sets = c.setsΒ»: b.sets = c.sets

mpr
b = 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✝ }

Goals accomplished! πŸ™
-- 53
Basis.eq_def₁ : βˆ€ {Ξ± : Type u_1} (b c : Basis Ξ±), b = c ↔ b.sets = c.sets 0 β”‚ β”‚ Ξ± β”œ Type u_1 1 β”‚ β”‚ b β”œ Basis Ξ± 2 β”‚ β”‚ c β”œ Basis Ξ± 3 β”‚ β”‚ Β«b = cΒ» β”‚ β”Œ b = c 4 β”‚3 β”‚ congrArg β”‚ β”‚ (b.sets = c.sets) = (c.sets = c.sets) 5 β”‚4 β”‚ id β”‚ β”‚ (b.sets = c.sets) = (c.sets = c.sets) 6 β”‚ β”‚ Eq.refl β”‚ β”‚ c.sets = c.sets 7 β”‚5,6 β”‚ Eq.mpr β”‚ β”‚ b.sets = c.sets 8 β”‚3,7 β”‚ βˆ€I β”‚ b = c β†’ b.sets = c.sets 9 β”‚ β”‚ Β«b.sets = c.setsΒ» β”‚ β”Œ b.sets = c.sets 10β”‚ β”‚ sets✝ β”‚ β”‚ β”Œ Set (Set Ξ±) 11β”‚ β”‚ sets_nonempty✝ β”‚ β”‚ β”œ βˆƒ s, s ∈ sets✝ 12β”‚ β”‚ inter_mem_sets✝ β”‚ β”‚ β”œ βˆ€ {s t : Set Ξ±}, s ∈ sets✝ β†’ t ∈ sets✝ β†’ βˆƒ u ∈ sets✝, u βŠ† s ∩ t 13β”‚ β”‚ h✝ β”‚ β”‚ β”œ b = { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ } 14β”‚ β”‚ Β«b.sets = c.setsΒ» β”‚ β”‚ β”‚ β”Œ { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ }.sets = c.sets 15β”‚ β”‚ sets✝ β”‚ β”‚ β”‚ β”‚ β”Œ Set (Set Ξ±) 16β”‚ β”‚ sets_nonempty✝ β”‚ β”‚ β”‚ β”‚ β”œ βˆƒ s, s ∈ sets✝ 17β”‚ β”‚ inter_mem_sets✝ β”‚ β”‚ β”‚ β”‚ β”œ βˆ€ {s t : Set Ξ±}, s ∈ sets✝ β†’ t ∈ sets✝ β†’ βˆƒ u ∈ sets✝, u βŠ† s ∩ t 18β”‚ β”‚ h✝ β”‚ β”‚ β”‚ β”‚ β”œ c = { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ } 19β”‚ β”‚ Β«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 20β”‚ β”‚ Ξ± β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œ Type u_1 21β”‚ β”‚ sets✝ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œ Set (Set Ξ±) 22β”‚ β”‚ sets β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œ Set (Set Ξ±) 23β”‚ β”‚ e_sets β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œ sets✝ = sets 24β”‚ β”‚ sets_nonempty β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œ βˆƒ s, s ∈ sets✝ 25β”‚ β”‚ inter_mem_sets β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œ βˆ€ {s t : Set Ξ±}, s ∈ sets✝ β†’ t ∈ sets✝ β†’ βˆƒ u ∈ sets✝, u βŠ† s ∩ t 26β”‚ β”‚ Eq.refl β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ { sets := sets✝, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } = { sets := sets✝, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } 27β”‚24,25,26 β”‚ βˆ€I β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ βˆ€ (sets_nonempty : βˆƒ s, s ∈ sets✝) (inter_mem_sets : βˆ€ {s t : Set Ξ±}, s ∈ sets✝ β†’ t ∈ sets✝ β†’ βˆƒ u ∈ sets✝, u βŠ† s ∩ t), { sets := sets✝, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } = { sets := sets✝, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } 28β”‚27,23 β”‚ Eq.rec β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ βˆ€ (sets_nonempty : βˆƒ s, s ∈ sets✝) (inter_mem_sets : βˆ€ {s t : Set Ξ±}, s ∈ sets✝ β†’ t ∈ sets✝ β†’ βˆƒ u ∈ sets✝, u βŠ† s ∩ t), { sets := sets✝, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } = { sets := sets, sets_nonempty := β‹―, inter_mem_sets := β‹― } 29β”‚20,21,22,23,28β”‚ βˆ€I β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ βˆ€ {Ξ± : Type u_1} (sets sets_1 : Set (Set Ξ±)) (e_sets : sets = sets_1) (sets_nonempty : βˆƒ s, s ∈ sets) (inter_mem_sets : βˆ€ {s t : Set Ξ±}, s ∈ sets β†’ t ∈ sets β†’ βˆƒ u ∈ sets, u βŠ† s ∩ t), { sets := sets, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } = { sets := sets_1, sets_nonempty := β‹―, inter_mem_sets := β‹― } 30β”‚19 β”‚ id β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ sets✝¹ = sets✝ 31β”‚30 β”‚ id β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ sets✝¹ = sets✝ 32β”‚29,31,11,12 β”‚ βˆ€E β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ { sets := sets✝¹, sets_nonempty := sets_nonempty✝¹, inter_mem_sets := inter_mem_sets✝¹ } = { sets := sets✝, sets_nonempty := β‹―, inter_mem_sets := β‹― } 33β”‚32 β”‚ congrArg β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ ({ sets := sets✝¹, sets_nonempty := sets_nonempty✝¹, inter_mem_sets := inter_mem_sets✝¹ } = { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ }) = ({ sets := sets✝, sets_nonempty := β‹―, inter_mem_sets := β‹― } = { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ }) 34β”‚ β”‚ eq_self β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ ({ sets := sets✝, sets_nonempty := β‹―, inter_mem_sets := β‹― } = { sets := sets✝, sets_nonempty := β‹―, inter_mem_sets := β‹― }) = True 35β”‚33,34 β”‚ Eq.trans β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ ({ sets := sets✝¹, sets_nonempty := sets_nonempty✝¹, inter_mem_sets := inter_mem_sets✝¹ } = { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ }) = True 36β”‚35 β”‚ of_eq_true β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ { sets := sets✝¹, sets_nonempty := sets_nonempty✝¹, inter_mem_sets := inter_mem_sets✝¹ } = { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ } 37β”‚19,36 β”‚ βˆ€I β”‚ β”‚ β”‚ β”‚ β”‚ { 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 β†’ { sets := sets✝¹, sets_nonempty := sets_nonempty✝¹, inter_mem_sets := inter_mem_sets✝¹ } = { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ } 38β”‚18 β”‚ Eq.symm β”‚ β”‚ β”‚ β”‚ β”‚ { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ } = c 39β”‚37,38,14 β”‚ Eq.ndrec β”‚ β”‚ β”‚ β”‚ β”‚ { sets := sets✝¹, sets_nonempty := sets_nonempty✝¹, inter_mem_sets := inter_mem_sets✝¹ } = c 40β”‚15,16,17,18,39β”‚ βˆ€I β”‚ β”‚ β”‚ β”‚ βˆ€ (sets : Set (Set Ξ±)) (sets_nonempty : βˆƒ s, s ∈ sets) (inter_mem_sets : βˆ€ {s t : Set Ξ±}, s ∈ sets β†’ t ∈ sets β†’ βˆƒ u ∈ sets, u βŠ† s ∩ t), c = { sets := sets, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } β†’ { sets := sets✝¹, sets_nonempty := sets_nonempty✝¹, inter_mem_sets := inter_mem_sets✝¹ } = c 41β”‚ β”‚ Eq.refl β”‚ β”‚ β”‚ β”‚ c = c 42β”‚40,41 β”‚ Basis.casesOn β”‚ β”‚ β”‚ β”‚ { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ } = c 43β”‚14,42 β”‚ βˆ€I β”‚ β”‚ β”‚ { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ }.sets = c.sets β†’ { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ } = c 44β”‚13 β”‚ Eq.symm β”‚ β”‚ β”‚ { sets := sets✝, sets_nonempty := sets_nonempty✝, inter_mem_sets := inter_mem_sets✝ } = b 45β”‚43,44,9 β”‚ Eq.ndrec β”‚ β”‚ β”‚ b = c 46β”‚10,11,12,13,45β”‚ βˆ€I β”‚ β”‚ βˆ€ (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 := sets, sets_nonempty := sets_nonempty, inter_mem_sets := inter_mem_sets } β†’ b = c 47β”‚ β”‚ Eq.refl β”‚ β”‚ b = b 48β”‚46,47 β”‚ Basis.casesOn β”‚ β”‚ b = c 49β”‚9,48 β”‚ βˆ€I β”‚ b.sets = c.sets β†’ b = c 50β”‚8,49 β”‚ Iff.intro β”‚ b = c ↔ b.sets = c.sets 51β”‚0,1,2,50 β”‚ βˆ€I β”‚ βˆ€ {Ξ± : Type u_1} (b c : Basis Ξ±), b = c ↔ b.sets = c.sets