feat(library/data/fin): add more fin definition and lemmas
This commit is contained in:
parent
516333ad65
commit
9d523bae6b
1 changed files with 25 additions and 3 deletions
|
@ -91,6 +91,9 @@ end pigeonhole
|
|||
definition zero (n : nat) : fin (succ n) :=
|
||||
mk 0 !zero_lt_succ
|
||||
|
||||
definition mk_mod [reducible] (n i : nat) : fin (succ n) :=
|
||||
mk (i mod (succ n)) (mod_lt _ !zero_lt_succ)
|
||||
|
||||
variable {n : nat}
|
||||
|
||||
theorem val_lt : ∀ i : fin n, val i < n
|
||||
|
@ -108,8 +111,19 @@ mk n !lt_succ_self
|
|||
theorem val_lift : ∀ (i : fin n) (m : nat), val i = val (lift i m)
|
||||
| (mk v h) m := rfl
|
||||
|
||||
lemma mk_succ_ne_zero {i : nat} : ∀ {P}, mk (succ i) P ≠ zero n :=
|
||||
assume P Pe, absurd (veq_of_eq Pe) !succ_ne_zero
|
||||
|
||||
lemma mk_mod_eq {i : fin (succ n)} : i = mk_mod n i :=
|
||||
eq_of_veq begin rewrite [↑mk_mod, mod_eq_of_lt !is_lt] end
|
||||
|
||||
lemma mk_mod_of_lt {i : nat} (Plt : i < succ n) : mk_mod n i = mk i Plt :=
|
||||
begin esimp [mk_mod], congruence, exact mod_eq_of_lt Plt end
|
||||
|
||||
section lift_lower
|
||||
|
||||
lemma lift_zero : lift_succ (zero n) = zero (succ n) := rfl
|
||||
|
||||
lemma ne_max_of_lt_max {i : fin (succ n)} : i < n → i ≠ maxi :=
|
||||
by intro hlt he; substvars; exact absurd hlt (lt.irrefl n)
|
||||
|
||||
|
@ -196,6 +210,9 @@ section madd
|
|||
definition madd (i j : fin (succ n)) : fin (succ n) :=
|
||||
mk ((i + j) mod (succ n)) (mod_lt _ !zero_lt_succ)
|
||||
|
||||
definition minv : ∀ i : fin (succ n), fin (succ n)
|
||||
| (mk iv ilt) := mk ((succ n - iv) mod succ n) (mod_lt _ !zero_lt_succ)
|
||||
|
||||
lemma val_madd : ∀ i j : fin (succ n), val (madd i j) = (i + j) mod (succ n)
|
||||
| (mk iv ilt) (mk jv jlt) := by esimp
|
||||
|
||||
|
@ -208,12 +225,12 @@ take j₁ j₂, fin.destruct j₁ (fin.destruct j₂ (λ jv₁ jlt₁ jv₂ jlt
|
|||
apply mod_eq_mod_of_add_mod_eq_add_mod_left Peq
|
||||
end))
|
||||
|
||||
lemma madd_mk_mod {i j : nat} : madd (mk_mod n i) (mk_mod n j) = mk_mod n (i+j) :=
|
||||
eq_of_veq begin esimp [madd, mk_mod], rewrite [ mod_add_mod, add_mod_mod ] end
|
||||
|
||||
lemma val_mod : ∀ i : fin (succ n), (val i) mod (succ n) = val i
|
||||
| (mk iv ilt) := by esimp; rewrite [(mod_eq_of_lt ilt)]
|
||||
|
||||
definition minv : ∀ i : fin (succ n), fin (succ n)
|
||||
| (mk iv ilt) := mk ((succ n - iv) mod succ n) (mod_lt _ !zero_lt_succ)
|
||||
|
||||
lemma madd_comm (i j : fin (succ n)) : madd i j = madd j i :=
|
||||
by apply eq_of_veq; rewrite [*val_madd, add.comm (val i)]
|
||||
|
||||
|
@ -255,6 +272,11 @@ definition succ : fin n → fin (succ n)
|
|||
lemma val_succ : ∀ (i : fin n), val (succ i) = nat.succ (val i)
|
||||
| (mk v h) := rfl
|
||||
|
||||
lemma succ_max : fin.succ maxi = (@maxi (nat.succ n)) := rfl
|
||||
|
||||
lemma lift_succ.comm : lift_succ ∘ (@succ n) = succ ∘ lift_succ :=
|
||||
funext take i, eq_of_veq (begin rewrite [↑lift_succ, -val_lift, *val_succ, -val_lift] end)
|
||||
|
||||
definition elim0 {C : fin 0 → Type} : Π i : fin 0, C i
|
||||
| (mk v h) := absurd h !not_lt_zero
|
||||
|
||||
|
|
Loading…
Reference in a new issue