/- Copyright (c) 2021 Aaron Anderson, Yaël Dillies. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Aaron Anderson, Kevin Buzzard, Yaël Dillies, Eric Wieser ! This file was ported from Lean 3 source module order.sup_indep ! leanprover-community/mathlib commit 1c857a1f6798cb054be942199463c2cf904cb937 ! Please do not edit these lines, except to modify the commit id ! if you have ported upstream changes. -/ import Mathlib.Data.Finset.Pairwise import Mathlib.Data.Finset.Powerset import Mathlib.Data.Fintype.Basic /-! # Supremum independence In this file, we define supremum independence of indexed sets. An indexed family `f : ι → α` is sup-independent if, for all `a`, `f a` and the supremum of the rest are disjoint. ## Main definitions * `Finset.SupIndep s f`: a family of elements `f` are supremum independent on the finite set `s`. * `CompleteLattice.SetIndependent s`: a set of elements are supremum independent. * `CompleteLattice.Independent f`: a family of elements are supremum independent. ## Main statements * In a distributive lattice, supremum independence is equivalent to pairwise disjointness: * `Finset.supIndep_iff_pairwiseDisjoint` * `CompleteLattice.setIndependent_iff_pairwiseDisjoint` * `CompleteLattice.independent_iff_pairwiseDisjoint` * Otherwise, supremum independence is stronger than pairwise disjointness: * `Finset.SupIndep.pairwiseDisjoint` * `CompleteLattice.SetIndependent.pairwiseDisjoint` * `CompleteLattice.Independent.pairwiseDisjoint` ## Implementation notes For the finite version, we avoid the "obvious" definition `∀ i ∈ s, Disjoint (f i) ((s.erase i).sup f)` because `erase` would require decidable equality on `ι`. -/ variable {αα: Type ?u.24525ββ: Type ?u.17ιι: Type ?u.8ι' :ι': Type ?u.24534Type _} /-! ### On lattices with a bottom element, via `Finset.sup` -/ namespace Finset section Lattice variable [LatticeType _: Type (?u.51970+1)α] [OrderBotα: Type ?u.4776α] /-- Supremum independence of finite sets. We avoid the "obvious" definition using `s.erase i` because `erase` would require decidable equality on `ι`. -/ def SupIndep (α: Type ?u.14s : Finsets: Finset ιι) (ι: Type ?u.350f :f: ι → αι →ι: Type ?u.350α) :α: Type ?u.344Prop := ∀ ⦃Prop: Typet⦄,t: ?m.685t ⊆t: ?m.685s → ∀ ⦃s: Finset ιi⦄,i: ?m.707i ∈i: ?m.707s →s: Finset ιi ∉i: ?m.707t →t: ?m.685Disjoint (Disjoint: {α : Type ?u.752} → [inst : PartialOrder α] → [inst : OrderBot α] → α → α → Propff: ι → αi) (i: ?m.707t.t: ?m.685supsup: {α : Type ?u.825} → {β : Type ?u.824} → [inst : SemilatticeSup α] → [inst : OrderBot α] → Finset β → (β → α) → αf) #align finset.sup_indep Finset.SupIndep variable {f: ι → αss: Finset ιt : Finsett: Finset ιι} {ι: Type ?u.1256f :f: ι → αι →ι: Type ?u.1598α} {α: Type ?u.4262i :i: ιι}ι: Type ?u.4782instance [DecidableEqinstance: {α : Type u_1} → {ι : Type u_2} → [inst : Lattice α] → [inst_1 : OrderBot α] → {s : Finset ι} → {f : ι → α} → [inst_2 : DecidableEq ι] → [inst_3 : DecidableEq α] → Decidable (SupIndep s f)ι] [DecidableEqι: Type ?u.1598α] : Decidable (SupIndepα: Type ?u.1592ss: Finset ιf) :=f: ι → αGoals accomplished! 🐙theorem SupIndep.subset (Goals accomplished! 🐙ht :ht: SupIndep t ft.SupIndept: Finset ιf) (f: ι → αh :h: s ⊆ ts ⊆s: Finset ιt) :t: Finset ιs.SupIndeps: Finset ιf := funf: ι → α__: ?m.4156huhu: ?m.4159__: ?m.4162hi =>hi: ?m.4165ht (ht: SupIndep t fhu.transhu: ?m.4159h) (h: s ⊆ thh: s ⊆ thi) #align finset.sup_indep.subset Finset.SupIndep.subset theorem supIndep_empty (hi: ?m.4165f :f: ι → αι →ι: Type ?u.4268α) : (α: Type ?u.4262∅ : Finset∅: ?m.4611ι).ι: Type ?u.4268SupIndepf := funf: ι → α__: ?m.4742__: ?m.4745aa: ?m.4748ha => (not_mem_emptyha: ?m.4751aa: ?m.4748ha).elim #align finset.sup_indep_empty Finset.supIndep_empty theoremha: ?m.4751supIndep_singleton (supIndep_singleton: ∀ (i : ι) (f : ι → α), SupIndep {i} fi :i: ιι) (ι: Type ?u.4782f :f: ι → αι →ι: Type ?u.4782α) : ({α: Type ?u.4776i} : Finseti: ιι).ι: Type ?u.4782SupIndepf := funf: ι → αss: ?m.5239hshs: ?m.5242jj: ?m.5245hjihji: ?m.5248hj =>hj: ?m.5251Goals accomplished! 🐙#align finset.sup_indep_singleton Finset.supIndep_singleton theoremGoals accomplished! 🐙SupIndep.pairwiseDisjoint (hs :hs: SupIndep s fs.SupIndeps: Finset ιf) : (f: ι → αs : Sets: Finset ιι).ι: Type ?u.5849PairwiseDisjointf := funf: ι → α__: ?m.6758haha: ?m.6761__: ?m.6764hbhb: ?m.6767hab => sup_singleton.subst <|hab: ?m.6770hs (singleton_subset_iff.2hs: SupIndep s fhb)hb: ?m.6767ha <| not_mem_singleton.2ha: ?m.6761hab #align finset.sup_indep.pairwise_disjoint Finset.SupIndep.pairwiseDisjoint /-- The RHS looks like the definition of `CompleteLattice.Independent`. -/ theoremhab: ?m.6770supIndep_iff_disjoint_erase [DecidableEqι] :ι: Type ?u.6959s.SupIndeps: Finset ιf ↔ ∀f: ι → αi ∈i: ?m.7339s,s: Finset ιDisjoint (Disjoint: {α : Type ?u.7372} → [inst : PartialOrder α] → [inst : OrderBot α] → α → α → Propff: ι → αi) ((i: ?m.7339s.s: Finset ιeraseerase: {α : Type ?u.7444} → [inst : DecidableEq α] → Finset α → α → Finset αi).i: ?m.7339supsup: {α : Type ?u.7492} → {β : Type ?u.7491} → [inst : SemilatticeSup α] → [inst : OrderBot α] → Finset β → (β → α) → αf) := ⟨funf: ι → αhshs: ?m.7891__: ?m.7894hi =>hi: ?m.7897hs (hs: ?m.7891erase_subseterase_subset: ∀ {α : Type ?u.7900} [inst : DecidableEq α] (a : α) (s : Finset α), erase s a ⊆ s__: ?m.7901_)_: Finset ?m.7901hi (not_mem_erasehi: ?m.7897__: ?m.8037_), fun_: Finset ?m.8037hshs: ?m.8134__: ?m.8139htht: ?m.8142ii: ?m.8145hihi: ?m.8148hit => (hit: ?m.8151hshs: ?m.8134ii: ?m.8145hi).hi: ?m.8148mono_right (sup_mono fun__: ?m.8317hj => mem_erase.2 ⟨ne_of_mem_of_not_memhj: ?m.8320hjhj: ?m.8320hit,hit: ?m.8151htht: ?m.8142hj⟩)⟩ #align finset.sup_indep_iff_disjoint_erase Finset.supIndep_iff_disjoint_erase @[simp] theoremhj: ?m.8320supIndep_pair [DecidableEqι] {ι: Type ?u.8836ii: ιj :j: ιι} (ι: Type ?u.8836hij :hij: i ≠ ji ≠i: ιj) : ({j: ιi,i: ιj} : Finsetj: ιι).ι: Type ?u.8836SupIndepf ↔f: ι → αDisjoint (Disjoint: {α : Type ?u.9301} → [inst : PartialOrder α] → [inst : OrderBot α] → α → α → Propff: ι → αi) (i: ιff: ι → αj) := ⟨funj: ιh =>h: ?m.9620h.pairwiseDisjoint (h: ?m.9620Goals accomplished! 🐙) (Goals accomplished! 🐙Goals accomplished! 🐙)Goals accomplished! 🐙hij, funhij: i ≠ jh =>h: ?m.9694Goals accomplished! 🐙α: Type u_2
β: Type ?u.8833
ι: Type u_1
ι': Type ?u.8839
inst✝²: Lattice α
inst✝¹: OrderBot α
s, t: Finset ι
f: ι → α
i: ι
inst✝: DecidableEq ι
j, k: ι
hij: k ≠ j
h: Disjoint (f k) (f j)
inlα: Type u_2
β: Type ?u.8833
ι: Type u_1
ι': Type ?u.8839
inst✝²: Lattice α
inst✝¹: OrderBot α
s, t: Finset ι
f: ι → α
i✝: ι
inst✝: DecidableEq ι
i, k: ι
hij: i ≠ k
h: Disjoint (f i) (f k)
inrα: Type u_2
β: Type ?u.8833
ι: Type u_1
ι': Type ?u.8839
inst✝²: Lattice α
inst✝¹: OrderBot α
s, t: Finset ι
f: ι → α
i: ι
inst✝: DecidableEq ι
j, k: ι
hij: k ≠ j
h: Disjoint (f k) (f j)
inlα: Type u_2
β: Type ?u.8833
ι: Type u_1
ι': Type ?u.8839
inst✝²: Lattice α
inst✝¹: OrderBot α
s, t: Finset ι
f: ι → α
i✝: ι
inst✝: DecidableEq ι
i, k: ι
hij: i ≠ k
h: Disjoint (f i) (f k)
inrα: Type u_2
β: Type ?u.8833
ι: Type u_1
ι': Type ?u.8839
inst✝²: Lattice α
inst✝¹: OrderBot α
s, t: Finset ι
f: ι → α
i: ι
inst✝: DecidableEq ι
j, k: ι
hij: k ≠ j
h: Disjoint (f k) (f j)
h.e'_5α: Type u_2
β: Type ?u.8833
ι: Type u_1
ι': Type ?u.8839
inst✝²: Lattice α
inst✝¹: OrderBot α
s, t: Finset ι
f: ι → α
i: ι
inst✝: DecidableEq ι
j, k: ι
hij: k ≠ j
h: Disjoint (f k) (f j)
h.e'_5α: Type u_2
β: Type ?u.8833
ι: Type u_1
ι': Type ?u.8839
inst✝²: Lattice α
inst✝¹: OrderBot α
s, t: Finset ι
f: ι → α
i: ι
inst✝: DecidableEq ι
j, k: ι
hij: k ≠ j
h: Disjoint (f k) (f j)
h.e'_5f j = f jα: Type u_2
β: Type ?u.8833
ι: Type u_1
ι': Type ?u.8839
inst✝²: Lattice α
inst✝¹: OrderBot α
s, t: Finset ι
f: ι → α
i: ι
inst✝: DecidableEq ι
j, k: ι
hij: k ≠ j
h: Disjoint (f k) (f j)
h.e'_5Goals accomplished! 🐙Goals accomplished! 🐙α: Type u_2
β: Type ?u.8833
ι: Type u_1
ι': Type ?u.8839
inst✝²: Lattice α
inst✝¹: OrderBot α
s, t: Finset ι
f: ι → α
i✝: ι
inst✝: DecidableEq ι
i, k: ι
hij: i ≠ k
h: Disjoint (f i) (f k)
a✝: ι
aα: Type u_2
β: Type ?u.8833
ι: Type u_1
ι': Type ?u.8839
inst✝²: Lattice α
inst✝¹: OrderBot α
s, t: Finset ι
f: ι → α
i✝: ι
inst✝: DecidableEq ι
i, k: ι
hij: i ≠ k
h: Disjoint (f i) (f k)
a✝: ι
aGoals accomplished! 🐙⟩ #align finset.sup_indep_pair Finset.supIndep_pair theorem supIndep_univ_bool (Goals accomplished! 🐙f :f: Bool → αBool →Bool: Typeα) : (Finset.univ : Finsetα: Type ?u.13540Bool).Bool: TypeSupIndepf ↔f: Bool → αDisjoint (Disjoint: {α : Type ?u.13957} → [inst : PartialOrder α] → [inst : OrderBot α] → α → α → Propff: Bool → αfalse) (false: Boolff: Bool → αtrue) := haveI :true: Booltrue ≠true: Boolfalse :=false: BoolGoals accomplished! 🐙(supIndep_pair this).trans disjoint_comm #align finset.sup_indep_univ_bool Finset.supIndep_univ_bool @[simp] theoremGoals accomplished! 🐙supIndep_univ_fin_two (f : Finf: Fin 2 → α2 →2: ?m.15226α) : (Finset.univ : Finset (Finα: Type ?u.148822)).2: ?m.15241SupIndepf ↔f: Fin 2 → αDisjoint (Disjoint: {α : Type ?u.15316} → [inst : PartialOrder α] → [inst : OrderBot α] → α → α → Propff: Fin 2 → α0) (0: ?m.15321ff: Fin 2 → α1) := haveI : (1: ?m.153470 : Fin0: ?m.156682) ≠2: ?m.156651 :=1: ?m.15671Goals accomplished! 🐙supIndep_pairGoals accomplished! 🐙this #align finset.sup_indep_univ_fin_two Finset.supIndep_univ_fin_two theoremthis: 0 ≠ 1SupIndep.attach (SupIndep.attach: SupIndep s f → SupIndep (Finset.attach s) (f ∘ Subtype.val)hs :hs: SupIndep s fs.SupIndeps: Finset ιf) :f: ι → αs.attach.SupIndep (s: Finset ιf ∘ Subtype.val) :=f: ι → αGoals accomplished! 🐙#align finset.sup_indep.attach Finset.SupIndep.attach end Lattice section DistribLattice variable [DistribLatticeGoals accomplished! 🐙α] [OrderBotα: Type ?u.22021α] {α: Type ?u.18164s : Finsets: Finset ιι} {ι: Type ?u.18563f :f: ι → αι →ι: Type ?u.18170α} theoremα: Type ?u.18164supIndep_iff_pairwiseDisjoint :supIndep_iff_pairwiseDisjoint: SupIndep s f ↔ Set.PairwiseDisjoint (↑s) fs.SupIndeps: Finset ιf ↔ (f: ι → αs : Sets: Finset ιι).ι: Type ?u.18563PairwiseDisjointf := ⟨SupIndep.pairwiseDisjoint, funf: ι → αhshs: ?m.19712__: ?m.19715htht: ?m.19718__: ?m.19721hihi: ?m.19724hit => Finset.disjoint_sup_right.2 funhit: ?m.19727__: ?m.19835hj =>hj: ?m.19838hshs: ?m.19712hi (hi: ?m.19724htht: ?m.19718hj) (ne_of_mem_of_not_memhj: ?m.19838hjhj: ?m.19838hit).symm⟩ #align finset.sup_indep_iff_pairwise_disjointhit: ?m.19727Finset.supIndep_iff_pairwiseDisjoint aliasFinset.supIndep_iff_pairwiseDisjoint: ∀ {α : Type u_1} {ι : Type u_2} [inst : DistribLattice α] [inst_1 : OrderBot α] {s : Finset ι} {f : ι → α}, SupIndep s f ↔ Set.PairwiseDisjoint (↑s) fsupIndep_iff_pairwiseDisjoint ↔supIndep_iff_pairwiseDisjoint: ∀ {α : Type u_1} {ι : Type u_2} [inst : DistribLattice α] [inst_1 : OrderBot α] {s : Finset ι} {f : ι → α}, SupIndep s f ↔ Set.PairwiseDisjoint (↑s) fsup_indep.pairwise_disjointsup_indep.pairwise_disjoint: ∀ {α : Type u_1} {ι : Type u_2} [inst : DistribLattice α] [inst_1 : OrderBot α] {s : Finset ι} {f : ι → α}, SupIndep s f → Set.PairwiseDisjoint (↑s) f_root_.Set.PairwiseDisjoint.supIndep #align set.pairwise_disjoint.sup_indep_root_.Set.PairwiseDisjoint.supIndep: ∀ {α : Type u_1} {ι : Type u_2} [inst : DistribLattice α] [inst_1 : OrderBot α] {s : Finset ι} {f : ι → α}, Set.PairwiseDisjoint (↑s) f → SupIndep s fSet.PairwiseDisjoint.supIndep /-- Bind operation for `SupIndep`. -/ theoremSet.PairwiseDisjoint.supIndep: ∀ {α : Type u_1} {ι : Type u_2} [inst : DistribLattice α] [inst_1 : OrderBot α] {s : Finset ι} {f : ι → α}, Set.PairwiseDisjoint (↑s) f → SupIndep s fSupIndep.sup [DecidableEqSupIndep.sup: ∀ {α : Type u_3} {ι : Type u_1} {ι' : Type u_2} [inst : DistribLattice α] [inst_1 : OrderBot α] [inst_2 : DecidableEq ι] {s : Finset ι'} {g : ι' → Finset ι} {f : ι → α}, (SupIndep s fun i => Finset.sup (g i) f) → (∀ (i' : ι'), i' ∈ s → SupIndep (g i') f) → SupIndep (Finset.sup s g) fι] {ι: Type ?u.19953s : Finsets: Finset ι'ι'} {ι': Type ?u.19956g :g: ι' → Finset ιι' → Finsetι': Type ?u.19956ι} {ι: Type ?u.19953f :f: ι → αι →ι: Type ?u.19953α} (α: Type ?u.19947hs :hs: SupIndep s fun i => Finset.sup (g i) fs.SupIndep funs: Finset ι'i => (i: ?m.20426gg: ι' → Finset ιi).i: ?m.20426supsup: {α : Type ?u.20429} → {β : Type ?u.20428} → [inst : SemilatticeSup α] → [inst : OrderBot α] → Finset β → (β → α) → αf) (hg : ∀f: ι → αi' ∈i': ?m.20678s, (s: Finset ι'gg: ι' → Finset ιi').i': ?m.20678SupIndepf) : (f: ι → αs.s: Finset ι'supsup: {α : Type ?u.20782} → {β : Type ?u.20781} → [inst : SemilatticeSup α] → [inst : OrderBot α] → Finset β → (β → α) → αg).g: ι' → Finset ιSupIndepf :=f: ι → αGoals accomplished! 🐙α: Type u_3
β: Type ?u.19950
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: SupIndep s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → SupIndep (g i') fSupIndep (Finset.sup s g) fα: Type u_3
β: Type ?u.19950
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: SupIndep s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → SupIndep (g i') fSupIndep (Finset.sup s g) fα: Type u_3
β: Type ?u.19950
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: Set.PairwiseDisjoint ↑s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → Set.PairwiseDisjoint (↑(g i')) fSet.PairwiseDisjoint (↑(Finset.sup s g)) fα: Type u_3
β: Type ?u.19950
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: Set.PairwiseDisjoint ↑s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → Set.PairwiseDisjoint (↑(g i')) fSet.PairwiseDisjoint (↑(Finset.sup s g)) fα: Type u_3
β: Type ?u.19950
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: SupIndep s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → SupIndep (g i') fSupIndep (Finset.sup s g) fα: Type u_3
β: Type ?u.19950
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: Set.PairwiseDisjoint ↑s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → Set.PairwiseDisjoint (↑(g i')) fSet.PairwiseDisjoint (↑(Finset.sup s g)) fα: Type u_3
β: Type ?u.19950
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: Set.PairwiseDisjoint ↑s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → Set.PairwiseDisjoint (↑(g i')) fSet.PairwiseDisjoint (↑(Finset.biUnion s g)) fα: Type u_3
β: Type ?u.19950
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: Set.PairwiseDisjoint ↑s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → Set.PairwiseDisjoint (↑(g i')) fSet.PairwiseDisjoint (↑(Finset.sup s g)) fα: Type u_3
β: Type ?u.19950
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: Set.PairwiseDisjoint ↑s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → Set.PairwiseDisjoint (↑(g i')) fSet.PairwiseDisjoint (Set.iUnion fun x => Set.iUnion fun h => ↑(g x)) fα: Type u_3
β: Type ?u.19950
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: Set.PairwiseDisjoint ↑s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → Set.PairwiseDisjoint (↑(g i')) fSet.PairwiseDisjoint (Set.iUnion fun x => Set.iUnion fun h => ↑(g x)) fα: Type u_3
β: Type ?u.19950
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: SupIndep s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → SupIndep (g i') fSupIndep (Finset.sup s g) f#align finset.sup_indep.sup Finset.SupIndep.sup /-- Bind operation for `SupIndep`. -/ theoremGoals accomplished! 🐙SupIndep.biUnion [DecidableEqSupIndep.biUnion: ∀ {α : Type u_3} {ι : Type u_1} {ι' : Type u_2} [inst : DistribLattice α] [inst_1 : OrderBot α] [inst_2 : DecidableEq ι] {s : Finset ι'} {g : ι' → Finset ι} {f : ι → α}, (SupIndep s fun i => Finset.sup (g i) f) → (∀ (i' : ι'), i' ∈ s → SupIndep (g i') f) → SupIndep (Finset.biUnion s g) fι] {ι: Type ?u.22027s : Finsets: Finset ι'ι'} {ι': Type ?u.22030g :g: ι' → Finset ιι' → Finsetι': Type ?u.22030ι} {ι: Type ?u.22027f :f: ι → αι →ι: Type ?u.22027α} (α: Type ?u.22021hs :hs: SupIndep s fun i => Finset.sup (g i) fs.SupIndep funs: Finset ι'i => (i: ?m.22500gg: ι' → Finset ιi).i: ?m.22500supsup: {α : Type ?u.22503} → {β : Type ?u.22502} → [inst : SemilatticeSup α] → [inst : OrderBot α] → Finset β → (β → α) → αf) (hg : ∀f: ι → αi' ∈i': ?m.22752s, (s: Finset ι'gg: ι' → Finset ιi').i': ?m.22752SupIndepf) : (f: ι → αs.biUnions: Finset ι'g).g: ι' → Finset ιSupIndepf :=f: ι → αGoals accomplished! 🐙α: Type u_3
β: Type ?u.22024
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: SupIndep s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → SupIndep (g i') fSupIndep (Finset.biUnion s g) fα: Type u_3
β: Type ?u.22024
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: SupIndep s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → SupIndep (g i') fSupIndep (Finset.biUnion s g) fα: Type u_3
β: Type ?u.22024
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: SupIndep s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → SupIndep (g i') fSupIndep (Finset.sup s g) fα: Type u_3
β: Type ?u.22024
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: SupIndep s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → SupIndep (g i') fSupIndep (Finset.sup s g) fα: Type u_3
β: Type ?u.22024
ι: Type u_1
ι': Type u_2
inst✝²: DistribLattice α
inst✝¹: OrderBot α
s✝: Finset ι
f✝: ι → α
inst✝: DecidableEq ι
s: Finset ι'
g: ι' → Finset ι
f: ι → α
hs: SupIndep s fun i => Finset.sup (g i) f
hg: ∀ (i' : ι'), i' ∈ s → SupIndep (g i') fSupIndep (Finset.biUnion s g) f#align finset.sup_indep.bUnionGoals accomplished! 🐙Finset.SupIndep.biUnion end DistribLattice end Finset /-! ### On complete lattices via `sSup` -/ namespace CompleteLattice variable [CompleteLatticeFinset.SupIndep.biUnion: ∀ {α : Type u_3} {ι : Type u_1} {ι' : Type u_2} [inst : DistribLattice α] [inst_1 : OrderBot α] [inst_2 : DecidableEq ι] {s : Finset ι'} {g : ι' → Finset ι} {f : ι → α}, (SupIndep s fun i => sup (g i) f) → (∀ (i' : ι'), i' ∈ s → SupIndep (g i') f) → SupIndep (Finset.biUnion s g) fα] open Set Function /-- An independent set of elements in a complete lattice is one in which every element is disjoint from the `Sup` of the rest. -/ defα: Type ?u.23352SetIndependent (SetIndependent: {α : Type u_1} → [inst : CompleteLattice α] → Set α → Props : Sets: Set αα) :α: Type ?u.23367Prop := ∀ ⦃Prop: Typea⦄,a: ?m.23388a ∈a: ?m.23388s →s: Set αDisjointDisjoint: {α : Type ?u.23422} → [inst : PartialOrder α] → [inst : OrderBot α] → α → α → Propa (sSup (a: ?m.23388s \ {s: Set αa})) #align complete_lattice.set_independenta: ?m.23388CompleteLattice.SetIndependent variable {CompleteLattice.SetIndependent: {α : Type u_1} → [inst : CompleteLattice α] → Set α → Props : Sets: Set αα} (α: Type ?u.50577hs :hs: SetIndependent sSetIndependentSetIndependent: {α : Type ?u.36305} → [inst : CompleteLattice α] → Set α → Props) @[simp] theorems: Set αsetIndependent_empty :setIndependent_empty: SetIndependent ∅SetIndependent (SetIndependent: {α : Type ?u.23748} → [inst : CompleteLattice α] → Set α → Prop∅ : Set∅: ?m.23764α) := funα: Type ?u.23706xx: ?m.23817hx => (Set.not_mem_emptyhx: ?m.23820xx: ?m.23817hx).elim #align complete_lattice.set_independent_emptyhx: ?m.23820CompleteLattice.setIndependent_empty theoremCompleteLattice.setIndependent_empty: ∀ {α : Type u_1} [inst : CompleteLattice α], SetIndependent ∅SetIndependent.mono {SetIndependent.mono: ∀ {t : Set α}, t ⊆ s → SetIndependent tt : Sett: Set αα} (α: Type ?u.23849hst :hst: t ⊆ st ⊆t: Set αs) :s: Set αSetIndependentSetIndependent: {α : Type ?u.23915} → [inst : CompleteLattice α] → Set α → Propt := funt: Set α__: ?m.23942ha => (ha: ?m.23945hs (hs: SetIndependent shsthst: t ⊆ sha)).ha: ?m.23945mono_right (sSup_le_sSup (diff_subset_diff_lefthst)) #align complete_lattice.set_independent.monohst: t ⊆ sCompleteLattice.SetIndependent.mono /-- If the elements of a set are independent, then any pair within that set is disjoint. -/ theoremCompleteLattice.SetIndependent.mono: ∀ {α : Type u_1} [inst : CompleteLattice α] {s : Set α}, SetIndependent s → ∀ {t : Set α}, t ⊆ s → SetIndependent tSetIndependent.pairwiseDisjoint :SetIndependent.pairwiseDisjoint: PairwiseDisjoint s ids.PairwiseDisjoints: Set αid := funid: {α : Sort ?u.24329} → α → α__: ?m.24409hxhx: ?m.24412yy: ?m.24415hyhy: ?m.24418h => disjoint_sSup_right (h: ?m.24421hshs: SetIndependent shx) ((mem_diffhx: ?m.24412y).mpr ⟨y: ?m.24415hy,hy: ?m.24418h.symm⟩) #align complete_lattice.set_independent.pairwise_disjointh: ?m.24421CompleteLattice.SetIndependent.pairwiseDisjoint theoremCompleteLattice.SetIndependent.pairwiseDisjoint: ∀ {α : Type u_1} [inst : CompleteLattice α] {s : Set α}, SetIndependent s → PairwiseDisjoint s idsetIndependent_pair {setIndependent_pair: ∀ {α : Type u_1} [inst : CompleteLattice α] {a b : α}, a ≠ b → (SetIndependent {a, b} ↔ Disjoint a b)aa: αb :b: αα} (α: Type ?u.24525hab :hab: a ≠ ba ≠a: αb) :b: αSetIndependent ({SetIndependent: {α : Type ?u.24575} → [inst : CompleteLattice α] → Set α → Propa,a: αb} : Setb: αα) ↔α: Type ?u.24525DisjointDisjoint: {α : Type ?u.24636} → [inst : PartialOrder α] → [inst : OrderBot α] → α → α → Propaa: αb :=b: αGoals accomplished! 🐙α: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, b: α
hab: a ≠ bSetIndependent {a, b} ↔ Disjoint a bα: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, b: α
hab: a ≠ b
mpSetIndependent {a, b} → Disjoint a bα: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, b: α
hab: a ≠ b
mprDisjoint a b → SetIndependent {a, b}α: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, b: α
hab: a ≠ bSetIndependent {a, b} ↔ Disjoint a bα: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, b: α
hab: a ≠ b
mpSetIndependent {a, b} → Disjoint a bα: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, b: α
hab: a ≠ b
mpSetIndependent {a, b} → Disjoint a bα: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, b: α
hab: a ≠ b
mprDisjoint a b → SetIndependent {a, b}α: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, b: α
hab: a ≠ b
h: SetIndependent {a, b}
mpDisjoint a bα: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, b: α
hab: a ≠ b
mpSetIndependent {a, b} → Disjoint a bGoals accomplished! 🐙α: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, b: α
hab: a ≠ bSetIndependent {a, b} ↔ Disjoint a bα: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, b: α
hab: a ≠ b
mprDisjoint a b → SetIndependent {a, b}α: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, b: α
hab: a ≠ b
mprDisjoint a b → SetIndependent {a, b}α: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
b, c: α
hab: c ≠ b
h: Disjoint c b
mpr.inlα: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, c: α
hab: a ≠ c
h: Disjoint a c
mpr.inrα: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, b: α
hab: a ≠ b
mprDisjoint a b → SetIndependent {a, b}α: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
b, c: α
hab: c ≠ b
h: Disjoint c b
mpr.inlα: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, c: α
hab: a ≠ c
h: Disjoint a c
mpr.inrGoals accomplished! 🐙α: Type u_1
β: Type ?u.24528
ι: Type ?u.24531
ι': Type ?u.24534
inst✝: CompleteLattice α
s: Set α
hs: SetIndependent s
a, b: α
hab: a ≠ b
mprDisjoint a b → SetIndependent {a, b}#align complete_lattice.set_independent_pairGoals accomplished! 🐙CompleteLattice.setIndependent_pair /-- If the elements of a set are independent, then any element is disjoint from the `sSup` of some subset of the rest. -/ theorem SetIndependent.disjoint_sSup {CompleteLattice.setIndependent_pair: ∀ {α : Type u_1} [inst : CompleteLattice α] {a b : α}, a ≠ b → (SetIndependent {a, b} ↔ Disjoint a b)x :x: αα} {α: Type ?u.26448y : Sety: Set αα} (α: Type ?u.26448hx :hx: x ∈ sx ∈x: αs) (s: Set αhy :hy: y ⊆ sy ⊆y: Set αs) (hxy :s: Set αx ∉x: αy) :y: Set αDisjointDisjoint: {α : Type ?u.26552} → [inst : PartialOrder α] → [inst : OrderBot α] → α → α → Propx (sSupx: αy) :=y: Set αGoals accomplished! 🐙#align complete_lattice.set_independent.disjoint_Sup CompleteLattice.SetIndependent.disjoint_sSup /-- An independent indexed family of elements in a complete lattice is one in which every element is disjoint from the `iSup` of the rest. Example: an indexed family of non-zero elements in a vector space is linearly independent iff the indexed family of subspaces they generate is independent in this sense. Example: an indexed family of submodules of a module is independent in this sense if and only the natural map from the direct sum of the submodules to the module is injective. -/ -- Porting note: needed to use `_H` defGoals accomplished! 🐙Independent {Independent: {ι : Sort ?u.26953} → {α : Type ?u.26956} → [inst : CompleteLattice α] → (ι → α) → Propι :ι: Sort ?u.26953SortSort _: Type ?u.26953_} {Sort _: Type ?u.26953α :α: Type ?u.26956Type _} [CompleteLatticeType _: Type (?u.26956+1)α] (α: Type ?u.26956t :t: ι → αι →ι: Sort ?u.26953α) :α: Type ?u.26956