Documentation

CharacteristicSet.TriangularSet

Triangular Set #

This file defines the structure of a Triangular Set of multivariate polynomials. A Triangular Set is a finite ordered sequence of non-zero polynomials [P₁, P₂, ..., Pₘ] such that their main (max) variables are strictly increasing: mainVar(P₁) < mainVar(P₂) < ... < mainVar(Pₘ).

Main Definitions #

Main Results #

structure TriangularSet (σ : Type u_1) (R : Type u_2) [CommSemiring R] [LinearOrder σ] :
Type (max u_1 u_2)

A Triangular Set is a list of polynomials with strictly increasing main variables.

Instances For
    def TriangularSet.mk' {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {l : List (MvPolynomial σ R)} (hl1 : 0 ∉ l) (hl2 : List.IsChain (fun (x1 x2 : MvPolynomial σ R) => x1.vars.max < x2.vars.max) l) :

    Construct an triangular set from a list.

    Equations
    Instances For
      @[implicit_reducible]
      noncomputable instance TriangularSet.instFunLike {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] :
      Equations
      theorem TriangularSet.ext {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S T : TriangularSet σ R} (h : ∀ (i : ℕ), S i = T i) :
      S = T
      theorem TriangularSet.ext_iff {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S T : TriangularSet σ R} :
      S = T ↔ ∀ (i : ℕ), S i = T i
      def TriangularSet.length {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :

      The length of the triangular set.

      Equations
      Instances For
        theorem TriangularSet.ne_zero_iff_lt_length {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {n : ℕ} :
        n < S.length ↔ S n ≠ 0
        theorem TriangularSet.eq_zero_iff_length_le {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {n : ℕ} :
        S.length ≤ n ↔ S n = 0
        theorem TriangularSet.ext' {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S T : TriangularSet σ R} (h1 : S.length = T.length) (h2 : ∀ i < S.length, S i = T i) :
        S = T
        @[simp]
        theorem TriangularSet.apply_length_eq_zero {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} :
        S S.length = 0
        theorem TriangularSet.toList_getElem?_getD {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {n : ℕ} :
        S.toList[n]?.getD 0 = S n
        theorem TriangularSet.toList_getElem {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {n : ℕ} (h : n < S.length) :
        S.toList[n] = S n
        @[simp]
        theorem TriangularSet.length_toList {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :
        @[simp]
        theorem TriangularSet.toList_eq_iff_eq {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S T : TriangularSet σ R} :
        S.toList = T.toList ↔ S = T
        theorem TriangularSet.mem_toList_iff' {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p : MvPolynomial σ R} :
        p ∈ S.toList ↔ ∃ n < S.length, S n = p
        theorem TriangularSet.zero_notMem_toList {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :
        0 ∉ S.toList
        theorem TriangularSet.toList_non_zero {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) ⦃p : MvPolynomial σ R⦄ :
        p ∈ S.toList → p ≠ 0
        theorem TriangularSet.toList_isChain {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :
        List.IsChain (fun (x1 x2 : MvPolynomial σ R) => x1.vars.max < x2.vars.max) S.toList
        theorem TriangularSet.toList_pairwise {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :
        List.Pairwise (fun (x1 x2 : MvPolynomial σ R) => x1.vars.max < x2.vars.max) S.toList
        @[implicit_reducible]
        Equations
        theorem TriangularSet.max_vars_lt_next {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {n : ℕ} (h : n < S.length - 1) :
        (S n).vars.max < (S (n + 1)).vars.max
        theorem TriangularSet.max_vars_lt_next' {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {n : ℕ} :
        n + 1 < S.length → (S n).vars.max < (S (n + 1)).vars.max
        theorem TriangularSet.max_vars_lt_next'' {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {n : ℕ} :
        0 < n → n < S.length → (S (n - 1)).vars.max < (S n).vars.max
        theorem TriangularSet.max_vars_lt_of_index_lt {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {m n : ℕ} (h : n < S.length) :
        m < n → (S m).vars.max < (S n).vars.max
        theorem TriangularSet.index_lt_of_max_vars_lt {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {m n : ℕ} (h : m < S.length) :
        (S m).vars.max < (S n).vars.max → m < n
        theorem TriangularSet.false_of_max_vars_ge_of_index_lt {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {m n : ℕ} :
        m < n → n < S.length → (S n).vars.max ≤ (S m).vars.max → False
        theorem TriangularSet.max_vars_le_of_index_le {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {m n : ℕ} :
        m ≤ n → n < S.length → (S m).vars.max ≤ (S n).vars.max
        theorem TriangularSet.index_eq_of_max_vars_eq {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {m n : ℕ} :
        m < S.length → n < S.length → (S m).vars.max = (S n).vars.max → m = n
        theorem TriangularSet.index_eq_of_apply_eq {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {m n : ℕ} :
        m < S.length → n < S.length → S m = S n → m = n
        theorem TriangularSet.index_eq_zero_of_max_vars_eq_bot {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {n : ℕ} :
        n < S.length → (S n).vars.max = ⊥ → n = 0
        theorem TriangularSet.exists_index_max_vars_between_of_max_vars_first_lt {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p : MvPolynomial σ R} (h : (S 0).vars.max < p.vars.max) :
        ∃ k ≤ S.length, (S (k - 1)).vars.max < p.vars.max ∧ (p.vars.max ≤ (S k).vars.max ∨ k = S.length)
        theorem TriangularSet.toList_nodup {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :

        Set-like behavior #

        @[implicit_reducible]
        instance TriangularSet.instSetLike {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] :
        Equations
        theorem TriangularSet.mem_def {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p : MvPolynomial σ R} :
        p ∈ S ↔ ∃ n < S.length, S n = p
        @[simp]
        theorem TriangularSet.mem_toList_iff {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p : MvPolynomial σ R} :
        p ∈ S.toList ↔ p ∈ S
        @[simp]
        theorem TriangularSet.zero_notMem {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :
        0 ∉ S
        theorem TriangularSet.ne_zero_of_mem {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p : MvPolynomial σ R} :
        p ∈ S → p ≠ 0
        theorem TriangularSet.apply_mem {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {n : ℕ} :
        n < S.length → S n ∈ S
        theorem TriangularSet.forall_mem_iff_forall_index {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {a : MvPolynomial σ R → Prop} :
        (∀ p ∈ S, a p) ↔ ∀ i < S.length, a (S i)
        theorem TriangularSet.forall_mem_iff_forall_index' {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {a : MvPolynomial σ R → Prop} {n : ℕ} (h : n = S.length) :
        (∀ p ∈ S, a p) ↔ ∀ (i : Fin n), a (S ↑i)
        theorem TriangularSet.exists_mem_iff_exists_index {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {a : MvPolynomial σ R → Prop} :
        (∃ p ∈ S, a p) ↔ ∃ i < S.length, a (S i)
        theorem TriangularSet.exists_mem_iff_exists_index' {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {a : MvPolynomial σ R → Prop} {n : ℕ} (h : n = S.length) :
        (∃ p ∈ S, a p) ↔ ∃ (i : Fin n), a (S ↑i)
        @[implicit_reducible]
        Equations
        @[implicit_reducible]
        Equations
        @[simp]
        theorem TriangularSet.Subset.refl {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :
        S ⊆ S
        theorem TriangularSet.Subset.trans {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S T U : TriangularSet σ R} :
        S ⊆ T → T ⊆ U → S ⊆ U
        theorem TriangularSet.subset_def {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S T : TriangularSet σ R} :
        S ⊆ T ↔ ∀ ⦃x : MvPolynomial σ R⦄, x ∈ S → x ∈ T
        theorem TriangularSet.mem_of_subset {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S T : TriangularSet σ R} (p : MvPolynomial σ R) (h : S ⊆ T) :
        p ∈ S → p ∈ T
        theorem TriangularSet.ssubset_def {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S T : TriangularSet σ R} :
        S ⊂ T ↔ S ⊆ T ∧ ¬T ⊆ S
        def TriangularSet.toFinset {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :

        Converts a triangular set to a finite set.

        Equations
        Instances For
          @[simp]
          theorem TriangularSet.card_toFinset {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :
          @[simp]
          theorem TriangularSet.mem_toFinset_iff {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p : MvPolynomial σ R} :
          @[simp]
          theorem TriangularSet.toFinset_eq_iff_eq {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S T : TriangularSet σ R} :
          theorem TriangularSet.toFinset_eq_coe_set {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :
          ↑S.toFinset = ↑S
          theorem TriangularSet.length_le_of_subset {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S T : TriangularSet σ R} :
          S ⊆ T → S.length ≤ T.length
          theorem TriangularSet.length_lt_of_ssubset {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S T : TriangularSet σ R} :
          S ⊂ T → S.length < T.length
          def TriangularSet.empty {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] :

          The empty triangular set.

          Equations
          Instances For
            @[implicit_reducible]
            Equations
            @[implicit_reducible]
            Equations
            @[simp]
            theorem TriangularSet.toList_empty {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] :
            @[simp]
            theorem TriangularSet.length_empty {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] :
            @[simp]
            theorem TriangularSet.empty_apply {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {n : ℕ} :
            ∅ n = 0
            theorem TriangularSet.length_eq_zero_iff {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} :
            S.length = 0 ↔ S = ∅
            theorem TriangularSet.length_gt_zero_iff {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} :
            theorem TriangularSet.length_ge_one_iff {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} :
            theorem TriangularSet.notMem_empty {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (p : MvPolynomial σ R) :
            p ∉ ∅
            theorem TriangularSet.eq_empty_of_forall_notMem {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} :
            (∀ (p : MvPolynomial σ R), p ∉ S) → S = ∅
            def TriangularSet.single' {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {p : MvPolynomial σ R} (hp : p ≠ 0) :

            A triangular set with exactly one non-zero element.

            Equations
            Instances For
              theorem TriangularSet.toList_single' {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {p : MvPolynomial σ R} (hp : p ≠ 0) :
              theorem TriangularSet.single'_apply {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {p : MvPolynomial σ R} {n : ℕ} (hp : p ≠ 0) :
              (single' hp) n = if n = 0 then p else 0
              theorem TriangularSet.length_single' {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {p : MvPolynomial σ R} (hp : p ≠ 0) :
              def TriangularSet.take {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) (n : ℕ) :

              Takes the first n elements of a triangular set.

              Equations
              Instances For
                theorem TriangularSet.toList_take {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) (n : ℕ) :
                @[simp]
                theorem TriangularSet.length_take {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) (n : ℕ) :
                (S.take n).length = min n S.length
                theorem TriangularSet.take_apply {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) (n m : ℕ) :
                (S.take n) m = if m < n then S m else 0
                theorem TriangularSet.take_apply' {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {n m : ℕ} (h : m < min n S.length) :
                (S.take n) m = S m
                @[simp]
                theorem TriangularSet.take_zero {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :
                S.take 0 = ∅
                @[simp]
                theorem TriangularSet.take_length {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :
                S.take S.length = S
                theorem TriangularSet.take_subset {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) (n : ℕ) :
                S.take n ⊆ S
                def TriangularSet.drop {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) (n : ℕ) :

                Drops the first n elements of a triangular set.

                Equations
                Instances For
                  theorem TriangularSet.toList_drop {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) (n : ℕ) :
                  @[simp]
                  theorem TriangularSet.length_drop {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) (n : ℕ) :
                  (S.drop n).length = S.length - n
                  @[simp]
                  theorem TriangularSet.drop_apply {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) (n m : ℕ) :
                  (S.drop n) m = S (n + m)
                  @[simp]
                  theorem TriangularSet.drop_zero {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :
                  S.drop 0 = S
                  theorem TriangularSet.drop_eq_empty_of_ge_length {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {n : ℕ} :
                  S.length ≤ n → S.drop n = ∅
                  @[simp]
                  theorem TriangularSet.drop_length {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) :
                  @[reducible, inline]
                  abbrev TriangularSet.CanConcat {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) (p : MvPolynomial σ R) :

                  The condition required to append p to S while maintaining the Triangular Set property. p must be non-zero and its main variable must be strictly greater than the main variable of the last element of S.

                  Equations
                  Instances For
                    theorem TriangularSet.canConcat_def {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p : MvPolynomial σ R} :
                    S.CanConcat p ↔ p ≠ 0 ∧ (0 < S.length → (S (S.length - 1)).vars.max < p.vars.max)
                    theorem TriangularSet.empty_canConcat {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {p : MvPolynomial σ R} :
                    p ≠ 0 → ∅.CanConcat p
                    def TriangularSet.concat {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] (S : TriangularSet σ R) (p : MvPolynomial σ R) (h : S.CanConcat p := by assumption) :

                    Appends a polynomial p to the end of S. Requires S.canConcat p.

                    Equations
                    Instances For
                      theorem TriangularSet.toList_concat {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p : MvPolynomial σ R} (h : S.CanConcat p) :
                      @[simp]
                      theorem TriangularSet.length_concat {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p : MvPolynomial σ R} (h : S.CanConcat p) :
                      (S.concat p h).length = S.length + 1
                      theorem TriangularSet.concat_apply {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p : MvPolynomial σ R} (h : S.CanConcat p) (n : ℕ) :
                      (S.concat p h) n = if n < S.length then S n else if n = S.length then p else 0
                      theorem TriangularSet.concat_apply_length {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p : MvPolynomial σ R} (h : S.CanConcat p) :
                      (S.concat p h) S.length = p
                      theorem TriangularSet.mem_concat {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p : MvPolynomial σ R} (h : S.CanConcat p) :
                      p ∈ S.concat p h
                      theorem TriangularSet.subset_concat {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p : MvPolynomial σ R} (h : S.CanConcat p) :
                      S ⊆ S.concat p h
                      theorem TriangularSet.mem_concat_iff {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p q : MvPolynomial σ R} (h : S.CanConcat p) :
                      q ∈ S.concat p h ↔ q = p ∨ q ∈ S
                      theorem TriangularSet.coe_concat_eq_insert {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {S : TriangularSet σ R} {p : MvPolynomial σ R} (h : S.CanConcat p) :
                      ↑(S.concat p h) = Set.insert p ↑S
                      noncomputable def TriangularSet.single {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] [DecidableEq R] (p : MvPolynomial σ R) :

                      A triangular set with exactly one element.

                      Equations
                      Instances For
                        @[simp]
                        theorem TriangularSet.single_zero {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] [DecidableEq R] :
                        theorem TriangularSet.length_single {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] [DecidableEq R] {p : MvPolynomial σ R} :
                        p ≠ 0 → (single p).length = 1
                        theorem TriangularSet.single_eq_zero_iff {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] [DecidableEq R] {p : MvPolynomial σ R} :
                        p = 0 ↔ single p = ∅
                        theorem TriangularSet.length_single_zero {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] [DecidableEq R] {p : MvPolynomial σ R} :
                        p = 0 → (single p).length = 0
                        theorem TriangularSet.single_apply_zero {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] [DecidableEq R] (p : MvPolynomial σ R) :
                        (single p) 0 = p
                        theorem TriangularSet.single_apply_nonzero {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] {n : ℕ} [DecidableEq R] (p : MvPolynomial σ R) :
                        n ≠ 0 → (single p) n = 0
                        theorem TriangularSet.mem_single_of_ne_zero {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] [DecidableEq R] {p : MvPolynomial σ R} :
                        p ≠ 0 → p ∈ single p
                        theorem TriangularSet.notMem_single_of_ne {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] [DecidableEq R] {p q : MvPolynomial σ R} :
                        q ≠ p → q ∉ single p
                        theorem TriangularSet.single_of_length_le_one {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] [DecidableEq R] {S : TriangularSet σ R} :
                        S.length ≤ 1 → S = single (S 0)
                        theorem TriangularSet.single_of_last_max_vars_eq_bot {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] [DecidableEq R] {S : TriangularSet σ R} :
                        (S (S.length - 1)).vars.max = ⊥ → S = single (S 0)
                        noncomputable def TriangularSet.takeConcat {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] [DecidableEq R] (S : TriangularSet σ R) (p : MvPolynomial σ R) :

                        takeConcat S p tries to construct a new Triangular Set by taking a prefix of S and appending p. This is a key operation in constructing the Characteristic Set. If p fits naturally at the end of S, it behaves like S.concat p. If p conflicts with some element in S (in terms of main variable order), takeConcat finds the first element in S that has a higher or equal main variable than p, truncates S before that element, and appends p.

                        Equations
                        • One or more equations did not get rendered due to their size.
                        Instances For
                          theorem TriangularSet.mem_takeConcat {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] [DecidableEq R] (S : TriangularSet σ R) {p : MvPolynomial σ R} (h : p ≠ 0) :
                          theorem TriangularSet.takeConcat_subset {R : Type u_1} {σ : Type u_2} [CommSemiring R] [LinearOrder σ] [DecidableEq R] {S : TriangularSet σ R} {p : MvPolynomial σ R} (q : MvPolynomial σ R) :
                          q ∈ S.takeConcat p → q ≠ p → q ∈ S