-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathRecords.agda
144 lines (102 loc) · 3.44 KB
/
Records.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
{-
@author: Wojciech Jedynak (wjedynak@gmail.com)
-}
{-# OPTIONS --universe-polymorphism #-}
module Records where
-- symulacja (nie-zaleznego) rekordu za pomoca zaleznego produktu
open import Data.Nat hiding (_⊔_)
open import Data.Bool
open import Data.Unit
open import Data.Fin
open import Data.Vec
open import Function
open import Level
module First where
data Label : Set where
l-nat l-bool l-unit : Label
B : Label -> Set
B l-nat = ℕ
B l-bool = Bool
B l-unit = ⊤
Rec : Set
Rec = (l : Label) → B l
buildRecord : ℕ → Bool → ⊤ → Rec
buildRecord n b t = rec where
rec : Rec
rec l-nat = n
rec l-bool = b
rec l-unit = t
-- przykladowy rekord
ex : Rec
ex = buildRecord 1 true tt
ex2 : Rec
ex2 = buildRecord (ex l-nat) (ex l-bool) (ex l-unit)
-- jeszcze raz to samo, ale na samych finach
module Second where
Label : Set
Label = Fin 3
data U : Set where
nat bool unit : U
set : U → Set
set nat = ℕ
set bool = Bool
set unit = ⊤
label-case : (C : Label → Set) → (C zero) → (C (suc zero)) → (C (suc (suc zero))) → (l : Label) → C l
label-case C z s ss zero = z
label-case C z s ss (suc zero) = s
label-case C z s ss (suc (suc zero)) = ss
label-case C z s ss (suc (suc (suc ())))
B : Label → Set
B l = set (label-case (λ x → U) nat bool unit l)
Rec : Set
Rec = (l : Label) → B l
buildRecord : ℕ → Bool → ⊤ → Rec
buildRecord = label-case B
-- λ n b t l → label-case (λ x → B x) n b t l
module Third where
-- jeszcze bardziej konserwatywne
Label : Set
Label = Fin 3
U : Set
U = Fin 3 -- nat , bool , unit
-- rekursor dla Fin 3
fin3-rec : (C : Fin 3 → Set) → (C zero) → (C (suc zero)) → (C (suc (suc zero))) → (l : Fin 3) → C l
fin3-rec C z s ss zero = z
fin3-rec C z s ss (suc zero) = s
fin3-rec C z s ss (suc (suc zero)) = ss
fin3-rec C z s ss (suc (suc (suc ())))
fin3-rec1 : (C : Fin 3 → Set₁) → (C zero) → (C (suc zero)) → (C (suc (suc zero))) → (l : Fin 3) → C l
fin3-rec1 C z s ss zero = z
fin3-rec1 C z s ss (suc zero) = s
fin3-rec1 C z s ss (suc (suc zero)) = ss
fin3-rec1 C z s ss (suc (suc (suc ())))
set : U → Set
set = fin3-rec1 (λ x → Set) ℕ Bool ⊤
B : Label → Set
B l = set (fin3-rec (λ x → U) zero (suc zero) (suc (suc zero)) l)
Rec : Set
Rec = (l : Label) → B l
buildRecord : ℕ → Bool → ⊤ → Rec
buildRecord = fin3-rec B
ex : Rec
ex = buildRecord 1 false tt
n : ℕ
n = ex zero
------------------------------------------------------
-- How can we build a general recursor for Fin n? --
------------------------------------------------------
-- buildRecusor : (n : ℕ) → (C : Fin n → Set) → ...
at-all-values : {n : ℕ} → (C : Fin n → Set) → Vec Set n
at-all-values C = map C (tabulate id)
_^_⟶_ : ∀ {a} (A : Set a) → (n : ℕ) → (B : Set a) → Set a
A ^ zero ⟶ B = B
A ^ suc n ⟶ B = A → (A ^ n ⟶ B)
curry : ∀ {a} → {A : Set a} → (n : ℕ) → {B : Set a} → (Vec A n → B) → (A ^ n ⟶ B)
curry zero f = f []
curry (suc n) f = λ a → curry n (λ v_n → f (a ∷ v_n))
recursor : {n : ℕ} → {C : Set} → (fin : Fin n) → (C ^ n ⟶ C)
recursor {n} f = curry n (lookup f)
{-
recursor : {n : ℕ} → (C : Fin n → Set) → (fin : Fin n) → (ℕ ^ n ⟶ C fin)
recursor {n} C = {!!}
-}