lean4-htt/library/init/data/fin/basic.lean
2019-03-21 15:06:44 -07:00

104 lines
3 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
-/
prelude
import init.data.nat.div init.data.nat.bitwise
open Nat
structure Fin (n : Nat) := (val : Nat) (isLt : val < n)
attribute [ppAnonymousCtor] Fin
namespace Fin
protected def lt {n} (a b : Fin n) : Prop :=
a.val < b.val
protected def le {n} (a b : Fin n) : Prop :=
a.val ≤ b.val
instance {n} : HasLt (Fin n) := ⟨Fin.lt⟩
instance {n} : HasLe (Fin n) := ⟨Fin.le⟩
instance decLt {n} (a b : Fin n) : Decidable (a < b) :=
Nat.decLt _ _
instance decLe {n} (a b : Fin n) : Decidable (a ≤ b) :=
Nat.decLe _ _
def {u} elim0 {α : Sort u} : Fin 0 → α
| ⟨_, h⟩ := absurd h (notLtZero _)
variable {n : Nat}
def ofNat {n : Nat} (a : Nat) : Fin (succ n) :=
⟨a % succ n, Nat.modLt _ (Nat.zeroLtSucc _)⟩
private theorem mlt {n b : Nat} : ∀ {a}, n > a → b % n < n
| 0 h := Nat.modLt _ h
| (a+1) h :=
have n > 0, from Nat.ltTrans (Nat.zeroLtSucc _) h,
Nat.modLt _ this
protected def add : Fin n → Fin n → Fin n
| ⟨a, h⟩ ⟨b, _⟩ := ⟨(a + b) % n, mlt h⟩
protected def mul : Fin n → Fin n → Fin n
| ⟨a, h⟩ ⟨b, _⟩ := ⟨(a * b) % n, mlt h⟩
protected def sub : Fin n → Fin n → Fin n
| ⟨a, h⟩ ⟨b, _⟩ := ⟨(a + (n - b)) % n, mlt h⟩
/-
Remark: mod/div/modn/land/lor can be defined without using (% n), but
we are trying to minimize the number of Nat theorems
needed to boostrap Lean.
-/
protected def mod : Fin n → Fin n → Fin n
| ⟨a, h⟩ ⟨b, _⟩ := ⟨(a % b) % n, mlt h⟩
protected def div : Fin n → Fin n → Fin n
| ⟨a, h⟩ ⟨b, _⟩ := ⟨(a / b) % n, mlt h⟩
protected def modn : Fin n → Nat → Fin n
| ⟨a, h⟩ m := ⟨(a % m) % n, mlt h⟩
def land : Fin n → Fin n → Fin n
| ⟨a, h⟩ ⟨b, _⟩ := ⟨(Nat.land a b) % n, mlt h⟩
def lor : Fin n → Fin n → Fin n
| ⟨a, h⟩ ⟨b, _⟩ := ⟨(Nat.lor a b) % n, mlt h⟩
instance : HasZero (Fin (succ n)) := ⟨⟨0, succPos n⟩⟩
instance : HasOne (Fin (succ n)) := ⟨ofNat 1⟩
instance : HasAdd (Fin n) := ⟨Fin.add⟩
instance : HasSub (Fin n) := ⟨Fin.sub⟩
instance : HasMul (Fin n) := ⟨Fin.mul⟩
instance : HasMod (Fin n) := ⟨Fin.mod⟩
instance : HasDiv (Fin n) := ⟨Fin.div⟩
instance : HasModn (Fin n) := ⟨Fin.modn⟩
theorem eqOfVeq : ∀ {i j : Fin n}, (val i) = (val j) → i = j
| ⟨iv, ilt₁⟩ ⟨.(iv), ilt₂⟩ rfl := rfl
theorem veqOfEq : ∀ {i j : Fin n}, i = j → (val i) = (val j)
| ⟨iv, ilt⟩ .(_) rfl := rfl
theorem neOfVne {i j : Fin n} (h : val i ≠ val j) : i ≠ j :=
λ h', absurd (veqOfEq h') h
theorem vneOfNe {i j : Fin n} (h : i ≠ j) : val i ≠ val j :=
λ h', absurd (eqOfVeq h') h
theorem modnLt : ∀ {m : Nat} (i : Fin n), m > 0 → (i %ₙ m).val < m
| m ⟨a, h⟩ hp := Nat.ltOfLeOfLt (modLe _ _) (modLt _ hp)
end Fin
open Fin
instance (n : Nat) : DecidableEq (Fin n) :=
{decEq := λ i j, decidableOfDecidableOfIff
(decEq i.val j.val) ⟨eqOfVeq, veqOfEq⟩}