Built with
doc-gen4 , running Lean4.
Bubbles (
) indicate interactive fragments: hover for details, tap to reveal contents.
Use
Ctrl+↑ Ctrl+↓ to navigate,
Ctrl+🖱️ to focus.
On Mac, use
Cmd instead of
Ctrl .
/-
Copyright (c) 2019 Scott Morrison. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Scott Morrison, Minchao Wu
! This file was ported from Lean 3 source module data.prod.lex
! leanprover-community/mathlib commit 70d50ecfd4900dd6d328da39ab7ebd516abe4025
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Order.BoundedOrder
/-!
# Lexicographic order
This file defines the lexicographic relation for pairs of orders, partial orders and linear orders.
## Main declarations
* `Prod.Lex.Order`: Instances lifting the orders on `α` and `β` to `α ×ₗ β`.
## Notation
* `α ×ₗ β`: `α × β` equipped with the lexicographic order
## See also
Related files are:
* `Data.Finset.CoLex`: Colexicographic order on finite sets.
* `Data.List.Lex`: Lexicographic order on lists.
* `Data.Pi.Lex`: Lexicographic order on `Πₗ i, α i`.
* `Data.PSigma.Order`: Lexicographic order on `Σ' i, α i`.
* `Data.Sigma.Order`: Lexicographic order on `Σ i, α i`.
-/
variable { α β γ : Type _ }
namespace Prod.Lex
-- porting note: `Prod.Lex` is not protected in core, hence the `_root_.` prefix
-- This will be fixed in nightly-2022-11-30
@[inherit_doc] notation :35 α " ×ₗ " β :34 => _root_.Lex ( Prod α β )
instance decidableEq ( α β : Type _ : Type (?u.14110+1) Type _) [ DecidableEq : Sort ?u.14116 → Sort (max1?u.14116) DecidableEq α ] [ DecidableEq : Sort ?u.14125 → Sort (max1?u.14125) DecidableEq β ] : DecidableEq : Sort ?u.14134 → Sort (max1?u.14134) DecidableEq ( α ×ₗ β ) :=
instDecidableEqProd
#align prod.lex.decidable_eq Prod.Lex.decidableEq
instance inhabited ( α β : Type _ : Type (?u.14486+1) Type _) [ Inhabited : Sort ?u.14489 → Sort (max1?u.14489) Inhabited α ] [ Inhabited : Sort ?u.14492 → Sort (max1?u.14492) Inhabited β ] : Inhabited : Sort ?u.14495 → Sort (max1?u.14495) Inhabited ( α ×ₗ β ) :=
instInhabitedProd
#align prod.lex.inhabited Prod.Lex.inhabited
/-- Dictionary / lexicographic ordering on pairs. -/
instance instLE : (α : Type u_1) → (β : Type u_2) → [inst : LT α ] → [inst : LE β ] → LE (Lex (α × β ) ) instLE ( α β : Type _ : Type (?u.14797+1) Type _) [ LT α ] [ LE β ] : LE ( α ×ₗ β ) where le := Prod.Lex (· < ·) (· ≤ ·)
#align prod.lex.has_le Prod.Lex.instLE : (α : Type u_1) → (β : Type u_2) → [inst : LT α ] → [inst : LE β ] → LE (Lex (α × β ) ) Prod.Lex.instLE
instance instLT : (α : Type ?u.14948) → (β : Type ?u.14951) → [inst : LT α ] → [inst : LT β ] → LT (Lex (α × β ) ) instLT ( α β : Type _ : Type (?u.14948+1) Type _) [ LT α ] [ LT β ] : LT ( α ×ₗ β ) where lt := Prod.Lex (· < ·) (· < ·)
#align prod.lex.has_lt Prod.Lex.instLT : (α : Type u_1) → (β : Type u_2) → [inst : LT α ] → [inst : LT β ] → LT (Lex (α × β ) ) Prod.Lex.instLT
theorem le_iff : ∀ [inst : LT α ] [inst_1 : LE β ] (a b : α × β ), ↑toLex a ≤ ↑toLex b ↔ a .fst < b .fst ∨ a .fst = b .fst ∧ a .snd ≤ b .snd le_iff [ LT α ] [ LE β ] ( a b : α × β ) :
toLex a ≤ toLex b ↔ a . 1 : {α : Type ?u.15273} → {β : Type ?u.15272} → α × β → α 1 < b . 1 : {α : Type ?u.15277} → {β : Type ?u.15276} → α × β → α 1 ∨ a . 1 : {α : Type ?u.15286} → {β : Type ?u.15285} → α × β → α 1 = b . 1 : {α : Type ?u.15290} → {β : Type ?u.15289} → α × β → α 1 ∧ a . 2 : {α : Type ?u.15296} → {β : Type ?u.15295} → α × β → β 2 ≤ b . 2 : {α : Type ?u.15300} → {β : Type ?u.15299} → α × β → β 2 :=
Prod.lex_def : ∀ {α : Type ?u.15312} {β : Type ?u.15313} (r : α → α → Prop ) (s : β → β → Prop ) {p q : α × β },
Prod.Lex r s p q ↔ r p .fst q .fst ∨ p .fst = q .fst ∧ s p .snd q .snd Prod.lex_def (· < ·) (· ≤ ·)
#align prod.lex.le_iff Prod.Lex.le_iff : ∀ {α : Type u_1} {β : Type u_2} [inst : LT α ] [inst_1 : LE β ] (a b : α × β ),
↑toLex a ≤ ↑toLex b ↔ a .fst < b .fst ∨ a .fst = b .fst ∧ a .snd ≤ b .snd Prod.Lex.le_iff
theorem lt_iff : ∀ {α : Type u_1} {β : Type u_2} [inst : LT α ] [inst_1 : LT β ] (a b : α × β ),
↑toLex a < ↑toLex b ↔ a .fst < b .fst ∨ a .fst = b .fst ∧ a .snd < b .snd lt_iff [ LT α ] [ LT β ] ( a b : α × β ) :
toLex a < toLex b ↔ a . 1 : {α : Type ?u.15669} → {β : Type ?u.15668} → α × β → α 1 < b . 1 : {α : Type ?u.15673} → {β : Type ?u.15672} → α × β → α 1 ∨ a . 1 : {α : Type ?u.15682} → {β : Type ?u.15681} → α × β → α 1 = b . 1 : {α : Type ?u.15686} → {β : Type ?u.15685} → α × β → α 1 ∧ a . 2 : {α : Type ?u.15692} → {β : Type ?u.15691} → α × β → β 2 < b . 2 : {α : Type ?u.15696} → {β : Type ?u.15695} → α × β → β 2 :=
Prod.lex_def : ∀ {α : Type ?u.15708} {β : Type ?u.15709} (r : α → α → Prop ) (s : β → β → Prop ) {p q : α × β },
Prod.Lex r s p q ↔ r p .fst q .fst ∨ p .fst = q .fst ∧ s p .snd q .snd Prod.lex_def (· < ·) (· < ·)
#align prod.lex.lt_iff Prod.Lex.lt_iff : ∀ {α : Type u_1} {β : Type u_2} [inst : LT α ] [inst_1 : LT β ] (a b : α × β ),
↑toLex a < ↑toLex b ↔ a .fst < b .fst ∨ a .fst = b .fst ∧ a .snd < b .snd Prod.Lex.lt_iff
example : ∀ {α : Type u_1} {β : Type u_2} (x : α ) (y : β ), ↑toLex (x , y ) = ↑toLex (x , y ) example ( x : α ) ( y : β ) : toLex ( x , y ) = toLex ( x , y ) := rfl : ∀ {α : Sort ?u.16033} {a : α }, a = a rfl
/-- Dictionary / lexicographic preorder for pairs. -/
instance preorder ( α β : Type _ : Type (?u.16056+1) Type _) [ Preorder α ] [ Preorder β ] : Preorder ( α ×ₗ β ) :=
{ Prod.Lex.instLE : (α : Type ?u.16080) → (β : Type ?u.16079) → [inst : LT α ] → [inst : LE β ] → LE (Lex (α × β ) ) Prod.Lex.instLE α β , Prod.Lex.instLT : (α : Type ?u.16106) → (β : Type ?u.16105) → [inst : LT α ] → [inst : LT β ] → LT (Lex (α × β ) ) Prod.Lex.instLT α β with
le_refl := refl_of : ∀ {α : Type ?u.16148} (r : α → α → Prop ) [inst : IsRefl α r ] (a : α ), r a a refl_of <| Prod.Lex _ : ?m.16152 → ?m.16152 → Prop _ _ : ?m.16153 → ?m.16153 → Prop _,
le_trans := fun _ _ _ => trans_of : ∀ {α : Type ?u.16312} (r : α → α → Prop ) [inst : IsTrans α r ] {a b c : α }, r a b → r b c → r a c trans_of <| Prod.Lex _ : ?m.16316 → ?m.16316 → Prop _ _ : ?m.16317 → ?m.16317 → Prop _,
lt_iff_le_not_le := fun x₁ x₂ =>
match x₁ , x₂ with
| ( a₁ , b₁ ), ( a₂ , b₂ ) => by
(a₁ , b₁ ) < (a₂ , b₂ ) ↔ (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) constructor mp (a₁ , b₁ ) < (a₂ , b₂ ) → (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) mpr (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) → (a₁ , b₁ ) < (a₂ , b₂ )
(a₁ , b₁ ) < (a₂ , b₂ ) ↔ (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) · mp (a₁ , b₁ ) < (a₂ , b₂ ) → (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) mp (a₁ , b₁ ) < (a₂ , b₂ ) → (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) mpr (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) → (a₁ , b₁ ) < (a₂ , b₂ ) rintro (⟨_, _, hlt⟩ | ⟨_, hlt⟩) : ?a
(⟨_, _, hlt⟩ | ⟨_, hlt⟩ : ?a
⟨_ ⟨_, _, hlt⟩ | ⟨_, hlt⟩ : ?a
, _ ⟨_, _, hlt⟩ | ⟨_, hlt⟩ : ?a
, hlt ⟨_, _, hlt⟩ | ⟨_, hlt⟩ : ?a
⟩ | ⟨_ ⟨_, _, hlt⟩ | ⟨_, hlt⟩ : ?a
, hlt ⟨_, _, hlt⟩ | ⟨_, hlt⟩ : ?a
⟩(⟨_, _, hlt⟩ | ⟨_, hlt⟩) : ?a
)mp.left (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) mp.right (a₁ , b₁ ) ≤ (a₁ , b₂ ) ∧ ¬ (a₁ , b₂ ) ≤ (a₁ , b₁ )
mp (a₁ , b₁ ) < (a₂ , b₂ ) → (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) · mp.left (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) mp.left (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) mp.right (a₁ , b₁ ) ≤ (a₁ , b₂ ) ∧ ¬ (a₁ , b₂ ) ≤ (a₁ , b₁ ) constructor mp.left.left mp.left.right
mp.left (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) · mp.left.left mp.left.right exact left : ∀ {α : Type ?u.17006} {β : Type ?u.17005} {ra : α → α → Prop } {rb : β → β → Prop } {a₁ : α } (b₁ : β ) {a₂ : α } (b₂ : β ),
ra a₁ a₂ → Prod.Lex ra rb (a₁ , b₁ ) (a₂ , b₂ ) left _ _ hlt
mp.left (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) · rintro ⟨⟩ mp.left.right.left mp.left.right.right
· mp.left.right.left mp.left.right.right apply lt_asymm hlt ; assumption
· exact lt_irrefl _ hlt
mp (a₁ , b₁ ) < (a₂ , b₂ ) → (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) · mp.right (a₁ , b₁ ) ≤ (a₁ , b₂ ) ∧ ¬ (a₁ , b₂ ) ≤ (a₁ , b₁ ) mp.right (a₁ , b₁ ) ≤ (a₁ , b₂ ) ∧ ¬ (a₁ , b₂ ) ≤ (a₁ , b₁ ) constructor mp.right.left mp.right.right
mp.right (a₁ , b₁ ) ≤ (a₁ , b₂ ) ∧ ¬ (a₁ , b₂ ) ≤ (a₁ , b₁ ) · mp.right.left mp.right.right right
rw [ lt_iff_le_not_le ] at hlt
exact hlt . 1 : ∀ {a b : Prop }, a ∧ b → a 1
mp.right (a₁ , b₁ ) ≤ (a₁ , b₂ ) ∧ ¬ (a₁ , b₂ ) ≤ (a₁ , b₁ ) · rintro ⟨⟩ mp.right.right.left mp.right.right.right
· mp.right.right.left mp.right.right.right apply lt_irrefl a₁
assumption
· rw [ lt_iff_le_not_le ] at hlt
apply hlt . 2 : ∀ {a b : Prop }, a ∧ b → b 2
assumption
(a₁ , b₁ ) < (a₂ , b₂ ) ↔ (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) · mpr (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) → (a₁ , b₁ ) < (a₂ , b₂ ) mpr (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) → (a₁ , b₁ ) < (a₂ , b₂ ) rintro ⟨ ⟨⟩ , h₂r : unknown free variable '_uniq.17788'
h₂r ⟩ mpr.intro.left mpr.intro.right
mpr (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) → (a₁ , b₁ ) < (a₂ , b₂ ) · mpr.intro.left mpr.intro.right left
assumption
mpr (a₁ , b₁ ) ≤ (a₂ , b₂ ) ∧ ¬ (a₂ , b₂ ) ≤ (a₁ , b₁ ) → (a₁ , b₁ ) < (a₂ , b₂ ) · right
rw [ lt_iff_le_not_le ]
constructor mpr.intro.right.h.left mpr.intro.right.h.right
· mpr.intro.right.h.left mpr.intro.right.h.right assumption
· intro h
apply h₂r : ¬ (a₁ , b₂ ) ≤ (a₁ , b₁ ) h₂r
right mpr.intro.right.h.right.h
exact h }
#align prod.lex.preorder Prod.Lex.preorder
section Preorder
variable [ PartialOrder : Type ?u.18627 → Type ?u.18627 PartialOrder α ] [ Preorder β ]
-- porting note: type class search sees right through the type synonrm for `α ×ₗ β` and uses the
-- `Preorder` structure for `α × β` instead
-- This is hopefully the same problems as in https://github.com/leanprover/lean4/issues/1891
-- and will be fixed in nightly-2022-11-30
theorem toLex_mono : @ Monotone _ _ _ ( Prod.Lex.preorder α β ) ( toLex : α × β → α ×ₗ β ) := by
rintro ⟨ a₁ , b₁ ⟩ ⟨ a₂ , b₂ ⟩ ⟨ha, hb⟩ : (a₁ , b₁ ) ≤ (a₂ , b₂ ) ⟨ha : (a₁ , b₁ ) .fst ≤ (a₂ , b₂ ) .fstha ⟨ha, hb⟩ : (a₁ , b₁ ) ≤ (a₂ , b₂ ) , hb : (a₁ , b₁ ) .snd ≤ (a₂ , b₂ ) .sndhb ⟨ha, hb⟩ : (a₁ , b₁ ) ≤ (a₂ , b₂ ) ⟩mk.mk.intro ↑toLex (a₁ , b₁ ) ≤ ↑toLex (a₂ , b₂ )
obtain : (a₁ , b₁ ) .fst = (a₂ , b₂ ) .fst ∨ (a₁ , b₁ ) .fst < (a₂ , b₂ ) .fstobtain rfl | ha : (a₁ , b₁ ) .fst < (a₂ , b₂ ) .fstha : a₁ = a₂ ∨ _ := ha : (a₁ , b₁ ) .fst ≤ (a₂ , b₂ ) .fstha . eq_or_lt mk.mk.intro.inl ↑toLex (a₁ , b₁ ) ≤ ↑toLex (a₁ , b₂ ) α : Type u_1β : Type u_2γ : Type ?u.18624inst✝¹ : PartialOrder α inst✝ : Preorder β a₁ : α b₁ : β a₂ : α b₂ : β ha✝ : (a₁ , b₁ ) .fst ≤ (a₂ , b₂ ) .fsthb : (a₁ , b₁ ) .snd ≤ (a₂ , b₂ ) .sndha : (a₁ , b₁ ) .fst < (a₂ , b₂ ) .fstmk.mk.intro.inr ↑toLex (a₁ , b₁ ) ≤ ↑toLex (a₂ , b₂ )
· mk.mk.intro.inl ↑toLex (a₁ , b₁ ) ≤ ↑toLex (a₁ , b₂ ) mk.mk.intro.inl ↑toLex (a₁ , b₁ ) ≤ ↑toLex (a₁ , b₂ ) α : Type u_1β : Type u_2γ : Type ?u.18624inst✝¹ : PartialOrder α inst✝ : Preorder β a₁ : α b₁ : β a₂ : α b₂ : β ha✝ : (a₁ , b₁ ) .fst ≤ (a₂ , b₂ ) .fsthb : (a₁ , b₁ ) .snd ≤ (a₂ , b₂ ) .sndha : (a₁ , b₁ ) .fst < (a₂ , b₂ ) .fstmk.mk.intro.inr ↑toLex (a₁ , b₁ ) ≤ ↑toLex (a₂ , b₂ ) exact right : ∀ {α : Type ?u.18934} {β : Type ?u.18933} {ra : α → α → Prop } {rb : β → β → Prop } (a : α ) {b₁ b₂ : β },
rb b₁ b₂ → Prod.Lex ra rb (a , b₁ ) (a , b₂ ) right _ hb : (a₁ , b₁ ) .snd ≤ (a₁ , b₂ ) .sndhb
· α : Type u_1β : Type u_2γ : Type ?u.18624inst✝¹ : PartialOrder α inst✝ : Preorder β a₁ : α b₁ : β a₂ : α b₂ : β ha✝ : (a₁ , b₁ ) .fst ≤ (a₂ , b₂ ) .fsthb : (a₁ , b₁ ) .snd ≤ (a₂ , b₂ ) .sndha : (a₁ , b₁ ) .fst < (a₂ , b₂ ) .fstmk.mk.intro.inr ↑toLex (a₁ , b₁ ) ≤ ↑toLex (a₂ , b₂ ) α : Type u_1β : Type u_2γ : Type ?u.18624inst✝¹ : PartialOrder α inst✝ : Preorder β a₁ : α b₁ : β a₂ : α b₂ : β ha✝ : (a₁ , b₁ ) .fst ≤ (a₂ , b₂ ) .fsthb : (a₁ , b₁ ) .snd ≤ (a₂ , b₂ ) .sndha : (a₁ , b₁ ) .fst < (a₂ , b₂ ) .fstmk.mk.intro.inr ↑toLex (a₁ , b₁ ) ≤ ↑toLex (a₂ , b₂ ) exact left : ∀ {α : Type ?u.18967} {β : Type ?u.18966} {ra : α → α → Prop } {rb : β → β → Prop } {a₁ : α } (b₁ : β ) {a₂ : α } (b₂ : β ),
ra a₁ a₂ → Prod.Lex ra rb (a₁ , b₁ ) (a₂ , b₂ ) left _ _ ha : (a₁ , b₁ ) .fst < (a₂ , b₂ ) .fstha
#align prod.lex.to_lex_mono Prod.Lex.toLex_mono
-- porting note: type class search sees right through the type synonrm for `α ×ₗ β` and uses the
-- `Preorder` structure for `α × β` instead
-- This is hopefully the same problems as in https://github.com/leanprover/lean4/issues/1891
-- and will be fixed in nightly-2022-11-30
theorem toLex_strictMono : @ StrictMono _ _ _ ( Prod.Lex.preorder α β ) ( toLex : α × β → α ×ₗ β ) := by
rintro ⟨ a₁ , b₁ ⟩ ⟨ a₂ , b₂ ⟩ h mk.mk ↑toLex (a₁ , b₁ ) < ↑toLex (a₂ , b₂ )
obtain : (a₁ , b₁ ) .fst = (a₂ , b₂ ) .fst ∨ (a₁ , b₁ ) .fst < (a₂ , b₂ ) .fstobtain rfl | ha : (a₁ , b₁ ) .fst < (a₂ , b₂ ) .fstha : a₁ = a₂ ∨ _ := h . le . 1 : ∀ {a b : Prop }, a ∧ b → a 1. eq_or_lt mk.mk.inl ↑toLex (a₁ , b₁ ) < ↑toLex (a₁ , b₂ ) mk.mk.inr ↑toLex (a₁ , b₁ ) < ↑toLex (a₂ , b₂ )
· mk.mk.inl ↑toLex (a₁ , b₁ ) < ↑toLex (a₁ , b₂ ) mk.mk.inl ↑toLex (a₁ , b₁ ) < ↑toLex (a₁ , b₂ ) mk.mk.inr ↑toLex (a₁ , b₁ ) < ↑toLex (a₂ , b₂ ) exact right : ∀ {α : Type ?u.19346} {β : Type ?u.19345} {ra : α → α → Prop } {rb : β → β → Prop } (a : α ) {b₁ b₂ : β },
rb b₁ b₂ → Prod.Lex ra rb (a , b₁ ) (a , b₂ ) right _ ( Prod.mk_lt_mk_iff_right : ∀ {α : Type ?u.19377} {β : Type ?u.19376} [inst : Preorder α ] [inst_1 : Preorder β ] {a : α } {b₁ b₂ : β },
(a , b₁ ) < (a , b₂ ) ↔ b₁ < b₂ Prod.mk_lt_mk_iff_right. 1 : ∀ {a b : Prop }, (a ↔ b ) → a → b 1 h )
· mk.mk.inr ↑toLex (a₁ , b₁ ) < ↑toLex (a₂ , b₂ ) mk.mk.inr ↑toLex (a₁ , b₁ ) < ↑toLex (a₂ , b₂ ) exact left : ∀ {α : Type ?u.19443} {β : Type ?u.19442} {ra : α → α → Prop } {rb : β → β → Prop } {a₁ : α } (b₁ : β ) {a₂ : α } (b₂ : β ),
ra a₁ a₂ → Prod.Lex ra rb (a₁ , b₁ ) (a₂ , b₂ ) left _ _ ha : (a₁ , b₁ ) .fst < (a₂ , b₂ ) .fstha
#align prod.lex.to_lex_strict_mono Prod.Lex.toLex_strictMono
end Preorder
/-- Dictionary / lexicographic partial order for pairs. -/
instance partialOrder ( α β : Type _ : Type (?u.19499+1) Type _) [ PartialOrder : Type ?u.19502 → Type ?u.19502 PartialOrder α ] [ PartialOrder : Type ?u.19505 → Type ?u.19505 PartialOrder β ] : PartialOrder : Type ?u.19508 → Type ?u.19508 PartialOrder ( α ×ₗ β ) :=
{ Prod.Lex.preorder α β with
le_antisymm := by
∀ (a b : Lex (α × β ) ), a ≤ b → b ≤ a → a = b haveI : IsStrictOrder α (· < ·) := { irrefl := lt_irrefl , trans := fun _ _ _ => lt_trans } ∀ (a b : Lex (α × β ) ), a ≤ b → b ≤ a → a = b
∀ (a b : Lex (α × β ) ), a ≤ b → b ≤ a → a = b haveI : IsAntisymm β (· ≤ ·) := ⟨ fun _ _ => le_antisymm ⟩ ∀ (a b : Lex (α × β ) ), a ≤ b → b ≤ a → a = b
∀ (a b : Lex (α × β ) ), a ≤ b → b ≤ a → a = b exact @ antisymm : ∀ {α : Type ?u.19814} {r : α → α → Prop } [inst : IsAntisymm α r ] {a b : α }, r a b → r b a → a = b antisymm _ ( Prod.Lex _ : ?m.19818 → ?m.19818 → Prop _ _ : ?m.19819 → ?m.19819 → Prop _) _ }
#align prod.lex.partial_order Prod.Lex.partialOrder
/-- Dictionary / lexicographic linear order for pairs. -/
instance linearOrder ( α β : Type _ : Type (?u.20075+1) Type _) [ LinearOrder : Type ?u.20078 → Type ?u.20078 LinearOrder α ] [ LinearOrder : Type ?u.20081 → Type ?u.20081 LinearOrder β ] : LinearOrder : Type ?u.20084 → Type ?u.20084 LinearOrder ( α ×ₗ β ) :=
{ Prod.Lex.partialOrder α β with
le_total := total_of : ∀ {α : Type ?u.20207} (r : α → α → Prop ) [inst : IsTotal α r ] (a b : α ), r a b ∨ r b a total_of ( Prod.Lex _ : ?m.20211 → ?m.20211 → Prop _ _ : ?m.20212 → ?m.20212 → Prop _),
decidableLE := Prod.Lex.decidable _ : ?m.20418 → ?m.20418 → Prop _ _ : ?m.20419 → ?m.20419 → Prop _,
decidableLT := Prod.Lex.decidable _ : ?m.20979 → ?m.20979 → Prop _ _ : ?m.20980 → ?m.20980 → Prop _,
decidableEq := Lex.decidableEq _ _ , }
#align prod.lex.linear_order Prod.Lex.linearOrder
instance orderBot [ PartialOrder : Type ?u.22069 → Type ?u.22069 PartialOrder α ] [ Preorder β ] [ OrderBot : (α : Type ?u.22075) → [inst : LE α ] → Type ?u.22075 OrderBot α ] [ OrderBot : (α : Type ?u.22096) → [inst : LE α ] → Type ?u.22096 OrderBot β ] : OrderBot : (α : Type ?u.22110) → [inst : LE α ] → Type ?u.22110 OrderBot ( α ×ₗ β ) where
bot := toLex ⊥
bot_le _ := toLex_mono bot_le : ∀ {α : Type ?u.22357} [inst : LE α ] [inst_1 : OrderBot α ] {a : α }, ⊥ ≤ a bot_le
#align prod.lex.order_bot Prod.Lex.orderBot
instance orderTop [ PartialOrder : Type ?u.22687 → Type ?u.22687 PartialOrder α ] [ Preorder β ] [ OrderTop : (α : Type ?u.22693) → [inst : LE α ] → Type ?u.22693 OrderTop α ] [ OrderTop : (α : Type ?u.22714) → [inst : LE α ] → Type ?u.22714 OrderTop β ] : OrderTop : (α : Type ?u.22728) → [inst : LE α ] → Type ?u.22728 OrderTop ( α ×ₗ β ) where
top := toLex ⊤
le_top _ := toLex_mono le_top : ∀ {α : Type ?u.22971} [inst : LE α ] [inst_1 : OrderTop α ] {a : α }, a ≤ ⊤ le_top
#align prod.lex.order_top Prod.Lex.orderTop
instance boundedOrder [ PartialOrder : Type ?u.23266 → Type ?u.23266 PartialOrder α ] [ Preorder β ] [ BoundedOrder : (α : Type ?u.23272) → [inst : LE α ] → Type ?u.23272 BoundedOrder α ] [ BoundedOrder : (α : Type ?u.23293) → [inst : LE α ] → Type ?u.23293 BoundedOrder β ] :
BoundedOrder : (α : Type ?u.23307) → [inst : LE α ] → Type ?u.23307 BoundedOrder ( α ×ₗ β ) :=
{ Lex.orderBot , Lex.orderTop with }
#align prod.lex.bounded_order Prod.Lex.boundedOrder
instance [ Preorder α ] [ Preorder β ] [ DenselyOrdered : (α : Type ?u.23979) → [inst : LT α ] → Prop DenselyOrdered α ] [ DenselyOrdered : (α : Type ?u.23993) → [inst : LT α ] → Prop DenselyOrdered β ] :
DenselyOrdered : (α : Type ?u.24007) → [inst : LT α ] → Prop DenselyOrdered ( α ×ₗ β ) where
dense := by
rintro _ _ (@⟨a₁, b₁, a₂, b₂, h⟩ | @⟨a, b₁, b₂, h⟩) : a₁✝ < a₂✝ (@⟨a₁, b₁, a₂, b₂, h⟩ | @⟨a, b₁, b₂, h⟩ : a₁✝ < a₂✝ @⟨a₁ @⟨a₁, b₁, a₂, b₂, h⟩ | @⟨a, b₁, b₂, h⟩ : a₁✝ < a₂✝ , b₁ @⟨a₁, b₁, a₂, b₂, h⟩ | @⟨a, b₁, b₂, h⟩ : a₁✝ < a₂✝ , a₂ @⟨a₁, b₁, a₂, b₂, h⟩ | @⟨a, b₁, b₂, h⟩ : a₁✝ < a₂✝ , b₂ @⟨a₁, b₁, a₂, b₂, h⟩ | @⟨a, b₁, b₂, h⟩ : a₁✝ < a₂✝ , h @⟨a₁, b₁, a₂, b₂, h⟩ | @⟨a, b₁, b₂, h⟩ : a₁✝ < a₂✝ ⟩ | @⟨a @⟨a₁, b₁, a₂, b₂, h⟩ | @⟨a, b₁, b₂, h⟩ : a₁✝ < a₂✝ , b₁ @⟨a₁, b₁, a₂, b₂, h⟩ | @⟨a, b₁, b₂, h⟩ : a₁✝ < a₂✝ , b₂ @⟨a₁, b₁, a₂, b₂, h⟩ | @⟨a, b₁, b₂, h⟩ : a₁✝ < a₂✝ , h @⟨a₁, b₁, a₂, b₂, h⟩ | @⟨a, b₁, b₂, h⟩ : a₁✝ < a₂✝ ⟩(@⟨a₁, b₁, a₂, b₂, h⟩ | @⟨a, b₁, b₂, h⟩) : a₁✝ < a₂✝ )left ∃ a , (a₁ , b₁ ) < a ∧ a < (a₂ , b₂ ) right ∃ a_1 , (a , b₁ ) < a_1 ∧ a_1 < (a , b₂ )
· left ∃ a , (a₁ , b₁ ) < a ∧ a < (a₂ , b₂ ) left ∃ a , (a₁ , b₁ ) < a ∧ a < (a₂ , b₂ ) right ∃ a_1 , (a , b₁ ) < a_1 ∧ a_1 < (a , b₂ ) obtain ⟨c, h₁, h₂⟩ : ∃ a , a₁ < a ∧ a < a₂ ⟨c ⟨c, h₁, h₂⟩ : ∃ a , a₁ < a ∧ a < a₂ , h₁ ⟨c, h₁, h₂⟩ : ∃ a , a₁ < a ∧ a < a₂ , h₂ ⟨c, h₁, h₂⟩ : ∃ a , a₁ < a ∧ a < a₂ ⟩ := exists_between h left.intro.intro ∃ a , (a₁ , b₁ ) < a ∧ a < (a₂ , b₂ )
left ∃ a , (a₁ , b₁ ) < a ∧ a < (a₂ , b₂ ) exact ⟨( c , b₁ ), left : ∀ {α : Type ?u.24383} {β : Type ?u.24382} {ra : α → α → Prop } {rb : β → β → Prop } {a₁ : α } (b₁ : β ) {a₂ : α } (b₂ : β ),
ra a₁ a₂ → Prod.Lex ra rb (a₁ , b₁ ) (a₂ , b₂ ) left _ _ h₁ , left : ∀ {α : Type ?u.24405} {β : Type ?u.24404} {ra : α → α → Prop } {rb : β → β → Prop } {a₁ : α } (b₁ : β ) {a₂ : α } (b₂ : β ),
ra a₁ a₂ → Prod.Lex ra rb (a₁ , b₁ ) (a₂ , b₂ ) left _ _ h₂ ⟩
· right ∃ a_1 , (a , b₁ ) < a_1 ∧ a_1 < (a , b₂ ) right ∃ a_1 , (a , b₁ ) < a_1 ∧ a_1 < (a , b₂ ) obtain ⟨c, h₁, h₂⟩ : ∃ a , b₁ < a ∧ a < b₂ ⟨c ⟨c, h₁, h₂⟩ : ∃ a , b₁ < a ∧ a < b₂ , h₁ ⟨c, h₁, h₂⟩ : ∃ a , b₁ < a ∧ a < b₂ , h₂ ⟨c, h₁, h₂⟩ : ∃ a , b₁ < a ∧ a < b₂ ⟩ := exists_between h right.intro.intro ∃ a_1 , (a , b₁ ) < a_1 ∧ a_1 < (a , b₂ )
right ∃ a_1 , (a , b₁ ) < a_1 ∧ a_1 < (a , b₂ ) exact ⟨( a , c ), right : ∀ {α : Type ?u.24508} {β : Type ?u.24507} {ra : α → α → Prop } {rb : β → β → Prop } (a : α ) {b₁ b₂ : β },
rb b₁ b₂ → Prod.Lex ra rb (a , b₁ ) (a , b₂ ) right _ h₁ , right : ∀ {α : Type ?u.24525} {β : Type ?u.24524} {ra : α → α → Prop } {rb : β → β → Prop } (a : α ) {b₁ b₂ : β },
rb b₁ b₂ → Prod.Lex ra rb (a , b₁ ) (a , b₂ ) right _ h₂ ⟩
instance noMaxOrder_of_left [ Preorder α ] [ Preorder β ] [ NoMaxOrder : (α : Type ?u.24669) → [inst : LT α ] → Prop NoMaxOrder α ] : NoMaxOrder : (α : Type ?u.24683) → [inst : LT α ] → Prop NoMaxOrder ( α ×ₗ β ) where
exists_gt := by
rintro ⟨ a , b ⟩
obtain ⟨ c , h ⟩ := exists_gt a
exact ⟨⟨ c , b ⟩, left : ∀ {α : Type ?u.24838} {β : Type ?u.24837} {ra : α → α → Prop } {rb : β → β → Prop } {a₁ : α } (b₁ : β ) {a₂ : α } (b₂ : β ),
ra a₁ a₂ → Prod.Lex ra rb (a₁ , b₁ ) (a₂ , b₂ ) left _ _ h ⟩
#align prod.lex.no_max_order_of_left Prod.Lex.noMaxOrder_of_left
instance noMinOrder_of_left [ Preorder α ] [ Preorder β ] [ NoMinOrder : (α : Type ?u.24938) → [inst : LT α ] → Prop NoMinOrder α ] : NoMinOrder : (α : Type ?u.24952) → [inst : LT α ] → Prop NoMinOrder ( α ×ₗ β ) where
exists_lt := by
rintro ⟨ a , b ⟩
obtain ⟨ c , h ⟩ := exists_lt a
exact ⟨⟨ c , b ⟩, left : ∀ {α : Type ?u.25107} {β : Type ?u.25106} {ra : α → α → Prop } {rb : β → β → Prop } {a₁ : α } (b₁ : β ) {a₂ : α } (b₂ : β ),
ra a₁ a₂ → Prod.Lex ra rb (a₁ , b₁ ) (a₂ , b₂ ) left _ _ h ⟩
#align prod.lex.no_min_order_of_left Prod.Lex.noMinOrder_of_left
instance noMaxOrder_of_right [ Preorder α ] [ Preorder β ] [ NoMaxOrder : (α : Type ?u.25207) → [inst : LT α ] → Prop NoMaxOrder β ] : NoMaxOrder : (α : Type ?u.25221) → [inst : LT α ] → Prop NoMaxOrder ( α ×ₗ β ) where
exists_gt := by
rintro ⟨ a , b ⟩
obtain ⟨ c , h ⟩ := exists_gt b
exact ⟨⟨ a , c ⟩, right : ∀ {α : Type ?u.25376} {β : Type ?u.25375} {ra : α → α → Prop } {rb : β → β → Prop } (a : α ) {b₁ b₂ : β },
rb b₁ b₂ → Prod.Lex ra rb (a , b₁ ) (a , b₂ ) right _ h ⟩
#align prod.lex.no_max_order_of_right Prod.Lex.noMaxOrder_of_right
instance noMinOrder_of_right [ Preorder α ] [ Preorder β ] [ NoMinOrder : (α : Type ?u.25475) → [inst : LT α ] → Prop NoMinOrder β ] : NoMinOrder : (α : Type ?u.25489) → [inst : LT α ] → Prop NoMinOrder ( α ×ₗ β ) where
exists_lt := by
rintro ⟨ a , b ⟩
obtain ⟨ c , h ⟩ := exists_lt b
exact ⟨⟨ a , c ⟩, right : ∀ {α : Type ?u.25644} {β : Type ?u.25643} {ra : α → α → Prop } {rb : β → β → Prop } (a : α ) {b₁ b₂ : β },
rb b₁ b₂ → Prod.Lex ra rb (a , b₁ ) (a , b₂ ) right _ h ⟩
#align prod.lex.no_min_order_of_right Prod.Lex.noMinOrder_of_right
end Prod.Lex