Documentation

Init.Data.Vector.Lex

Lexicographic ordering #

@[simp]
theorem Vector.lt_toArray {α : Type u_1} {n : Nat} [LT α] (xs ys : Vector α n) :
xs.toArray < ys.toArray xs < ys
@[simp]
theorem Vector.le_toArray {α : Type u_1} {n : Nat} [LT α] (xs ys : Vector α n) :
xs.toArray ys.toArray xs ys
@[simp]
theorem Vector.lt_toList {α : Type u_1} {n : Nat} [LT α] (xs ys : Vector α n) :
xs.toList < ys.toList xs < ys
@[simp]
theorem Vector.le_toList {α : Type u_1} {n : Nat} [LT α] (xs ys : Vector α n) :
xs.toList ys.toList xs ys
theorem Vector.not_lt_iff_ge {α : Type u_1} {n : Nat} [LT α] (xs ys : Vector α n) :
¬xs < ys ys xs
theorem Vector.not_le_iff_gt {α : Type u_1} {n : Nat} [DecidableEq α] [LT α] [DecidableLT α] (xs ys : Vector α n) :
¬xs ys ys < xs
@[simp]
theorem Vector.mk_lt_mk {α : Type u_1} {n : Nat} {data₁ : Array α} {size₁ : data₁.size = n} {data₂ : Array α} {size₂ : data₂.size = n} [LT α] :
{ toArray := data₁, size_toArray := size₁ } < { toArray := data₂, size_toArray := size₂ } data₁ < data₂
@[simp]
theorem Vector.mk_le_mk {α : Type u_1} {n : Nat} {data₁ : Array α} {size₁ : data₁.size = n} {data₂ : Array α} {size₂ : data₂.size = n} [LT α] :
{ toArray := data₁, size_toArray := size₁ } { toArray := data₂, size_toArray := size₂ } data₁ data₂
@[simp]
theorem Vector.mk_lex_mk {α : Type u_1} {n : Nat} [BEq α] (lt : ααBool) {xs ys : Array α} {n₁ : xs.size = n} {n₂ : ys.size = n} :
{ toArray := xs, size_toArray := n₁ }.lex { toArray := ys, size_toArray := n₂ } lt = xs.lex ys lt
@[simp]
theorem Vector.lex_toArray {α : Type u_1} {n : Nat} [BEq α] (lt : ααBool) (xs ys : Vector α n) :
xs.lex ys.toArray lt = xs.lex ys lt
@[simp]
theorem Vector.lex_toList {α : Type u_1} {n : Nat} [BEq α] (lt : ααBool) (xs ys : Vector α n) :
xs.toList.lex ys.toList lt = xs.lex ys lt
@[simp]
theorem Vector.lex_empty {α : Type u_1} [BEq α] {lt : ααBool} (xs : Vector α 0) :
xs.lex { toArray := #[], size_toArray := } lt = false
@[simp]
theorem Vector.singleton_lex_singleton {α : Type u_1} {a b : α} [BEq α] {lt : ααBool} :
{ toArray := #[a], size_toArray := }.lex { toArray := #[b], size_toArray := } lt = lt a b
theorem Vector.lt_irrefl {α : Type u_1} {n : Nat} [LT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] (xs : Vector α n) :
¬xs < xs
instance Vector.ltIrrefl {α : Type u_1} {n : Nat} [LT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] :
Std.Irrefl fun (x1 x2 : Vector α n) => x1 < x2
@[simp]
theorem Vector.not_lt_empty {α : Type u_1} [LT α] (xs : Vector α 0) :
¬xs < { toArray := #[], size_toArray := }
@[simp]
theorem Vector.empty_le {α : Type u_1} [LT α] (xs : Vector α 0) :
{ toArray := #[], size_toArray := } xs
@[simp]
theorem Vector.le_empty {α : Type u_1} [LT α] (xs : Vector α 0) :
xs { toArray := #[], size_toArray := } xs = { toArray := #[], size_toArray := }
theorem Vector.le_refl {α : Type u_1} {n : Nat} [LT α] [i₀ : Std.Irrefl fun (x1 x2 : α) => x1 < x2] (xs : Vector α n) :
xs xs
instance Vector.instReflLeOfIrreflLt {α : Type u_1} {n : Nat} [LT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] :
Std.Refl fun (x1 x2 : Vector α n) => x1 x2
theorem Vector.lt_trans {α : Type u_1} {n : Nat} [LT α] [i₁ : Trans (fun (x1 x2 : α) => x1 < x2) (fun (x1 x2 : α) => x1 < x2) fun (x1 x2 : α) => x1 < x2] {xs ys zs : Vector α n} (h₁ : xs < ys) (h₂ : ys < zs) :
xs < zs
instance Vector.instTransLt {α : Type u_1} {n : Nat} [LT α] [Trans (fun (x1 x2 : α) => x1 < x2) (fun (x1 x2 : α) => x1 < x2) fun (x1 x2 : α) => x1 < x2] :
Trans (fun (x1 x2 : Vector α n) => x1 < x2) (fun (x1 x2 : Vector α n) => x1 < x2) fun (x1 x2 : Vector α n) => x1 < x2
Equations
theorem Vector.lt_of_le_of_lt {α : Type u_1} {n : Nat} [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] {xs ys zs : Vector α n} (h₁ : xs ys) (h₂ : ys < zs) :
xs < zs
theorem Vector.le_trans {α : Type u_1} {n : Nat} [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] {xs ys zs : Vector α n} (h₁ : xs ys) (h₂ : ys zs) :
xs zs
instance Vector.instTransLeOfDecidableEqOfDecidableLTOfIrreflOfAsymmOfAntisymmOfNotLt {α : Type u_1} {n : Nat} [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 : Vector α n) => x1 x2) (fun (x1 x2 : Vector α n) => x1 x2) fun (x1 x2 : Vector α n) => x1 x2
Equations
theorem Vector.lt_asymm {α : Type u_1} {n : Nat} [LT α] [i : Std.Asymm fun (x1 x2 : α) => x1 < x2] {xs ys : Vector α n} (h : xs < ys) :
¬ys < xs
instance Vector.instAsymmLtOfDecidableEqOfDecidableLT {α : Type u_1} {n : Nat} [DecidableEq α] [LT α] [DecidableLT α] [Std.Asymm fun (x1 x2 : α) => x1 < x2] :
Std.Asymm fun (x1 x2 : Vector α n) => x1 < x2
theorem Vector.le_total {α : Type u_1} {n : Nat} [DecidableEq α] [LT α] [DecidableLT α] [i : Std.Total fun (x1 x2 : α) => ¬x1 < x2] (xs ys : Vector α n) :
xs ys ys xs
instance Vector.instTotalLeOfDecidableEqOfDecidableLTOfNotLt {α : Type u_1} {n : Nat} [DecidableEq α] [LT α] [DecidableLT α] [Std.Total fun (x1 x2 : α) => ¬x1 < x2] :
Std.Total fun (x1 x2 : Vector α n) => x1 x2
@[simp]
theorem Vector.not_lt {α : Type u_1} {n : Nat} [LT α] {xs ys : Vector α n} :
¬xs < ys ys xs
@[simp]
theorem Vector.not_le {α : Type u_1} {n : Nat} [DecidableEq α] [LT α] [DecidableLT α] {xs ys : Vector α n} :
¬ys xs xs < ys
theorem Vector.le_of_lt {α : Type u_1} {n : Nat} [DecidableEq α] [LT α] [DecidableLT α] [i : Std.Total fun (x1 x2 : α) => ¬x1 < x2] {xs ys : Vector α n} (h : xs < ys) :
xs ys
theorem Vector.le_iff_lt_or_eq {α : Type u_1} {n : Nat} [DecidableEq α] [LT α] [DecidableLT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] [Std.Antisymm fun (x1 x2 : α) => ¬x1 < x2] [Std.Total fun (x1 x2 : α) => ¬x1 < x2] {xs ys : Vector α n} :
xs ys xs < ys xs = ys
@[simp]
theorem Vector.lex_eq_true_iff_lt {α : Type u_1} {n : Nat} [DecidableEq α] [LT α] [DecidableLT α] {xs ys : Vector α n} :
(xs.lex ys fun (x1 x2 : α) => decide (x1 < x2)) = true xs < ys
@[simp]
theorem Vector.lex_eq_false_iff_ge {α : Type u_1} {n : Nat} [DecidableEq α] [LT α] [DecidableLT α] {xs ys : Vector α n} :
(xs.lex ys fun (x1 x2 : α) => decide (x1 < x2)) = false ys xs
instance Vector.instDecidableLTOfDecidableEq {α : Type u_1} {n : Nat} [DecidableEq α] [LT α] [DecidableLT α] :
Equations
Equations
theorem Vector.lex_eq_true_iff_exists {α : Type u_1} {n : Nat} [BEq α] (lt : ααBool) {xs ys : Vector α n} :
xs.lex ys lt = true (i : Nat), (h : i < n), (∀ (j : Nat) (hj : j < i), (xs[j] == ys[j]) = true) lt xs[i] ys[i] = true

xs is lexicographically less than ys if there exists an index i such that

  • for all j < i, l₁[j] == l₂[j] and
  • l₁[i] < l₂[i]
theorem Vector.lex_eq_false_iff_exists {α : Type u_1} {n : Nat} [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) {xs ys : Vector α n} :
xs.lex ys lt = false (ys.isEqv xs fun (x1 x2 : α) => x1 == x2) = true (i : Nat), (h : i < n), (∀ (j : Nat) (hj : j < i), (xs[j] == ys[j]) = true) lt ys[i] xs[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₂ 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 Vector.lt_iff_exists {α : Type u_1} {n : Nat} [DecidableEq α] [LT α] [DecidableLT α] {xs ys : Vector α n} :
xs < ys (i : Nat), (h : i < n), (∀ (j : Nat) (hj : j < i), xs[j] = ys[j]) xs[i] < ys[i]
theorem Vector.le_iff_exists {α : Type u_1} {n : Nat} [DecidableEq α] [LT α] [DecidableLT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] [Std.Asymm fun (x1 x2 : α) => x1 < x2] [Std.Antisymm fun (x1 x2 : α) => ¬x1 < x2] {xs ys : Vector α n} :
xs ys xs = ys (i : Nat), (h : i < n), (∀ (j : Nat) (hj : j < i), xs[j] = ys[j]) xs[i] < ys[i]
theorem Vector.append_left_lt {α : Type u_1} {n m : Nat} [LT α] {xs : Vector α n} {ys ys' : Vector α m} (h : ys < ys') :
xs ++ ys < xs ++ ys'
theorem Vector.append_left_le {α : Type u_1} {n m : Nat} [DecidableEq α] [LT α] [DecidableLT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] [Std.Asymm fun (x1 x2 : α) => x1 < x2] [Std.Antisymm fun (x1 x2 : α) => ¬x1 < x2] {xs : Vector α n} {ys ys' : Vector α m} (h : ys ys') :
xs ++ ys xs ++ ys'
theorem Vector.map_lt {α : Type u_1} {β : Type u_2} {n : Nat} [LT α] [LT β] {xs ys : Vector α n} {f : αβ} (w : ∀ (x y : α), x < yf x < f y) (h : xs < ys) :
map f xs < map f ys
theorem Vector.map_le {α : Type u_1} {β : Type u_2} {n : Nat} [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] {xs ys : Vector α n} {f : αβ} (w : ∀ (x y : α), x < yf x < f y) (h : xs ys) :
map f xs map f ys