-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathIsNat.agda
More file actions
86 lines (71 loc) · 2.46 KB
/
Copy pathIsNat.agda
File metadata and controls
86 lines (71 loc) · 2.46 KB
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
-- `IsNat` is the same thing as `IsNatAt`,
-- but without any universe polymorphism related problems.
open import Level as L using (_⊔_)
open import Function
open import Data.Unit.Base
open import Data.Nat.Base hiding (_⊔_)
open import Data.List.Base
elimℕ : ∀ {π}
-> (P : ℕ -> Set π)
-> (∀ {n} -> P n -> P (suc n))
-> P 0
-> ∀ n
-> P n
elimℕ P f z 0 = z
elimℕ P f z (suc n) = f (elimℕ P f z n)
elimList : ∀ {α π} {A : Set α}
-> (P : List A -> Set π)
-> (∀ {xs} x -> P xs -> P (x ∷ xs))
-> P []
-> ∀ xs
-> P xs
elimList P f z [] = z
elimList P f z (x ∷ xs) = f x (elimList P f z xs)
record HasNat {α} (A : Set α) : Set α where
field
gzero : A
gsuc : A -> A
data SingNat : A -> Set α where
szero : SingNat gzero
ssuc : ∀ {n} -> SingNat n -> SingNat (gsuc n)
elimSingNat : ∀ {n π}
-> (P : A -> Set π)
-> (∀ {n} -> P n -> P (gsuc n))
-> P gzero
-> SingNat n
-> P n
elimSingNat P f z szero = z
elimSingNat P f z (ssuc sn) = f (elimSingNat P f z sn)
open HasNat {{...}}
record IsNat {α} (A : Set α) {{hasNat : HasNat A}} : Set α where
field
singNat : (n : A) -> SingNat n
elimNat : ∀ {π} (P : A -> Set π)
-> (∀ {n} -> P n -> P (gsuc n))
-> P gzero
-> ∀ n
-> P n
elimNat P f z = elimSingNat P f z ∘ singNat
open IsNat {{...}}
instance
hasNatℕ : HasNat ℕ
hasNatℕ = record { gzero = 0 ; gsuc = suc }
isNatℕ : IsNat ℕ
isNatℕ = record { singNat = elimℕ SingNat ssuc szero }
hasNatList⊤ : HasNat (List ⊤)
hasNatList⊤ = record { gzero = [] ; gsuc = _ ∷_ }
isNatList⊤ : IsNat (List ⊤)
isNatList⊤ = record { singNat = elimList SingNat (const ssuc) szero }
record IsNatAt {α} π (A : Set α) {{hasNat : HasNat A}} : Set (α ⊔ L.suc π) where
field
elimNat′ : (P : A -> Set π)
-> (∀ {n} -> P n -> P (gsuc n))
-> P gzero
-> ∀ n
-> P n
isNatIsNatAt : ∀ {α π} {A : Set α} {{hasNat : HasNat A}} {{isNat : IsNat A}} -> IsNatAt π A
isNatIsNatAt = record { elimNat′ = elimNat }
isNatAtIsNat : ∀ {α} {A : Set α} {{hasNat : HasNat A}}
-> (isNat : ∀ {π} -> IsNatAt π A) -> IsNat A
isNatAtIsNat isNat = record { singNat = elimNat′ SingNat ssuc szero }
where open IsNatAt isNat