@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Floris van Doorn, Yury Kudryashov, Sébastien Gouëzel, Chris Hughes
5
5
-/
6
6
import Mathlib.Data.Fin.VecNotation
7
+ import Mathlib.Logic.Equiv.Fin
7
8
import Mathlib.Order.Fin.Basic
8
9
import Mathlib.Order.Interval.Set.Basic
9
10
import Mathlib.Order.PiLex
@@ -111,3 +112,64 @@ lemma Antitone.vecCons (hf : Antitone f) (ha : f 0 ≤ a) : Antitone (vecCons a
111
112
#align antitone.vec_cons Antitone.vecCons
112
113
113
114
example : Monotone ![1 , 2 , 2 , 3 ] := by decide
115
+
116
+
117
+ variable {n : ℕ}
118
+
119
+ /-- `Π i : Fin 2, α i` is order equivalent to `α 0 × α 1`. See also `OrderIso.finTwoArrowEquiv`
120
+ for a non-dependent version. -/
121
+ def OrderIso.piFinTwoIso (α : Fin 2 → Type *) [∀ i, Preorder (α i)] : (∀ i, α i) ≃o α 0 × α 1 where
122
+ toEquiv := piFinTwoEquiv α
123
+ map_rel_iff' := Iff.symm Fin.forall_fin_two
124
+ #align order_iso.pi_fin_two_iso OrderIso.piFinTwoIso
125
+
126
+ /-- The space of functions `Fin 2 → α` is order equivalent to `α × α`. See also
127
+ `OrderIso.piFinTwoIso`. -/
128
+ def OrderIso.finTwoArrowIso (α : Type *) [Preorder α] : (Fin 2 → α) ≃o α × α :=
129
+ { OrderIso.piFinTwoIso fun _ => α with toEquiv := finTwoArrowEquiv α }
130
+ #align order_iso.fin_two_arrow_iso OrderIso.finTwoArrowIso
131
+
132
+ /-- Order isomorphism between `Π j : Fin (n + 1), α j` and
133
+ `α i × Π j : Fin n, α (Fin.succAbove i j)`. -/
134
+ def OrderIso.piFinSuccAboveIso (α : Fin (n + 1 ) → Type *) [∀ i, LE (α i)]
135
+ (i : Fin (n + 1 )) : (∀ j, α j) ≃o α i × ∀ j, α (i.succAbove j) where
136
+ toEquiv := Equiv.piFinSuccAbove α i
137
+ map_rel_iff' := Iff.symm i.forall_iff_succAbove
138
+ #align order_iso.pi_fin_succ_above_iso OrderIso.piFinSuccAboveIso
139
+
140
+ /-- `Fin.succAbove` as an order isomorphism between `Fin n` and `{x : Fin (n + 1) // x ≠ p}`. -/
141
+ def finSuccAboveOrderIso (p : Fin (n + 1 )) : Fin n ≃o { x : Fin (n + 1 ) // x ≠ p } where
142
+ __ := finSuccAboveEquiv p
143
+ map_rel_iff' := p.succAboveOrderEmb.map_rel_iff'
144
+ #align fin_succ_above_equiv finSuccAboveOrderIso
145
+
146
+ lemma finSuccAboveOrderIso_apply (p : Fin (n + 1 )) (i : Fin n) :
147
+ finSuccAboveOrderIso p i = ⟨p.succAbove i, p.succAbove_ne i⟩ := rfl
148
+ #align fin_succ_above_equiv_apply finSuccAboveOrderIso_apply
149
+
150
+ lemma finSuccAboveOrderIso_symm_apply_last (x : { x : Fin (n + 1 ) // x ≠ Fin.last n }) :
151
+ (finSuccAboveOrderIso (Fin.last n)).symm x = Fin.castLT x.1 (Fin.val_lt_last x.2 ) := by
152
+ rw [← Option.some_inj]
153
+ simpa [finSuccAboveOrderIso, finSuccAboveEquiv, OrderIso.symm]
154
+ using finSuccEquiv'_last_apply x.property
155
+ #align fin_succ_above_equiv_symm_apply_last finSuccAboveEquiv_symm_apply_last
156
+
157
+ lemma finSuccAboveOrderIso_symm_apply_ne_last {p : Fin (n + 1 )} (h : p ≠ Fin.last n)
158
+ (x : { x : Fin (n + 1 ) // x ≠ p }) :
159
+ (finSuccAboveEquiv p).symm x = (p.castLT (Fin.val_lt_last h)).predAbove x := by
160
+ rw [← Option.some_inj]
161
+ simpa [finSuccAboveEquiv, OrderIso.symm] using finSuccEquiv'_ne_last_apply h x.property
162
+ #align fin_succ_above_equiv_symm_apply_ne_last finSuccAboveEquiv_symm_apply_ne_last
163
+
164
+ /-- Promote a `Fin n` into a larger `Fin m`, as a subtype where the underlying
165
+ values are retained. This is the `OrderIso` version of `Fin.castLE`. -/
166
+ @[simps apply symm_apply]
167
+ def Fin.castLEOrderIso {n m : ℕ} (h : n ≤ m) : Fin n ≃o { i : Fin m // (i : ℕ) < n } where
168
+ toFun i := ⟨Fin.castLE h i, by simp⟩
169
+ invFun i := ⟨i, i.prop⟩
170
+ left_inv _ := by simp
171
+ right_inv _ := by simp
172
+ map_rel_iff' := by simp [(strictMono_castLE h).le_iff_le]
173
+ #align fin.cast_le_order_iso Fin.castLEOrderIso
174
+ #align fin.cast_le_order_iso_apply Fin.castLEOrderIso_apply
175
+ #align fin.cast_le_order_iso_symm_apply Fin.castLEOrderIso_symm_apply
0 commit comments