Fin.agda 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. module Data.Fin where
  2. open import Data.Nat hiding (_==_; _<_)
  3. open import Data.Bool
  4. open import Logic.Identity
  5. open import Logic.Base
  6. data Fin : Nat -> Set where
  7. fzero : {n : Nat} -> Fin (suc n)
  8. fsuc : {n : Nat} -> Fin n -> Fin (suc n)
  9. pred : {n : Nat} -> Fin (suc (suc n)) -> Fin (suc n)
  10. pred fzero = fzero
  11. pred (fsuc i) = i
  12. fzero≠fsuc : {n : Nat}{i : Fin n} -> fzero ≢ fsuc i
  13. fzero≠fsuc ()
  14. fsuc-inj : {n : Nat}{i j : Fin n} -> fsuc i ≡ fsuc j -> i ≡ j
  15. fsuc-inj refl = refl
  16. _==_ : {n : Nat}(i j : Fin n) -> (i ≡ j) \/ (i ≢ j)
  17. fzero == fzero = \/-IL refl
  18. fzero == fsuc j = \/-IR fzero≠fsuc
  19. fsuc i == fzero = \/-IR (sym≢ fzero≠fsuc)
  20. fsuc i == fsuc j = aux i j (i == j)
  21. where
  22. aux : {n : Nat}(i j : Fin n) -> (i ≡ j) \/ (i ≢ j) -> (fsuc i ≡ fsuc j) \/ (fsuc i ≢ fsuc j)
  23. aux i .i (\/-IL refl) = \/-IL refl
  24. aux i j (\/-IR i≠j) = \/-IR \si=sj -> i≠j (fsuc-inj si=sj)
  25. _<_ : {n : Nat} -> Fin n -> Fin n -> Bool
  26. _ < fzero = false
  27. fzero < fsuc j = true
  28. fsuc i < fsuc j = i < j
  29. fromNat : (n : Nat) -> Fin (suc n)
  30. fromNat zero = fzero
  31. fromNat (suc n) = fsuc (fromNat n)
  32. liftSuc : {n : Nat} -> Fin n -> Fin (suc n)
  33. liftSuc fzero = fzero
  34. liftSuc (fsuc i) = fsuc (liftSuc i)
  35. lift+ : {n : Nat}(m : Nat) -> Fin n -> Fin (m + n)
  36. lift+ zero i = i
  37. lift+ (suc m) i = liftSuc (lift+ m i)
  38. thin : {n : Nat} -> Fin (suc n) -> Fin n -> Fin (suc n)
  39. thin fzero i = fsuc i
  40. thin (fsuc j) fzero = fzero
  41. thin (fsuc j) (fsuc i) = fsuc (thin j i)
  42. -- Two elements of Fin n are either the same or one is the thinning of
  43. -- something with respect to the other.
  44. data ThinView : {n : Nat}(i j : Fin n) -> Set where
  45. same : {n : Nat}{i : Fin n} -> ThinView i i
  46. diff : {n : Nat}{i : Fin (suc n)}(j : Fin n) -> ThinView i (thin i j)
  47. thinView : {n : Nat}(i j : Fin n) -> ThinView i j
  48. thinView {suc _} fzero fzero = same
  49. thinView {suc _} fzero (fsuc j) = diff j
  50. thinView {suc zero} (fsuc ()) fzero
  51. thinView {suc (suc _)} (fsuc i) fzero = diff fzero
  52. thinView (fsuc i) (fsuc j) = aux i j (thinView i j)
  53. where
  54. aux : {n : Nat}(i j : Fin n) -> ThinView i j -> ThinView (fsuc i) (fsuc j)
  55. aux i .i same = same
  56. aux i .(thin i j) (diff j) = diff (fsuc j)
  57. thin-ij≠i : {n : Nat}(i : Fin (suc n))(j : Fin n) -> thin i j ≢ i
  58. thin-ij≠i fzero j ()
  59. thin-ij≠i (fsuc i) fzero ()
  60. thin-ij≠i (fsuc i) (fsuc j) eq = thin-ij≠i i j (fsuc-inj eq)
  61. -- Thickening.
  62. -- thin i (thick i j) ≡ j ?
  63. -- thick i (thin i j) ≡ j
  64. thick : {n : Nat}(i j : Fin (suc n)) -> i ≢ j -> Fin n
  65. thick i j i≠j = thick' i j i≠j (thinView i j) where
  66. thick' : {n : Nat}(i j : Fin (suc n)) -> i ≢ j -> ThinView i j -> Fin n
  67. thick' i .i i≠i same = elim-False (i≠i refl)
  68. thick' i .(thin i j) _ (diff j) = j
  69. -- thin∘thick=id : {n : Nat}(i j : Fin (suc n))(p : i ≢ j) ->
  70. -- thin i (thick i j p) ≡ j
  71. -- thin∘thick=id i j p = ?
  72. --
  73. -- thick∘thin=id : {n : Nat}(i : Fin (suc n))(j : Fin n) ->
  74. -- thick i (thin i j) (sym≢ (thin-ij≠i i j)) ≡ j
  75. -- thick∘thin=id i j = ?
  76. --