1-- The Knaster–Tarski theorem on subsets: a monotone map on the power set2-- of X has a least fixed point, the intersection of its pre-fixed points,3-- and a greatest one, the union of its post-fixed points4-- Part of Cumulus, the Grace17 mathematics library.5-- Copyright (c) 2026 Grant Passmore.6-- Released under the Apache License 2.0. See LICENSE in the repository root.7-- Authors: Grant Passmore89module Grace.Cumulus.FixedPoint.KnasterTarski10import Set1112predicate MonotoneOnSubsets (F X : Set) :=13 FunctionBetween(F, 𝒫(X), 𝒫(X)) ∧14 (∀ A ∈𝒫(X), ∀ B ∈𝒫(X), A ⊆ B → F(A) ⊆ F(B))1516def prefixedPoints (F X : Set) : Set:= { A ∈𝒫(X) | F(A) ⊆ A }17def postfixedPoints (F X : Set) : Set:= { A ∈𝒫(X) | A ⊆ F(A) }18def leastFixedPoint (F X : Set) : Set:= ⋂(prefixedPoints(F, X))19def greatestFixedPoint (F X : Set) : Set:=⋃(postfixedPoints(F, X))2021theorem MonotoneOnSubsets.apply_subset (F X A : Set)22requires monotone : MonotoneOnSubsets(F, X)23requires hA : A ⊆ X24shows F(A) ⊆ X25proof26have member := powerset.membership_iff.backward with hA27have value := FunctionBetween.apply_closed with monotone.left, member28exact powerset.membership_iff.forward with value2930theorem MonotoneOnSubsets.monotone (F X A B : Set)31requires monotone : MonotoneOnSubsets(F, X)32requires hA : A ⊆ X33requires hB : B ⊆ X34requires hAB : A ⊆ B35shows F(A) ⊆ F(B)36proof37have memberA := powerset.membership_iff.backward with hA38have memberB := powerset.membership_iff.backward with hB39exact monotone.right with A, memberA, B, memberB, hAB4041theorem prefixedPoints.whole (F X : Set)42requires monotone : MonotoneOnSubsets(F, X)43shows X ∈ prefixedPoints(F, X)44proof45apply prefixedPoints.membership.backward46refine⟨(powerset.self at X), ?_⟩47exact MonotoneOnSubsets.apply_subset with monotone, (Subset.reflexive at X)4849theorem leastFixedPoint.subset (F X : Set)50requires monotone : MonotoneOnSubsets(F, X)51shows leastFixedPoint(F, X) ⊆ X52proof53unfold leastFixedPoint54exact familyIntersection.subset_of_member with (prefixedPoints.whole with monotone)5556theorem leastFixedPoint.below (F X A : Set)57requires hA : A ⊆ X58requires prefixed : F(A) ⊆ A59shows leastFixedPoint(F, X) ⊆ A60proof61have member : A ∈ prefixedPoints(F, X)62apply prefixedPoints.membership.backward63exact⟨(powerset.membership_iff.backward with hA), prefixed⟩64unfold leastFixedPoint65exact familyIntersection.subset_of_member with member6667theorem leastFixedPoint.prefixed (F X : Set)68requires monotone : MonotoneOnSubsets(F, X)69shows F(leastFixedPoint(F, X)) ⊆ leastFixedPoint(F, X)70proof71have whole := prefixedPoints.whole with monotone72have inhabited : Nonempty(prefixedPoints(F, X)) :=⟨X, whole⟩73have inside := leastFixedPoint.subset with monotone74unfold leastFixedPoint at inside75unfold leastFixedPoint76apply familyIntersection.greatest with inhabited77intros A hA78have parts := prefixedPoints.membership.forward with hA79have hAX := powerset.membership_iff.forward with parts.left80have below := leastFixedPoint.below with hAX, parts.right81unfold leastFixedPoint at below82have step := MonotoneOnSubsets.monotone with monotone, inside, hAX, below83exact Subset.transitive with step, parts.right8485theorem leastFixedPoint.fixed (F X : Set)86requires monotone : MonotoneOnSubsets(F, X)87shows F(leastFixedPoint(F, X)) = leastFixedPoint(F, X)88proof89have prefixed := leastFixedPoint.prefixed with monotone90have inside := leastFixedPoint.subset with monotone91have imageInside := MonotoneOnSubsets.apply_subset with monotone, inside92apply Subset.antisymmetric93 . exact prefixed94 . have step := MonotoneOnSubsets.monotone with monotone, imageInside, inside, prefixed95exact leastFixedPoint.below with imageInside, step9697theorem leastFixedPoint.least (F X A : Set)98requires hA : A ⊆ X99requires fixed : F(A) = A100shows leastFixedPoint(F, X) ⊆ A101proof102have prefixed : F(A) ⊆ A103rw fixed104exact Subset.reflexive105exact leastFixedPoint.below with hA, prefixed106107theorem greatestFixedPoint.subset (F X : Set)108shows greatestFixedPoint(F, X) ⊆ X109proof110unfold greatestFixedPoint111apply union.subset112intros A hA113have parts := postfixedPoints.membership.forward with hA114exact powerset.membership_iff.forward with parts.left115116theorem greatestFixedPoint.above (F X A : Set)117requires hA : A ⊆ X118requires postfixed : A ⊆ F(A)119shows A ⊆ greatestFixedPoint(F, X)120proof121have member : A ∈ postfixedPoints(F, X)122apply postfixedPoints.membership.backward123exact⟨(powerset.membership_iff.backward with hA), postfixed⟩124unfold greatestFixedPoint125exact union.subset_of_member with member126127theorem greatestFixedPoint.postfixed (F X : Set)128requires monotone : MonotoneOnSubsets(F, X)129shows greatestFixedPoint(F, X) ⊆ F(greatestFixedPoint(F, X))130proof131have inside := greatestFixedPoint.subset at F, X132unfold greatestFixedPoint at inside133unfold greatestFixedPoint134apply union.subset135intros A hA136have parts := postfixedPoints.membership.forward with hA137have hAX := powerset.membership_iff.forward with parts.left138have above := greatestFixedPoint.above with hAX, parts.right139unfold greatestFixedPoint at above140have step := MonotoneOnSubsets.monotone with monotone, hAX, inside, above141exact Subset.transitive with parts.right, step142143theorem greatestFixedPoint.fixed (F X : Set)144requires monotone : MonotoneOnSubsets(F, X)145shows F(greatestFixedPoint(F, X)) = greatestFixedPoint(F, X)146proof147have postfixed := greatestFixedPoint.postfixed with monotone148have inside := greatestFixedPoint.subset at F, X149have imageInside := MonotoneOnSubsets.apply_subset with monotone, inside150apply Subset.antisymmetric151 . have step := MonotoneOnSubsets.monotone with monotone, inside, imageInside, postfixed152exact greatestFixedPoint.above with imageInside, step153 . exact postfixed154155theorem greatestFixedPoint.greatest (F X A : Set)156requires hA : A ⊆ X157requires fixed : F(A) = A158shows A ⊆ greatestFixedPoint(F, X)159proof160have postfixed : A ⊆ F(A)161rw fixed162exact Subset.reflexive163exact greatestFixedPoint.above with hA, postfixed164165-- The theorem itself: a monotone map on the subsets of X has a fixed point.166theorem KnasterTarski.theorem (F X : Set)167requires monotone : MonotoneOnSubsets(F, X)168shows∃ A, A ⊆ X ∧ F(A) = A169proof170witness leastFixedPoint(F, X)171exact⟨(leastFixedPoint.subset with monotone), (leastFixedPoint.fixed with monotone)⟩172