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) 2022 Eric Rodriguez. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Rodriguez
! This file was ported from Lean 3 source module data.fin.succ_pred
! leanprover-community/mathlib commit 7c523cb78f4153682c2929e3006c863bfef463d0
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Data.Fin.Basic
import Mathlib.Order.SuccPred.Basic
/-!
# Successors and predecessors of `Fin n`
In this file, we show that `Fin n` is both a `SuccOrder` and a `PredOrder`. Note that they are
also archimedean, but this is derived from the general instance for well-orderings as opposed
to a specific `Fin` instance.
-/
namespace Fin
instance : ∀ { n : ℕ }, SuccOrder ( Fin n )
| 0 => by constructor
le_succ ∀ (a : Fin 0 ), a ≤ ?succ a
max_of_succ_le
succ_le_of_lt ∀ {a b : Fin 0 }, a < b → ?succ a ≤ b
le_of_lt_succ ∀ {a b : Fin 0 }, a < ?succ b → a ≤ b
succ <;>
le_succ ∀ (a : Fin 0 ), a ≤ ?succ a
max_of_succ_le
succ_le_of_lt ∀ {a b : Fin 0 }, a < b → ?succ a ≤ b
le_of_lt_succ ∀ {a b : Fin 0 }, a < ?succ b → a ≤ b
succ first | assumption
le_succ ∀ (a : Fin 0 ), a ≤ ?succ a | intro a succ_le_of_lt ∀ {b : Fin 0 }, a < b → ?succ a ≤ b ; le_of_lt_succ ∀ {b : Fin 0 }, a < ?succ b → a ≤ b
succ_le_of_lt ∀ {a b : Fin 0 }, a < b → ?succ a ≤ b exact elim0 : ∀ {α : Sort ?u.433}, Fin 0 → α elim0 a
| n + 1 =>
SuccOrder.ofCore ( fun i => if i < Fin.last : (n : ℕ ) → Fin (n + 1 ) Fin.last n then i + 1 else i )
( by
intro a ha b
rw [ isMax_iff_eq_top , eq_top_iff , not_le , top_eq_last ] at ha
dsimp
rw [ if_pos : ∀ {c : Prop } {h : Decidable c }, c → ∀ {α : Sort ?u.922} {t e : α }, (if c then t else e ) = t if_pos ha , lt_iff_val_lt_val : ∀ {n : ℕ } {a b : Fin n }, a < b ↔ ↑a < ↑b lt_iff_val_lt_val, le_iff_val_le_val : ∀ {n : ℕ } {a b : Fin n }, a ≤ b ↔ ↑a ≤ ↑b le_iff_val_le_val, val_add_one_of_lt ha ]
exact Nat.lt_iff_add_one_le : ∀ {m n : ℕ }, m < n ↔ m + 1 ≤ n Nat.lt_iff_add_one_le)
( by
intro a ha (fun i => if i < last n then i + 1 else i ) a = a
rw [ (fun i => if i < last n then i + 1 else i ) a = a isMax_iff_eq_top , (fun i => if i < last n then i + 1 else i ) a = a (fun i => if i < last n then i + 1 else i ) a = a top_eq_last (fun i => if i < last n then i + 1 else i ) a = a ] (fun i => if i < last n then i + 1 else i ) a = a at ha (fun i => if i < last n then i + 1 else i ) a = a
dsimp
rw [ if_neg : ∀ {c : Prop } {h : Decidable c }, ¬ c → ∀ {α : Sort ?u.1173} {t e : α }, (if c then t else e ) = e if_neg ha . not_lt ] )
@[ simp ]
theorem succ_eq : ∀ {n : ℕ }, SuccOrder.succ = fun a => if a < last n then a + 1 else a succ_eq { n : ℕ } : SuccOrder.succ = fun a => if a < Fin.last : (n : ℕ ) → Fin (n + 1 ) Fin.last n then a + 1 else a :=
rfl : ∀ {α : Sort ?u.2074} {a : α }, a = a rfl
#align fin.succ_eq Fin.succ_eq : ∀ {n : ℕ }, SuccOrder.succ = fun a => if a < last n then a + 1 else a Fin.succ_eq
@[ simp ]
theorem succ_apply { n : ℕ } ( a ) : SuccOrder.succ a = if a < Fin.last : (n : ℕ ) → Fin (n + 1 ) Fin.last n then a + 1 else a :=
rfl : ∀ {α : Sort ?u.2355} {a : α }, a = a rfl
#align fin.succ_apply Fin.succ_apply
instance : ∀ { n : ℕ }, PredOrder ( Fin n )
| 0 => by constructor
pred_le ∀ (a : Fin 0 ), ?pred a ≤ a
min_of_le_pred
le_pred_of_lt ∀ {a b : Fin 0 }, a < b → a ≤ ?pred b
le_of_pred_lt ∀ {a b : Fin 0 }, ?pred a < b → a ≤ b
pred <;>
pred_le ∀ (a : Fin 0 ), ?pred a ≤ a
min_of_le_pred
le_pred_of_lt ∀ {a b : Fin 0 }, a < b → a ≤ ?pred b
le_of_pred_lt ∀ {a b : Fin 0 }, ?pred a < b → a ≤ b
pred first |
le_of_pred_lt ∀ {a b : Fin 0 }, ?pred a < b → a ≤ b assumption |
le_of_pred_lt ∀ {a b : Fin 0 }, ?pred a < b → a ≤ b intro a ; le_pred_of_lt ∀ {b : Fin 0 }, a < b → a ≤ ?pred b exact elim0 : ∀ {α : Sort ?u.2842}, Fin 0 → α elim0 a
| n + 1 =>
PredOrder.ofCore ( fun x => if x = 0 then 0 else x - 1 )
( by
∀ {a : Fin (n + 1 ) }, ¬ IsMin a → ∀ (b : Fin (n + 1 ) ), b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a intro a ha b b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a
∀ {a : Fin (n + 1 ) }, ¬ IsMin a → ∀ (b : Fin (n + 1 ) ), b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a rw [ b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a isMin_iff_eq_bot , b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a eq_bot_iff , b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a not_le , b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a bot_eq_zero : ∀ (n : ℕ ), ⊥ = 0 bot_eq_zerob ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a ] b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a at ha b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a
∀ {a : Fin (n + 1 ) }, ¬ IsMin a → ∀ (b : Fin (n + 1 ) ), b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a dsimp (b ≤ if a = 0 then 0 else a - 1 ) ↔ b < a
∀ {a : Fin (n + 1 ) }, ¬ IsMin a → ∀ (b : Fin (n + 1 ) ), b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a rw [ (b ≤ if a = 0 then 0 else a - 1 ) ↔ b < a if_neg : ∀ {c : Prop } {h : Decidable c }, ¬ c → ∀ {α : Sort ?u.3354} {t e : α }, (if c then t else e ) = e if_neg ha . ne' , (b ≤ if a = 0 then 0 else a - 1 ) ↔ b < a lt_iff_val_lt_val : ∀ {n : ℕ } {a b : Fin n }, a < b ↔ ↑a < ↑b lt_iff_val_lt_val, (b ≤ if a = 0 then 0 else a - 1 ) ↔ b < a le_iff_val_le_val : ∀ {n : ℕ } {a b : Fin n }, a ≤ b ↔ ↑a ≤ ↑b le_iff_val_le_val, (b ≤ if a = 0 then 0 else a - 1 ) ↔ b < a coe_sub_one : ∀ {n : ℕ } (a : Fin (n + 1 ) ), ↑(a - 1 ) = if a = 0 then n else ↑a - 1 coe_sub_one, (↑b ≤ if a = 0 then n else ↑a - 1 ) ↔ ↑b < ↑a (b ≤ if a = 0 then 0 else a - 1 ) ↔ b < a if_neg : ∀ {c : Prop } {h : Decidable c }, ¬ c → ∀ {α : Sort ?u.3462} {t e : α }, (if c then t else e ) = e if_neg ha . ne' ,
(b ≤ if a = 0 then 0 else a - 1 ) ↔ b < a le_tsub_iff_right , (b ≤ if a = 0 then 0 else a - 1 ) ↔ b < a Iff.comm : ∀ {a b : Prop }, (a ↔ b ) ↔ (b ↔ a ) Iff.comm]
∀ {a : Fin (n + 1 ) }, ¬ IsMin a → ∀ (b : Fin (n + 1 ) ), b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a exact Nat.lt_iff_add_one_le : ∀ {m n : ℕ }, m < n ↔ m + 1 ≤ n Nat.lt_iff_add_one_le
∀ {a : Fin (n + 1 ) }, ¬ IsMin a → ∀ (b : Fin (n + 1 ) ), b ≤ (fun x => if x = 0 then 0 else x - 1 ) a ↔ b < a exact ha )
( by
∀ (a : Fin (n + 1 ) ), IsMin a → (fun x => if x = 0 then 0 else x - 1 ) a = a intro a ha (fun x => if x = 0 then 0 else x - 1 ) a = a
∀ (a : Fin (n + 1 ) ), IsMin a → (fun x => if x = 0 then 0 else x - 1 ) a = a rw [ (fun x => if x = 0 then 0 else x - 1 ) a = a isMin_iff_eq_bot , (fun x => if x = 0 then 0 else x - 1 ) a = a (fun x => if x = 0 then 0 else x - 1 ) a = a bot_eq_zero : ∀ (n : ℕ ), ⊥ = 0 bot_eq_zero(fun x => if x = 0 then 0 else x - 1 ) a = a ] (fun x => if x = 0 then 0 else x - 1 ) a = a at ha (fun x => if x = 0 then 0 else x - 1 ) a = a
∀ (a : Fin (n + 1 ) ), IsMin a → (fun x => if x = 0 then 0 else x - 1 ) a = a dsimp (if a = 0 then 0 else a - 1 ) = a
∀ (a : Fin (n + 1 ) ), IsMin a → (fun x => if x = 0 then 0 else x - 1 ) a = a rwa [ (if a = 0 then 0 else a - 1 ) = a if_pos : ∀ {c : Prop } {h : Decidable c }, c → ∀ {α : Sort ?u.4261} {t e : α }, (if c then t else e ) = t if_pos ha , (if a = 0 then 0 else a - 1 ) = a eq_comm : ∀ {α : Sort ?u.4270} {a b : α }, a = b ↔ b = a eq_comm] )
@[ simp ]
theorem pred_eq : ∀ {n : ℕ }, PredOrder.pred = fun a => if a = 0 then 0 else a - 1 pred_eq { n } : PredOrder.pred = fun a : Fin ( n + 1 ) => if a = 0 then 0 else a - 1 :=
rfl : ∀ {α : Sort ?u.5331} {a : α }, a = a rfl
#align fin.pred_eq Fin.pred_eq : ∀ {n : ℕ }, PredOrder.pred = fun a => if a = 0 then 0 else a - 1 Fin.pred_eq
@[ simp ]
theorem pred_apply { n : ℕ } ( a : Fin ( n + 1 )) : PredOrder.pred a = if a = 0 then 0 else a - 1 :=
rfl : ∀ {α : Sort ?u.5663} {a : α }, a = a rfl
#align fin.pred_apply Fin.pred_apply
end Fin