Lexicographic ordering #
theorem
Array.not_le_iff_gt
{α : Type u_1}
[DecidableEq α]
[LT α]
[DecidableLT α]
(l₁ l₂ : List α)
:
theorem
Array.lt_irrefl
{α : Type u_1}
[LT α]
[Std.Irrefl fun (x1 x2 : α) => x1 < x2]
(l : Array α)
:
instance
Array.ltIrrefl
{α : Type u_1}
[LT α]
[Std.Irrefl fun (x1 x2 : α) => x1 < x2]
:
Std.Irrefl fun (x1 x2 : Array α) => x1 < x2
theorem
Array.le_refl
{α : Type u_1}
[LT α]
[i₀ : Std.Irrefl fun (x1 x2 : α) => x1 < x2]
(l : Array α)
:
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]
:
Equations
- Array.instTransLt = { trans := ⋯ }
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]
:
Equations
instance
Array.instAsymmLtOfDecidableEqOfDecidableLT
{α : Type u_1}
[DecidableEq α]
[LT α]
[DecidableLT α]
[Std.Asymm fun (x1 x2 : α) => x1 < x2]
:
theorem
Array.le_total
{α : Type u_1}
[DecidableEq α]
[LT α]
[DecidableLT α]
[i : Std.Total fun (x1 x2 : α) => ¬x1 < x2]
(l₁ l₂ : Array α)
:
@[simp]
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 α}
:
instance
Array.instTotalLeOfDecidableEqOfDecidableLTOfNotLt
{α : Type u_1}
[DecidableEq α]
[LT α]
[DecidableLT α]
[Std.Total fun (x1 x2 : α) => ¬x1 < x2]
:
@[simp]
theorem
Array.lex_eq_true_iff_lt
{α : Type u_1}
[DecidableEq α]
[LT α]
[DecidableLT α]
{l₁ l₂ : Array α}
:
@[simp]
theorem
Array.lex_eq_false_iff_ge
{α : Type u_1}
[DecidableEq α]
[LT α]
[DecidableLT α]
{l₁ l₂ : Array α}
:
instance
Array.instDecidableLTOfDecidableEq
{α : Type u_1}
[DecidableEq α]
[LT α]
[DecidableLT α]
:
DecidableLT (Array α)
instance
Array.instDecidableLEOfDecidableEqOfDecidableLT
{α : Type u_1}
[DecidableEq α]
[LT α]
[DecidableLT α]
:
DecidableLE (Array α)
l₁
is lexicographically less than l₂
if either
l₁
is pairwise equivalent under· == ·
tol₂.take l₁.size
, andl₁
is shorter thanl₂
or- there exists an index
i
such that- for all
j < i
,l₁[j] == l₂[j]
and l₁[i] < l₂[i]
- for all
theorem
Array.lex_eq_false_iff_exists
{α : Type u_1}
{l₁ l₂ : Array α}
[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₁.length
or- there exists an index
i
such 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)lt
is irreflexive with respect to==
(i.e. ifx == y
thenlt 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.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 α}
:
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₃)
:
theorem
Array.le_append_left
{α : Type u_1}
[LT α]
[Std.Irrefl fun (x1 x2 : α) => x1 < x2]
{l₁ l₂ : Array α}
:
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 < y → f x < f y)
(h : l₁ ≤ l₂)
: