1-- Monomial ideals, Dickson finite generation, and finite antichains (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.Algebra.Polynomial.MonomialIdeal8import Dickson910predicate MonomialIdeal (V U : Set) := U ⊆ monomials(V) ∧11 (∀ m ∈ U, ∀ q ∈ monomials(V), monomialProduct(V, m, q) ∈ U)12def monomialSpan (V G : Set) : Set:= {m ∈ monomials(V) |∃ b ∈ G, MonomialDivides(V, b, m)}13predicate MonomialAntichain (V S : Set) :=∀ m ∈ S, ∀ n ∈ S, MonomialDivides(V, m, n) → m = n14def minimalMonomials (V S : Set) : Set:= {m ∈ S |∀ n ∈ S, MonomialDivides(V, n, m) → n = m}1516theorem MonomialIdeal.subset (V U : Set)17requires ideal : MonomialIdeal(V, U)18shows U ⊆ monomials(V)19proof20exact ideal.left2122theorem MonomialIdeal.upward (V U m n : Set)23requires ideal : MonomialIdeal(V, U)24requires member : m ∈ U25requires monomial : n ∈ monomials(V)26requires divides : MonomialDivides(V, m, n)27shows n ∈ U28proof29have subset := MonomialIdeal.subset with ideal30have mMember := subset with m, member31obtain⟨q, qMember, equation⟩:= MonomialDivides.iff_factor.forward at V, m, n with*32have product := ideal.right with m, member, q, qMember33 rwa equation at product3435theorem monomialSpan.contains (V G : Set)36requires subset : G ⊆ monomials(V)37shows G ⊆ monomialSpan(V, G)38proof39intros m hm40have member := subset with m, hm41have divides := MonomialDivides.reflexive with member42exact monomialSpan.membership.backward with⟨member, m, hm, divides⟩4344theorem monomialSpan.ideal (V G : Set)45requires subset : G ⊆ monomials(V)46shows MonomialIdeal(V, monomialSpan(V, G))47proof48constructor49 . settlewith Subset, monomialSpan.membership50 . intros m hm q hq51have data := monomialSpan.membership.forward with hm52obtain⟨b, hb, divides⟩:= data.right53have included := subset54have bMember := included with b, hb55have product := monomialProduct.member at V, m, q with*56have factor := MonomialDivides.product at V, m, q with*57have trans := MonomialDivides.transitive at V, b, m, monomialProduct(V, m, q) with*58exact monomialSpan.membership.backward with⟨product, b, hb, trans⟩5960theorem monomialSpan.least (V G U : Set)61requires ideal : MonomialIdeal(V, U)62requires generators : G ⊆ U63shows monomialSpan(V, G) ⊆ U64proof65intros m hm66have data := monomialSpan.membership.forward with hm67obtain⟨b, hb, divides⟩:= data.right68have member := generators with b, hb69exact MonomialIdeal.upward with*7071theorem MonomialIdeal.finite_generated (V U : Set)72requires variables : Finite(V)73requires ideal : MonomialIdeal(V, U)74shows∃ B, Finite(B) ∧ B ⊆ U ∧ U = monomialSpan(V, B)75proof76have subset := MonomialIdeal.subset with ideal77obtain⟨B, basis⟩:= Dickson.finite_basis with variables, subset78rcases basis with⟨finite, included, covers⟩79have reverse := monomialSpan.least with*80have forward : U ⊆ monomialSpan(V, B)81intros m hm82have source := subset83have member := source with m, hm84obtain⟨b, hb, divides⟩:= covers with m, hm85exact monomialSpan.membership.backward with⟨member, b, hb, divides⟩86have equal := Subset.antisymmetric with forward, reverse87refine⟨B, finite, included, equal⟩8889theorem Dickson.antichains_finite (V S : Set)90requires variables : Finite(V)91requires subset : S ⊆ monomials(V)92requires antichain : MonomialAntichain(V, S)93shows Finite(S)94proof95obtain⟨B, basis⟩:= Dickson.finite_basis with variables, subset96rcases basis with⟨finite, included, covers⟩97have reverse : S ⊆ B98intros m hm99obtain⟨b, hb, divides⟩:= covers with m, hm100have inS := included with b, hb101have equal := antichain with b, inS, m, hm, divides102 rwa ← equal103exact Finite.subset with finite, reverse104105theorem minimalMonomials.subset (V S : Set)106shows minimalMonomials(V, S) ⊆ S107proof108simp109110theorem minimalMonomials.antichain (V S : Set)111shows MonomialAntichain(V, minimalMonomials(V, S))112proof113intros m hm n hn divides114have mData := minimalMonomials.membership.forward with hm115have nData := minimalMonomials.membership.forward with hn116exact nData.right with m, mData.left, divides117118theorem Dickson.minimal_finite (V S : Set)119requires variables : Finite(V)120requires subset : S ⊆ monomials(V)121shows Finite(minimalMonomials(V, S))122proof123have included := minimalMonomials.subset at V, S124have bounded := Subset.transitive with included, subset125have antichain := minimalMonomials.antichain at V, S126exact Dickson.antichains_finite with variables, bounded, antichain127