Fin.agda 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. module Fin where
  2. import Nat
  3. import Bool
  4. open Nat hiding (_==_; _<_)
  5. open Bool
  6. data FZero : Set where
  7. data FSuc (A : Set) : Set where
  8. fz : FSuc A
  9. fs : A -> FSuc A
  10. mutual
  11. Fin' : Nat -> Set
  12. Fin' zero = FZero
  13. Fin' (suc n) = FSuc (Fin n)
  14. data Fin (n : Nat) : Set where
  15. fin : Fin' n -> Fin n
  16. fzero : {n : Nat} -> Fin (suc n)
  17. fzero = fin fz
  18. fsuc : {n : Nat} -> Fin n -> Fin (suc n)
  19. fsuc n = fin (fs n)
  20. _==_ : {n : Nat} -> Fin n -> Fin n -> Bool
  21. _==_ {zero} (fin ()) (fin ())
  22. _==_ {suc n} (fin fz) (fin fz) = true
  23. _==_ {suc n} (fin (fs i)) (fin (fs j)) = i == j
  24. _==_ {suc n} (fin fz) (fin (fs j)) = false
  25. _==_ {suc n} (fin (fs i)) (fin fz) = false
  26. subst : {n : Nat}{i j : Fin n} -> (P : Fin n -> Set) -> IsTrue (i == j) -> P i -> P j
  27. subst {zero} {fin ()} {fin ()} P _ _
  28. subst {suc n} {fin fz} {fin fz} P eq pi = pi
  29. subst {suc n} {fin (fs i)} {fin (fs j)} P eq pi = subst (\z -> P (fsuc z)) eq pi
  30. subst {suc n} {fin fz} {fin (fs j)} P () _
  31. subst {suc n} {fin (fs i)} {fin fz} P () _
  32. _<_ : {n : Nat} -> Fin n -> Fin n -> Bool
  33. _<_ {zero} (fin ()) (fin ())
  34. _<_ {suc n} _ (fin fz) = false
  35. _<_ {suc n} (fin fz) (fin (fs j)) = true
  36. _<_ {suc n} (fin (fs i)) (fin (fs j)) = i < j
  37. fromNat : (n : Nat) -> Fin (suc n)
  38. fromNat zero = fzero
  39. fromNat (suc n) = fsuc (fromNat n)
  40. liftSuc : {n : Nat} -> Fin n -> Fin (suc n)
  41. liftSuc {zero} (fin ())
  42. liftSuc {suc n} (fin fz) = fin fz
  43. liftSuc {suc n} (fin (fs i)) = fsuc (liftSuc i)
  44. lift+ : {n : Nat}(m : Nat) -> Fin n -> Fin (m + n)
  45. lift+ zero i = i
  46. lift+ (suc m) i = liftSuc (lift+ m i)