Fin.agda 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. module Lib.Fin where
  2. open import Lib.Nat
  3. open import Lib.Bool
  4. open import Lib.Id
  5. data Fin : Nat -> Set where
  6. zero : {n : Nat} -> Fin (suc n)
  7. suc : {n : Nat} -> Fin n -> Fin (suc n)
  8. fromNat : (n : Nat) -> Fin (suc n)
  9. fromNat zero = zero
  10. fromNat (suc n) = suc (fromNat n)
  11. toNat : {n : Nat} -> Fin n -> Nat
  12. toNat zero = zero
  13. toNat (suc n) = suc (toNat n)
  14. weaken : {n : Nat} -> Fin n -> Fin (suc n)
  15. weaken zero = zero
  16. weaken (suc n) = suc (weaken n)
  17. lem-toNat-weaken : forall {n} (i : Fin n) -> toNat i ≡ toNat (weaken i)
  18. lem-toNat-weaken zero = refl
  19. lem-toNat-weaken (suc i) with toNat i | lem-toNat-weaken i
  20. ... | .(toNat (weaken i)) | refl = refl
  21. lem-toNat-fromNat : (n : Nat) -> toNat (fromNat n) ≡ n
  22. lem-toNat-fromNat zero = refl
  23. lem-toNat-fromNat (suc n) with toNat (fromNat n) | lem-toNat-fromNat n
  24. ... | .n | refl = refl
  25. finEq : {n : Nat} -> Fin n -> Fin n -> Bool
  26. finEq zero zero = true
  27. finEq zero (suc _) = false
  28. finEq (suc _) zero = false
  29. finEq (suc i) (suc j) = finEq i j
  30. -- A view telling you if a given element is the maximal one.
  31. data MaxView {n : Nat} : Fin (suc n) -> Set where
  32. theMax : MaxView (fromNat n)
  33. notMax : (i : Fin n) -> MaxView (weaken i)
  34. maxView : {n : Nat}(i : Fin (suc n)) -> MaxView i
  35. maxView {zero} zero = theMax
  36. maxView {zero} (suc ())
  37. maxView {suc n} zero = notMax zero
  38. maxView {suc n} (suc i) with maxView i
  39. maxView {suc n} (suc .(fromNat n)) | theMax = theMax
  40. maxView {suc n} (suc .(weaken i)) | notMax i = notMax (suc i)
  41. -- The non zero view
  42. data NonEmptyView : {n : Nat} -> Fin n -> Set where
  43. ne : {n : Nat}{i : Fin (suc n)} -> NonEmptyView i
  44. nonEmpty : {n : Nat}(i : Fin n) -> NonEmptyView i
  45. nonEmpty zero = ne
  46. nonEmpty (suc _) = ne
  47. -- The thinning view
  48. thin : {n : Nat} -> Fin (suc n) -> Fin n -> Fin (suc n)
  49. thin zero j = suc j
  50. thin (suc i) zero = zero
  51. thin (suc i) (suc j) = suc (thin i j)
  52. data EqView : {n : Nat} -> Fin n -> Fin n -> Set where
  53. equal : {n : Nat}{i : Fin n} -> EqView i i
  54. notequal : {n : Nat}{i : Fin (suc n)}(j : Fin n) -> EqView i (thin i j)
  55. compare : {n : Nat}(i j : Fin n) -> EqView i j
  56. compare zero zero = equal
  57. compare zero (suc j) = notequal j
  58. compare (suc i) zero with nonEmpty i
  59. ... | ne = notequal zero
  60. compare (suc i) (suc j) with compare i j
  61. compare (suc i) (suc .i) | equal = equal
  62. compare (suc i) (suc .(thin i j)) | notequal j = notequal (suc j)