1-- Finite powersets and maximal members of finite families, in ZF.2-- Part of Cumulus, the Grace17 mathematics library.3-- Copyright (c) 2026 Grant Passmore.4-- Released under the Apache License 2.0. See LICENSE in the repository root.5-- Authors: Grant Passmore67module Grace.Cumulus.Cardinal.FiniteSubsets8import FiniteImage910defgraph insertSubset (A x : Set) (S ∈𝒫(A)) : 𝒫(insert(x, A)) := insert(x, S)11proof12apply powerset.membership_iff.backward at insert(x, S), insert(x, A)13have subset := powerset.membership_iff.forward at S, A with*14settlewith Subset, insert.membership1516theorem Finite.powerset_insert (A x : Set)17requires finite : Finite(𝒫(A))18shows Finite(𝒫(insert(x, A)))19proof20have function := insertSubset.function at A, x21have reflexive : 𝒫(A) ⊆𝒫(A) bysimp22have image := Finite.function_image with function, finite, reflexive23have combined := Finite.union with finite, image24have covered : 𝒫(insert(x, A)) ⊆𝒫(A) ∪ functionImage(insertSubset(A, x), 𝒫(A), 𝒫(insert(x, A)))25intros S member26have subset := powerset.membership_iff.forward with member27have alternatives : x ∈ S ∨¬(x ∈ S) bytauto28cases alternatives with present | absent29 . have rest : S ∖ {x} ⊆ A bysimp30have restIn := powerset.membership_iff.backward with rest31have restored : insert(x, S ∖ {x}) = S32ext y33simp34have value := insertSubset.value at A, x, S ∖ {x} with restIn35have inImage : S ∈ functionImage(insertSubset(A, x), 𝒫(A), 𝒫(insert(x, A)))36apply functionImage.membership.backward37refine⟨member, S ∖ {x}, restIn, ?_⟩38cc39simp40 . have smaller : S ⊆ A41intros y hy42have inInsert := subset with y, hy43simp44have old := powerset.membership_iff.backward with smaller45simp46exact Finite.subset with combined, covered4748theorem listSupport.finite_powerset (C : Set) (xs : List(C))49shows Finite(𝒫(listSupport{C}(xs)))50proof51induction xs52| List.nil =>53rw listSupport54have bounded : 𝒫(∅) ⊆ {∅}55intros S member56have subset := powerset.membership_iff.forward with member57have reverse := empty.subset at S58have equal := Subset.antisymmetric with subset, reverse59exact singleton.membership.backward with equal60have finite := Finite.singleton at∅61exact Finite.subset with finite, bounded62| List.cons(x, tail) using ih =>63rw listSupport64exact Finite.powerset_insert with*6566theorem Finite.powerset (A : Set)67requires finite : Finite(A)68shows Finite(𝒫(A))69proof70obtain⟨xs, list, covers⟩:= Finite.list_cover with finite71have bound := listSupport.finite_powerset with list72have included := powerset.monotone with covers73exact Finite.subset with bound, included7475-- Scan a finite family, replacing the current member only by a larger one.76theorem listSupport.maximal_extension (F : Set) (xs : List(F))77shows∀ S ∈ F, ∃ M ∈ F, S ⊆ M ∧ (∀ T ∈ listSupport{F}(xs), M ⊆ T → T = M)78proof79induction xs80| List.nil =>81intros S member82refine⟨S, member, ?_⟩83constructor84 . settlewith Subset85 . intros T inList contains86rw listSupport at inList87exfalso88exactset.empty with inList89| List.cons(x, tail) using ih =>90intros S member91obtain⟨M, inFamily, extends, maximal⟩:= ih with S, member92have alternatives : M ⊆ x ∨¬(M ⊆ x) bytauto93cases alternatives with larger | incomparable94 . have xIn : x ∈ F95assumption96have extension := Subset.transitive with extends, larger97refine⟨x, xIn, extension, ?_⟩98intros T inList contains99rw listSupport at inList100have casesT := insert.membership.forward with inList101cases casesT with equal | inTail102 . exact equal103 . have includes := Subset.transitive with larger, contains104have equal := maximal with T, inTail, includes105have reverse : x ⊆ M bysimp106have same := Subset.antisymmetric with larger, reverse107cc108 . refine⟨M, inFamily, extends, ?_⟩109intros T inList contains110rw listSupport at inList111have casesT := insert.membership.forward with inList112cases casesT with equal | inTail113 . exfalso114rw equal at contains115exact incomparable with contains116 . exact maximal with T, inTail, contains117118theorem Finite.maximal_extension (F S : Set)119requires finite : Finite(F)120requires member : S ∈ F121shows∃ M ∈ F, S ⊆ M ∧ (∀ T ∈ F, M ⊆ T → T = M)122proof123obtain⟨xs, list, covers⟩:= Finite.list_cover with finite124have scan := listSupport.maximal_extension with list125obtain⟨M, inFamily, extends, maximal⟩:= scan with S, member126refine⟨M, inFamily, extends, ?_⟩127intros T inFamilyT contains128have inList := covers with T, inFamilyT129exact maximal with T, inList, contains130