-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchurch-dialogue-internal.lagda
285 lines (214 loc) · 24.3 KB
/
church-dialogue-internal.lagda
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
Martin Escardo, 8 May 2013.
This is based on
http://www.cs.bham.ac.uk/~mhe/dialogue/dialogue.lagda
http://www.cs.bham.ac.uk/~mhe/dialogue/dialogue.html
http://www.cs.bham.ac.uk/~mhe/dialogue/dialogue.pdf
and in turn on
http://www.cs.bham.ac.uk/~mhe/dialogue/church-dialogue.lagda
http://www.cs.bham.ac.uk/~mhe/dialogue/church-dialogue.html
which uses Church encoding of dialogue trees, and should be consulted
before trying to understand what follows.
We modify the latter so as to internalize the modulus of
continuity. That is, we now have a function
internal-mod-cont : T((ι ⇒ ι) ⇒ ι) → T((ι ⇒ ι) ⇒ ι)
that given a term t : T((ι⇒ι)⇒ι) produces term m : T((ι⇒ι)⇒ι) such
that m defines the modulus of continuity of t. We use Church encoding
to represent dialogue trees within system T. This also shows that
dialogue trees of terms of type (ι ⇒ ι) ⇒ ι cannot be very tall,
because system T can only define trees of height smaller than ε₀.
This version has very few comments. Also, (1) we only account for
continuity, and (2) we provide the construction of the modulus of
continuity, but we don't fully prove its correctness, which should
nevertheless be clear based on the proofs given in dialogue.*.
For the purposes of this, it would have been better to have worked
with the lambda-calculus version of system T, as the reader can see.
This short file takes a minute to type-check, due to the occurrence of
large combinatory terms with hundreds of implicit parameters.
\begin{code}
module church-dialogue-internal where
data _≡_ {X : Set} : X → X → Set where
refl : ∀{x : X} → x ≡ x
data ℕ : Set where
zero : ℕ
succ : ℕ → ℕ
rec : ∀{X : Set} → (X → X) → X → ℕ → X
rec f x zero = x
rec f x (succ n) = f(rec f x n)
-- System T type expressions:
data type : Set where
ι : type
_⇒_ : type → type → type
-- (Combinatory) system T terms:
data T : (σ : type) → Set where
Zero : T ι
Succ : T(ι ⇒ ι)
Rec : ∀{σ : type} → T((σ ⇒ σ) ⇒ σ ⇒ ι ⇒ σ)
K : ∀{σ τ : type} → T(σ ⇒ τ ⇒ σ)
S : ∀{ρ σ τ : type} → T((ρ ⇒ σ ⇒ τ) ⇒ (ρ ⇒ σ) ⇒ ρ ⇒ τ)
_·_ : ∀{σ τ : type} → T(σ ⇒ τ) → T σ → T τ
infixr 1 _⇒_
infixl 1 _·_
-- The standard semantics of T is not needed for this construction,
-- but it is useful to make sure the T translation is really what we
-- intend:
Ķ : ∀{X Y : Set} → X → Y → X
Ķ x y = x
Ş : ∀{X Y Z : Set} → (X → Y → Z) → (X → Y) → X → Z
Ş f g x = f x (g x)
Set⟦_⟧ : type → Set
Set⟦ ι ⟧ = ℕ
Set⟦ σ ⇒ τ ⟧ = Set⟦ σ ⟧ → Set⟦ τ ⟧
⟦_⟧ : ∀{σ : type} → T σ → Set⟦ σ ⟧
⟦ Zero ⟧ = zero
⟦ Succ ⟧ = succ
⟦ Rec ⟧ = rec
⟦ K ⟧ = Ķ
⟦ S ⟧ = Ş
⟦ t · u ⟧ = ⟦ t ⟧ ⟦ u ⟧
-- Church encoding of dialogue trees, internal to system T:
D : type → type → type → type → type
D X Y Z A = (Z ⇒ A) ⇒ ((Y ⇒ A) ⇒ X ⇒ A) ⇒ A
I : ∀{σ : type} → T(σ ⇒ σ)
I {σ} = S · K · (K {σ} {σ})
-- The following is automatically translated from λ z η' β' → η' z using the
-- calculator http://www.cantab.net/users/antoni.diller/brackets/intro.html:
η : {X Y Z A : type} → T(Z ⇒ D X Y Z A)
η = S · (S · (K · S) · (S · (S · (K · S) · (S · (K · K) · (K · S))) · (S · (S · (K · S) · (S · (K · K) · (K · K))) · (K · I)))) · (S · (S · (K · S) · (S · (K · K) · (K · K))) · (S · (K · K) · I))
-- This translation is correct:
η-behaviour : {X Y Z A : type} → ∀ z η' β' → ⟦ η {X} {Y} {Z} {A} ⟧ z η' β' ≡ η' z
η-behaviour z η' β' = refl
-- Then we translate λ φ x η' β' → β' (λ y → φ y η' β') x:
β : {X Y Z A : type} → T (((Y ⇒ D X Y Z A) ⇒ X ⇒ D X Y Z A))
β = S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I)))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) · I)))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I))))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(K · K) ·(K · I))))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I))))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(K · I)))
β-behaviour : {X Y Z A : type} → ∀ φ x η' β' → ⟦ β {X} {Y} {Z} {A} ⟧ φ x η' β' ≡ β' (λ y → φ y η' β') x
β-behaviour φ x η' β' = refl
B : type → type → type
B = D ι ι
-- The following is translated from λ f d η' β' → d (λ x → f x η' β') β':
kleisli-extension : ∀{X Y A : type} → T((X ⇒ B Y A) ⇒ B X A ⇒ B Y A)
kleisli-extension = S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(K · I)))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) · I)))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I))))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(K · K) ·(K · I))))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I))))))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I)))
kleisli-extension-behaviour : ∀{X Y A : type} → ∀ f d η' β' → ⟦ kleisli-extension {X} {Y} {A} ⟧ f d η' β' ≡ d (λ x → f x η' β') β'
kleisli-extension-behaviour f d η' β' = refl
-- The following is translated from λ f → kleisli-extension(λ x → η(f x)):
B-functor : ∀{X Y A : type} → T((X ⇒ Y) ⇒ B X A ⇒ B Y A)
B-functor = S ·(K · kleisli-extension) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · η))) ·(S ·(S ·(K · S) ·(S ·(K · K) · I)) ·(K · I)))
B-functor-behaviour : ∀{X Y A : type} → ∀ f → ⟦ B-functor {X} {Y} {A} ⟧ f ≡ ⟦ kleisli-extension ⟧ (λ x → ⟦ η ⟧ (f x))
B-functor-behaviour f = refl
-- Translation of types:
B-type⟦_⟧ : type → type → type
B-type⟦ ι ⟧ A = B ι A
B-type⟦ σ ⇒ τ ⟧ A = B-type⟦ σ ⟧ A ⇒ B-type⟦ τ ⟧ A
-- The second equation of the following is translated from λ g d s → Kleisli-extension {X} {A} {τ} (λ x → g x s) d:
Kleisli-extension : ∀{X A : type} {σ : type} → T((X ⇒ B-type⟦ σ ⟧ A) ⇒ B X A ⇒ B-type⟦ σ ⟧ A)
Kleisli-extension {X} {A} {ι} = kleisli-extension
Kleisli-extension {X} {A} {σ ⇒ τ} = S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · (Kleisli-extension {X} {A} {τ})))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) · I)))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(K · K) ·(K · I))))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(K · I))
Kleisli-extension-behaviour : ∀{X A : type} {σ τ : type} → ∀ g d s
→ ⟦ Kleisli-extension {X} {A} {σ ⇒ τ} ⟧ g d s ≡ ⟦ Kleisli-extension {X} {A} {τ} ⟧ (λ x → g x s) d
Kleisli-extension-behaviour g d s = refl
zero' : {A : type} → T(B ι A)
zero' = η · Zero
succ' : {A : type} → T(B ι A ⇒ B ι A)
succ' = B-functor · Succ
-- Translation of λ f x → Kleisli-extension {ι} {A} {σ} (rec f x):
rec' : ∀{σ A : type} → T((B-type⟦ σ ⟧ A ⇒ B-type⟦ σ ⟧ A) ⇒ B-type⟦ σ ⟧ A ⇒ B ι A ⇒ B-type⟦ σ ⟧ A)
rec' {σ} {A} = S · (S · (K · S) · (S · (K · K) · (K · (Kleisli-extension {ι} {A} {σ})))) · (S · (S · (K · S) · (S · (S · (K · S) · (S · (K · K) · (K · Rec))) · (S · (K · K) · I))) · (K · I))
rec'-behaviour : ∀{σ A : type} → ∀ f x → ⟦ rec' {σ} {A} ⟧ f x ≡ ⟦ Kleisli-extension {ι} {A} {σ} ⟧ (rec f x)
rec'-behaviour f x = refl
-- (Compositional) translation of terms:
B⟦_⟧ : ∀{σ : type}{A : type} → T σ → T(B-type⟦ σ ⟧ A)
B⟦ Zero ⟧ = zero'
B⟦ Succ ⟧ = succ'
B⟦ Rec {σ} ⟧ = rec' {σ}
B⟦ K ⟧ = K
B⟦ S ⟧ = S
B⟦ t · u ⟧ = B⟦ t ⟧ · B⟦ u ⟧
-- Given a term of type (ι ⇒ ι) ⇒ ι, we calculate a term defining its dialogue tree:
generic : {A : type} → T(B ι A ⇒ B ι A)
generic = kleisli-extension · (β · η)
dialogue-tree : {A : type} → T((ι ⇒ ι) ⇒ ι) → T(B ι A)
dialogue-tree t = B⟦ t ⟧ · generic
-- With this it is now easy to internalize the modulus of continuity:
Add : T(ι ⇒ ι ⇒ ι)
Add = Rec · Succ
-- I will cheat for the moment, and add rather than take max, because
-- it is difficult to compute max with the iterator Rec. This is
-- benign cheating, which gives a worse, but correct modulus.
Max : T(ι ⇒ ι ⇒ ι)
Max = Add
-- The modulus of continuity can be calculated from a dialogue tree.
-- Translation of λ d → d (λ n α → zero) (λ φ n α → max (succ n) (φ (α n) α))
Mod-cont : T(B ι ((ι ⇒ ι) ⇒ ι) ⇒ (ι ⇒ ι) ⇒ ι)
Mod-cont = S ·(S · I ·(S ·(K · K) ·(S ·(K · K) ·(K · Zero)))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · Max))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · Succ))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(K · K) ·(K · I)))))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(K · I)))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · S))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I)))))) ·(S ·(S ·(K · S) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · S))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · K))))) ·(S ·(K · K) ·(K · I)))))))) ·(S ·(S ·(K · S) ·(S ·(K · K) ·(K · K))) ·(S ·(K · K) ·(K · I)))))
-- Instead of describing the above behaviour, we describe the
-- corresponding pattern-matching behaviour, for clarity:
Mod-cont-behaviour₀ : ∀ n α → ⟦ Mod-cont ⟧ (⟦ η ⟧ n) α ≡ zero
Mod-cont-behaviour₀ n α = refl
Mod-cont-behaviour₁ : ∀ φ n α → ⟦ Mod-cont ⟧ (⟦ β ⟧ φ n) α ≡ ⟦ Max ⟧ (succ n) (⟦ Mod-cont ⟧ (φ(α n)) α)
Mod-cont-behaviour₁ φ n α = refl
-- To calculate the modulus term of a term, we first calculate the dialogue-tree term and then walk the tree:
internal-mod-cont : T((ι ⇒ ι) ⇒ ι) → T((ι ⇒ ι) ⇒ ι)
internal-mod-cont t = Mod-cont · (dialogue-tree {(ι ⇒ ι) ⇒ ι} t)
\end{code}
That's it.
Experiments follow:
\begin{code}
external-mod-cont : T((ι ⇒ ι) ⇒ ι) → (ℕ → ℕ) → ℕ
external-mod-cont t = ⟦ internal-mod-cont t ⟧
{-# BUILTIN NATURAL ℕ #-}
number : ℕ → T ι
number zero = Zero
number (succ n) = Succ · (number n)
t₀ : T((ι ⇒ ι) ⇒ ι)
t₀ = K · (number 17)
t₀-interpretation : ⟦ t₀ ⟧ ≡ λ α → 17
t₀-interpretation = refl
example₀ : ℕ
example₀ = external-mod-cont t₀ (λ i → i)
v : ∀{γ : type} → T(γ ⇒ γ)
v = I
infixl 1 _•_
_•_ : ∀{γ σ τ : type} → T(γ ⇒ σ ⇒ τ) → T(γ ⇒ σ) → T(γ ⇒ τ)
f • x = S · f · x
Number : ∀{γ} → ℕ → T(γ ⇒ ι)
Number n = K · (number n)
t₁ : T((ι ⇒ ι) ⇒ ι)
t₁ = v • (Number 17)
t₁-interpretation : ⟦ t₁ ⟧ ≡ λ α → α 17
t₁-interpretation = refl
example₁ : ℕ
example₁ = external-mod-cont t₁ (λ i → i)
t₂ : T((ι ⇒ ι) ⇒ ι)
t₂ = Rec • t₁ • t₁
t₂-interpretation : ⟦ t₂ ⟧ ≡ λ α → rec α (α 17) (α 17)
t₂-interpretation = refl
example₂ : ℕ
example₂ = external-mod-cont t₂ (λ i → i)
infixl 0 _+_
_+_ : ∀{γ} → T(γ ⇒ ι) → T(γ ⇒ ι) → T(γ ⇒ ι)
x + y = K · Add • x • y
t₃ : T((ι ⇒ ι) ⇒ ι)
t₃ = Rec • (v • Number 1) • (v • Number 2 + v • Number 3)
t₃-interpretation : ⟦ t₃ ⟧ ≡ λ α → rec α (α 1) (rec succ (α 2) (α 3))
t₃-interpretation = refl
example₃ : ℕ
example₃ = external-mod-cont t₃ succ
t₄ : T((ι ⇒ ι) ⇒ ι)
t₄ = Rec • ((v • (v • Number 2)) + (v • Number 3)) • t₃
t₄-interpretation : ⟦ t₄ ⟧ ≡ λ α → rec α (rec succ (α (α 2)) (α 3)) (rec α (α 1) (rec succ (α 2) (α 3)))
t₄-interpretation = refl
t₅ : T((ι ⇒ ι) ⇒ ι)
t₅ = Rec • (v • (v • t₂ + t₄)) • (v • Number 2)
t₅-explicitly : t₅ ≡ (S · (S · Rec · (S · I · (S · (S · (K · (Rec · Succ)) · (S · I · (S
· (S · Rec · (S · I · (K · (number 17)))) · (S · I · (K · (number 17))))))
· (S · (S · Rec · (S · (S · (K · (Rec · Succ)) · (S · I · (S · I · (K · (number 2)))))
· (S · I · (K · (number 3))))) · (S · (S · Rec · (S · I · (K · (number 1))))
· (S · (S · (K · (Rec · Succ)) · (S · I · (K · (number 2)))) · (S · I · (K
· (number 3))))))))) · (S · I · (K · (number 2))))
t₅-explicitly = refl
t₅-interpretation : ⟦ t₅ ⟧ ≡ λ α → rec α (α(rec succ (α(rec α (α 17) (α 17)))
(rec α (rec succ (α (α 2)) (α 3))
(rec α (α 1) (rec succ (α 2) (α 3)))))) (α 2)
t₅-interpretation = refl
example₅ : ℕ
example₅ = external-mod-cont t₅ succ
\end{code}