Lexicographic ordering #
instance List.ltIrrefl {α : Type u_1} [LT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] :
Std.Irrefl fun (x1 x2 : List α) => x1 < x2
theorem List.left_le_left_of_cons_le_cons {α : Type u_1} [LT α] [LE α] [Std.IsLinearOrder α] [Std.LawfulOrderLT α] {a b : α} {l₁ l₂ : List α} (h : a :: l₁ ≤ b :: l₂) :
theorem List.le_of_cons_le_cons {α : Type u_1} [LT α] [i₀ : Std.Irrefl fun (x1 x2 : α) => x1 < x2] [i₁ : Std.Asymm fun (x1 x2 : α) => x1 < x2] [i₂ : Std.Trichotomous fun (x1 x2 : α) => x1 < x2] {a : α} {l₁ l₂ : List α} (h : a :: l₁ ≤ a :: l₂) :
theorem List.le_refl {α : Type u_1} [LT α] [i₀ : Std.Irrefl fun (x1 x2 : α) => x1 < x2] (l : List α) :
theorem List.lt_of_le_of_lt {α : Type u_1} [LT α] [LE α] [Std.IsLinearOrder α] [Std.LawfulOrderLT α] {l₁ l₂ l₃ : List α} (h₁ : l₁ ≤ l₂) (h₂ : l₂ < l₃) :
theorem List.le_trans {α : Type u_1} [LT α] [LE α] [Std.IsLinearOrder α] [Std.LawfulOrderLT α] {l₁ l₂ l₃ : List α} (h₁ : l₁ ≤ l₂) (h₂ : l₂ ≤ l₃) :
@[instance_reducible]
instance List.instTransLeOfIsLinearOrderOfLawfulOrderLT {α : Type u_1} [LT α] [LE α] [Std.IsLinearOrder α] [Std.LawfulOrderLT α] :
Equations
- List.instTransLeOfIsLinearOrderOfLawfulOrderLT = { trans := ⋯ }
instance List.instIsLinearOrder {α : Type u_1} [LT α] [LE α] [Std.IsLinearOrder α] [Std.LawfulOrderLT α] :
l₁ is lexicographically less than l₂ if either
l₁is pairwise equivalent under· == ·tol₂.take l₁.length, andl₁is shorter thanl₂or- there exists an index
isuch that- for all
j < i,l₁[j] == l₂[j]and l₁[i] < l₂[i]
- for all
theorem List.lex_eq_false_iff_exists {α : Type u_1} {l₁ l₂ : List α} [BEq α] [PartialEquivBEq α] (lt : α → α → Bool) (lt_irrefl : ∀ (x y : α), (x == y) = true → lt x y = false) (lt_asymm : ∀ (x y : α), lt x y = true → lt y x = false) (lt_antisymm : ∀ (x y : α), lt x y = false → lt y x = false → (x == y) = 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· == ·tol₂.take l₁.lengthor- there exists an index
isuch that- for all
j < i,l₁[j] == l₂[j]and l₂[i] < l₁[i]
- for all
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)ltis irreflexive with respect to==(i.e. ifx == ythenlt x y = falseltis asymmetric (i.e.lt x y = true → lt y x = false)ltis antisymmetric with respect to==(i.e.lt x y = false → lt y x = false → x == y)
theorem List.le_iff_exists {α : Type u_1} [LT α] [Std.Asymm fun (x1 x2 : α) => x1 < x2] [Std.Trichotomous fun (x1 x2 : α) => x1 < x2] {l₁ l₂ : List α} :
theorem List.le_append_left {α : Type u_1} [LT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] {l₁ l₂ : List α} :
theorem List.IsPrefix.le {α : Type u_1} [LT α] [Std.Irrefl fun (x1 x2 : α) => x1 < x2] {l₁ l₂ : List α} (h : l₁ <+: l₂) :
theorem List.map_le {α : Type u_1} {β : Type u_2} [LT α] [LT β] [Std.Asymm fun (x1 x2 : α) => x1 < x2] [Std.Trichotomous fun (x1 x2 : α) => x1 < x2] [Std.Asymm fun (x1 x2 : β) => x1 < x2] [Std.Trichotomous fun (x1 x2 : β) => x1 < x2] {l₁ l₂ : List α} {f : α → β} (w : ∀ (x y : α), x < y → f x < f y) (h : l₁ ≤ l₂) :
theorem List.map_lt_map_iff_of_injective {α : Type u_1} {β : Type u_2} [LT α] [LT β] (f : α → β) (hf : ∀ (a b : α), f a < f b ↔ a < b) (hfinj : Function.Injective f) {l₁ l₂ : List α} :
See map_lt_map_iff for a variant with fewer proof obligations for f but with some mild
assumptions on the order on α and β.
theorem List.map_lt_map_iff {α : Type u_1} {β : Type u_2} [LT α] [Std.Trichotomous fun (x1 x2 : α) => x1 < x2] [LT β] [Std.Asymm fun (x1 x2 : β) => x1 < x2] (f : α → β) (hf : ∀ (a b : α), a < b → f a < f b) {l₁ l₂ : List α} :
See map_lt_map_iff_of_injective for a variant which does not assume anything about the order
on α and β, but with more assumptions on f.
theorem List.flatMap_lt_flatMap_iff {α : Type u_1} {β : Type u_2} [LT α] [Std.Trichotomous fun (x1 x2 : α) => x1 < x2] [LT β] [Std.Asymm fun (x1 x2 : β) => x1 < x2] (f : α → List β) (hf : ∀ (a b : α), a < b → f a < f b) (hp : ∀ (a b : α), f a <+: f b → a = b) (hx : ∀ (a : α), f a ≠ []) {l₁ l₂ : List α} :
theorem List.flatMap_le_flatMap_iff {α : Type u_1} {β : Type u_2} [LT α] [Std.Trichotomous fun (x1 x2 : α) => x1 < x2] [LT β] [Std.Asymm fun (x1 x2 : β) => x1 < x2] (f : α → List β) (hf : ∀ (a b : α), a < b → f a < f b) (hp : ∀ (a b : α), f a <+: f b → a = b) (hx : ∀ (a : α), f a ≠ []) {l₁ l₂ : List α} :