-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathDiff.agda
76 lines (54 loc) · 2.04 KB
/
Diff.agda
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
open import Function
open import Level renaming (zero to lzero; suc to lsuc)
open import Relation.Binary.PropositionalEquality
open import Data.Nat.Base
open import Data.Fin using (Fin; zero; suc; fromℕ)
infixr 9 _∘ᵈ_
record Diff (k : ℕ -> ℕ) : Set where
field βk : ∀ {n} -> k (suc n) ≡ suc (k n)
module Kit {n α} (A : ℕ -> Set α) where
ink : A (suc (k n)) -> A (k (suc n))
ink = subst A (sym βk)
outk : A (k (suc n)) -> A (suc (k n))
outk = subst A βk
unink : ∀ {β} {B : Set β} -> (f : ∀ {n} -> (x : A n) -> B) -> f ∘ ink ≗ f
unink f x rewrite βk {n} = refl
unoutk : ∀ {β} {B : Set β} -> (f : ∀ {n} -> (x : A n) -> B) -> f ∘ outk ≗ f
unoutk f x rewrite βk {n} = refl
ink-outk : ink ∘ outk ≗ id
ink-outk x rewrite βk {n} = refl
outk-ink : outk ∘ ink ≗ id
outk-ink x rewrite βk {n} = refl
module DiffKit {k} (d : Diff k) where
open Diff d public
open Kit public
module DiffKitOver {α k} (A : ℕ -> Set α) (d : Diff k) where
open Diff d public
private open module Dummy {n} = Kit {n} A public
dzero : Diff id
dzero = record { βk = refl }
module _ {k} (d : Diff k) where
open Diff d
dsucˡ : Diff (suc ∘ k)
dsucˡ = record { βk = cong suc βk }
dsucʳ : Diff (k ∘ suc)
dsucʳ = record { βk = βk }
dnum : ∀ n -> Diff (n +_)
dnum 0 = dzero
dnum (suc n) = dsucˡ (dnum n)
done : Diff suc
done = dnum 1
_∘ᵈ_ : ∀ {k₂ k₁} -> Diff k₂ -> Diff k₁ -> Diff (k₂ ∘ k₁)
_∘ᵈ_ {k₂} d₂ d₁ = let open Diff in record { βk = trans (cong k₂ (βk d₁)) (βk d₂) }
module _ {k} (d : Diff k) where
open DiffKitOver Fin d
injectd : ∀ {n} -> Fin n -> Fin (k n)
injectd zero = ink zero
injectd (suc i) = ink (suc (injectd i))
inject+′ : ∀ {n} m -> Fin n -> Fin (m + n)
inject+′ m = injectd (dnum m)
revertd : ∀ {k n} -> Diff k -> Fin n -> Fin (k n)
revertd d zero = injectd d (fromℕ _)
revertd d (suc i) = revertd (dsucʳ d) i
revert : ∀ {n} -> Fin n -> Fin n
revert = revertd dzero