Documentation

Init.Data.Array.Lex.Lemmas

Lexicographic ordering #

@[simp]
theorem List.lt_toArray {α : Type u_1} [LT α] (l₁ l₂ : List α) :
l₁.toArray < l₂.toArray l₁ < l₂
@[simp]
theorem List.le_toArray {α : Type u_1} [LT α] (l₁ l₂ : List α) :
l₁.toArray l₂.toArray l₁ l₂
@[simp]
theorem Array.lt_toList {α : Type u_1} [LT α] (l₁ l₂ : Array α) :
l₁.toList < l₂.toList l₁ < l₂
@[simp]
theorem Array.le_toList {α : Type u_1} [LT α] (l₁ l₂ : Array α) :
l₁.toList l₂.toList l₁ l₂
theorem Array.not_lt_iff_ge {α : Type u_1} [LT α] (l₁ l₂ : List α) :
¬l₁ < l₂ l₂ l₁
theorem Array.not_le_iff_gt {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] (l₁ l₂ : List α) :
¬l₁ l₂ l₂ < l₁
@[simp]
theorem Array.lex_empty {α : Type u_1} [BEq α] {lt : ααBool} (l : Array α) :
l.lex #[] lt = false
@[simp]
theorem Array.singleton_lex_singleton {α : Type u_1} {a b : α} [BEq α] {lt : ααBool} :
#[a].lex #[b] lt = lt a b
@[simp]
theorem List.lex_toArray {α : Type u_1} [BEq α] (lt : ααBool) (l₁ l₂ : List α) :
l₁.toArray.lex l₂.toArray lt = l₁.lex l₂ lt
@[simp]
theorem Array.lex_toList {α : Type u_1} [BEq α] (lt : ααBool) (l₁ l₂ : Array α) :
l₁.toList.lex l₂.toList lt = l₁.lex l₂ lt
theorem Array.lt_irrefl {α : Type u_1} [LT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] (l : Array α) :
¬l < l
instance Array.ltIrrefl {α : Type u_1} [LT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] :
Std.Irrefl fun (x1 x2 : Array α) => x1 < x2
@[simp]
theorem Array.not_lt_empty {α : Type u_1} [LT α] (l : Array α) :
¬l < #[]
@[simp]
theorem Array.empty_le {α : Type u_1} [LT α] (l : Array α) :
#[] l
@[simp]
theorem Array.le_empty {α : Type u_1} [LT α] (l : Array α) :
l #[] l = #[]
@[simp]
theorem Array.empty_lt_push {α : Type u_1} [LT α] (l : Array α) (a : α) :
#[] < l.push a
theorem Array.le_refl {α : Type u_1} [LT α] [i₀ : Std.Irrefl fun (x1 x2 : α) => x1 < x2] (l : Array α) :
l l
instance Array.instReflLeOfIrreflLt {α : Type u_1} [LT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] :
Std.Refl fun (x1 x2 : Array α) => x1 x2
theorem Array.lt_trans {α : Type u_1} [LT α] [i₁ : Trans (fun (x1 x2 : α) => x1 < x2) (fun (x1 x2 : α) => x1 < x2) fun (x1 x2 : α) => x1 < x2] {l₁ l₂ l₃ : Array α} (h₁ : l₁ < l₂) (h₂ : l₂ < l₃) :
l₁ < l₃
instance Array.instTransLt {α : Type u_1} [LT α] [Trans (fun (x1 x2 : α) => x1 < x2) (fun (x1 x2 : α) => x1 < x2) fun (x1 x2 : α) => x1 < x2] :
Trans (fun (x1 x2 : Array α) => x1 < x2) (fun (x1 x2 : Array α) => x1 < x2) fun (x1 x2 : Array α) => x1 < x2
Equations
theorem Array.lt_of_le_of_lt {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] [i₀ : Std.Irrefl fun (x1 x2 : α) => x1 < x2] [i₁ : Std.Asymm fun (x1 x2 : α) => x1 < x2] [i₂ : Std.Antisymm fun (x1 x2 : α) => ¬x1 < x2] [i₃ : Trans (fun (x1 x2 : α) => ¬x1 < x2) (fun (x1 x2 : α) => ¬x1 < x2) fun (x1 x2 : α) => ¬x1 < x2] {l₁ l₂ l₃ : Array α} (h₁ : l₁ l₂) (h₂ : l₂ < l₃) :
l₁ < l₃
theorem Array.le_trans {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] [Std.Asymm fun (x1 x2 : α) => x1 < x2] [Std.Antisymm fun (x1 x2 : α) => ¬x1 < x2] [Trans (fun (x1 x2 : α) => ¬x1 < x2) (fun (x1 x2 : α) => ¬x1 < x2) fun (x1 x2 : α) => ¬x1 < x2] {l₁ l₂ l₃ : Array α} (h₁ : l₁ l₂) (h₂ : l₂ l₃) :
l₁ l₃
instance Array.instTransLeOfDecidableEqOfDecidableLTOfIrreflOfAsymmOfAntisymmOfNotLt {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] [Std.Asymm fun (x1 x2 : α) => x1 < x2] [Std.Antisymm fun (x1 x2 : α) => ¬x1 < x2] [Trans (fun (x1 x2 : α) => ¬x1 < x2) (fun (x1 x2 : α) => ¬x1 < x2) fun (x1 x2 : α) => ¬x1 < x2] :
Trans (fun (x1 x2 : Array α) => x1 x2) (fun (x1 x2 : Array α) => x1 x2) fun (x1 x2 : Array α) => x1 x2
Equations
theorem Array.lt_asymm {α : Type u_1} [LT α] [i : Std.Asymm fun (x1 x2 : α) => x1 < x2] {l₁ l₂ : Array α} (h : l₁ < l₂) :
¬l₂ < l₁
instance Array.instAsymmLtOfDecidableEqOfDecidableLT {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] [Std.Asymm fun (x1 x2 : α) => x1 < x2] :
Std.Asymm fun (x1 x2 : Array α) => x1 < x2
theorem Array.le_total {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] [i : Std.Total fun (x1 x2 : α) => ¬x1 < x2] (l₁ l₂ : Array α) :
l₁ l₂ l₂ l₁
@[simp]
theorem Array.not_lt {α : Type u_1} [LT α] {l₁ l₂ : Array α} :
¬l₁ < l₂ l₂ l₁
@[simp]
theorem Array.not_le {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] {l₁ l₂ : Array α} :
¬l₂ l₁ l₁ < l₂
theorem Array.le_of_lt {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] [i : Std.Total fun (x1 x2 : α) => ¬x1 < x2] {l₁ l₂ : Array α} (h : l₁ < l₂) :
l₁ l₂
theorem Array.le_iff_lt_or_eq {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] [Std.Antisymm fun (x1 x2 : α) => ¬x1 < x2] [Std.Total fun (x1 x2 : α) => ¬x1 < x2] {l₁ l₂ : Array α} :
l₁ l₂ l₁ < l₂ l₁ = l₂
instance Array.instTotalLeOfDecidableEqOfDecidableLTOfNotLt {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] [Std.Total fun (x1 x2 : α) => ¬x1 < x2] :
Std.Total fun (x1 x2 : Array α) => x1 x2
@[simp]
theorem Array.lex_eq_true_iff_lt {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] {l₁ l₂ : Array α} :
(l₁.lex l₂ fun (x1 x2 : α) => decide (x1 < x2)) = true l₁ < l₂
@[simp]
theorem Array.lex_eq_false_iff_ge {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] {l₁ l₂ : Array α} :
(l₁.lex l₂ fun (x1 x2 : α) => decide (x1 < x2)) = false l₂ l₁
Equations
Equations
theorem Array.lex_eq_true_iff_exists {α : Type u_1} {l₁ l₂ : Array α} [BEq α] (lt : ααBool) :
l₁.lex l₂ lt = true (l₁.isEqv (l₂.take l₁.size) fun (x1 x2 : α) => x1 == x2) = true l₁.size < l₂.size ∃ (i : Nat), ∃ (h₁ : i < l₁.size), ∃ (h₂ : i < l₂.size), (∀ (j : Nat) (hj : j < i), (l₁[j] == l₂[j]) = true) lt l₁[i] l₂[i] = true

l₁ is lexicographically less than l₂ if either

  • l₁ is pairwise equivalent under · == · to l₂.take l₁.size, and l₁ is shorter than l₂ or
  • there exists an index i such that
    • for all j < i, l₁[j] == l₂[j] and
    • l₁[i] < l₂[i]
theorem Array.lex_eq_false_iff_exists {α : Type u_1} {l₁ l₂ : Array α} [BEq α] [PartialEquivBEq α] (lt : ααBool) (lt_irrefl : ∀ (x y : α), (x == y) = truelt x y = false) (lt_asymm : ∀ (x y : α), lt x y = truelt y x = false) (lt_antisymm : ∀ (x y : α), lt x y = falselt y x = false(x == y) = true) :
l₁.lex l₂ lt = false (l₂.isEqv (l₁.take l₂.size) fun (x1 x2 : α) => x1 == x2) = true ∃ (i : Nat), ∃ (h₁ : i < l₁.size), ∃ (h₂ : i < l₂.size), (∀ (j : Nat) (hj : j < i), (l₁[j] == l₂[j]) = true) lt l₂[i] l₁[i] = true

l₁ is not lexicographically less than l₂ (which you might think of as "l₂ is lexicographically greater than or equal to l₁"") if either

  • l₁ is pairwise equivalent under · == · to l₂.take l₁.length or
  • there exists an index i such that
    • for all j < i, l₁[j] == l₂[j] and
    • l₂[i] < l₁[i]

This formulation requires that == and lt are compatible in the following senses:

  • == is symmetric (we unnecessarily further assume it is transitive, to make use of the existing typeclasses)
  • lt is irreflexive with respect to == (i.e. if x == y then lt x y = false
  • lt is asymmmetric (i.e. lt x y = true → lt y x = false)
  • lt is antisymmetric with respect to == (i.e. lt x y = false → lt y x = false → x == y)
theorem Array.lt_iff_exists {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] {l₁ l₂ : Array α} :
l₁ < l₂ l₁ = l₂.take l₁.size l₁.size < l₂.size ∃ (i : Nat), ∃ (h₁ : i < l₁.size), ∃ (h₂ : i < l₂.size), (∀ (j : Nat) (hj : j < i), l₁[j] = l₂[j]) l₁[i] < l₂[i]
theorem Array.le_iff_exists {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] [Std.Asymm fun (x1 x2 : α) => x1 < x2] [Std.Antisymm fun (x1 x2 : α) => ¬x1 < x2] {l₁ l₂ : Array α} :
l₁ l₂ l₁ = l₂.take l₁.size ∃ (i : Nat), ∃ (h₁ : i < l₁.size), ∃ (h₂ : i < l₂.size), (∀ (j : Nat) (hj : j < i), l₁[j] = l₂[j]) l₁[i] < l₂[i]
theorem Array.append_left_lt {α : Type u_1} [LT α] {l₁ l₂ l₃ : Array α} (h : l₂ < l₃) :
l₁ ++ l₂ < l₁ ++ l₃
theorem Array.append_left_le {α : Type u_1} [DecidableEq α] [LT α] [DecidableLT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] [Std.Asymm fun (x1 x2 : α) => x1 < x2] [Std.Antisymm fun (x1 x2 : α) => ¬x1 < x2] {l₁ l₂ l₃ : Array α} (h : l₂ l₃) :
l₁ ++ l₂ l₁ ++ l₃
theorem Array.le_append_left {α : Type u_1} [LT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] {l₁ l₂ : Array α} :
l₁ l₁ ++ l₂
theorem Array.map_lt {α : Type u_1} {β : Type u_2} [LT α] [LT β] {l₁ l₂ : Array α} {f : αβ} (w : ∀ (x y : α), x < yf x < f y) (h : l₁ < l₂) :
Array.map f l₁ < Array.map f l₂
theorem Array.map_le {α : Type u_1} {β : Type u_2} [DecidableEq α] [LT α] [DecidableLT α] [DecidableEq β] [LT β] [DecidableLT β] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] [Std.Asymm fun (x1 x2 : α) => x1 < x2] [Std.Antisymm fun (x1 x2 : α) => ¬x1 < x2] [Std.Irrefl fun (x1 x2 : β) => x1 < x2] [Std.Asymm fun (x1 x2 : β) => x1 < x2] [Std.Antisymm fun (x1 x2 : β) => ¬x1 < x2] {l₁ l₂ : Array α} {f : αβ} (w : ∀ (x y : α), x < yf x < f y) (h : l₁ l₂) :
Array.map f l₁ Array.map f l₂