summaryrefslogtreecommitdiff
path: root/src/Cfe/Fin/Base.agda
blob: 9a0a4aaf932877f5090adcd051399ec5bb936388 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
{-# OPTIONS --without-K --safe #-}

module Cfe.Fin.Base where

open import Data.Nat using (ℕ; zero; suc)
open import Data.Fin using (Fin; Fin′; zero; suc; inject₁)

data Fin< : ∀ {n} → Fin n → Set where
  zero : ∀ {n i} → Fin< {suc n} (suc i)
  suc  : ∀ {n i} → Fin< {n} i → Fin< (suc i)

data Fin<′ : ∀ {n i} → Fin< {n} i → Set where
  zero : ∀ {n i j} → Fin<′ {suc n} {suc i} (suc j)
  suc  : ∀ {n i j} → Fin<′ {n} {i} j → Fin<′ (suc j)

-- Fin> {n} zero    ≡ Fin n
-- Fin>     (suc i) ≡ Fin> i

data Fin> : ∀ {n} → Fin n → Set where
  zero : ∀ {n} → Fin> {suc n} zero
  suc  : ∀ {n} → Fin> {suc n} zero → Fin> {suc (suc n)} zero
  inj  : ∀ {n i} → Fin> {n} i → Fin> (suc i)

data Fin>′ : ∀ {n i} → Fin> {n} i → Set where
  zero : ∀ {n j} → Fin>′ {suc (suc n)} {zero} (suc j)
  suc  : ∀ {n j} → Fin>′ {suc n} {zero} j → Fin>′ (suc j)
  inj  : ∀ {n i j} → Fin>′ {n} {i} j → Fin>′ (inj j)

toℕ< : ∀ {n i} → Fin< {n} i → ℕ
toℕ< zero    = 0
toℕ< (suc j) = suc (toℕ< j)

toℕ> : ∀ {n i} → Fin> {n} i → ℕ
toℕ> zero    = 0
toℕ> (suc j) = suc (toℕ> j)
toℕ> (inj j) = suc (toℕ> j)

strengthen< : ∀ {n} → (i : Fin n) → Fin< (suc i)
strengthen< zero    = zero
strengthen< (suc i) = suc (strengthen< i)

inject<! : ∀ {n i} → Fin< {suc n} i → Fin n
inject<! {suc _} zero    = zero
inject<! {suc _} (suc j) = suc (inject<! j)

cast<-inject₁ : ∀ {n i} → Fin< {n} i → Fin< (inject₁ i)
cast<-inject₁ zero    = zero
cast<-inject₁ (suc j) = suc (cast<-inject₁ j)

inject<!′ : ∀ {n i j} → Fin<′ {suc n} {suc i} j → Fin< i
inject<!′ {suc _} {suc _} zero    = zero
inject<!′ {suc _} {suc _} (suc k) = suc (inject<!′ k)

inject<′ : ∀ {n i j} → Fin<′ {n} {i} j → Fin< i
inject<′ zero    = zero
inject<′ (suc k) = suc (inject<′ k)

inject<!′-inject! : ∀ {n i j} → Fin<′ {suc n} {i} j → Fin< (inject<! j)
inject<!′-inject! {suc n} {_} {suc j} zero    = zero
inject<!′-inject! {suc n} {_} {suc j} (suc k) = suc (inject<!′-inject! k)

raise> : ∀ {n i} → Fin> {n} i → Fin n
raise> {suc _} zero    = zero
raise> {suc _} (suc j) = suc (raise> j)
raise> {suc _} (inj j) = suc (raise> j)

suc> : ∀ {n i} → Fin> {n} i → Fin> (inject₁ i)
suc> zero    = suc zero
suc> (suc j) = suc (suc> j)
suc> (inj j) = inj (suc> j)

inject>!′ : ∀ {n i j} → Fin>′ {suc n} {inject₁ i} j → Fin> {n} i
inject>!′ {suc _}       {zero}          zero    = zero
inject>!′ {suc (suc _)} {zero}  {suc _} (suc k) = suc (inject>!′ k)
inject>!′ {suc _}       {suc i}         (inj k) = inj (inject>!′ k)

inject>′ : ∀ {n i j} → Fin>′ {n} {i} j → Fin> {n} i
inject>′ zero    = zero
inject>′ (suc k) = suc (inject>′ k)
inject>′ (inj k) = inj (inject>′ k)

cast>-inject<! : ∀ {n i} (j : Fin< (suc i)) → Fin> {suc n} i → Fin> (inject<! j)
cast>-inject<!         zero    zero    = zero
cast>-inject<!         zero    (suc k) = suc (cast>-inject<! zero k)
cast>-inject<! {suc n} zero    (inj k) = suc (cast>-inject<! zero k)
cast>-inject<! {suc n} (suc j) (inj k) = inj (cast>-inject<! j k)

reflect :
  ∀ {n i} → (j : Fin< {suc (suc n)} (suc i)) → (k : Fin<′ (suc j)) → Fin> (inject<! (inject<!′ k))
reflect                 zero    zero    = zero
reflect {suc n} {suc i} (suc j) zero    = suc (reflect j zero)
reflect {suc n} {suc i} (suc j) (suc k) = inj (reflect j k)