@@ -19,9 +19,10 @@ mutual
19
19
Σ[ m≤m'' ∈ m ≤ m'' ]
20
20
Σ[ σ ∈ AListType m'' m' ]
21
21
Σ[ τ ∈ Type m' ]
22
- WellTypedTerm (substCxt≤ σ m≤m'' Γ) τ)
22
+ Σ[ w ∈ WellTypedTerm (substCxt≤ σ m≤m'' Γ) τ ]
23
+ erase w ≡ s)
23
24
infer m Γ (Var x) = infer-Var m Γ x
24
- infer m Γ (Lam s) = infer-Lam m Γ s
25
+ infer m Γ (Lam s) = infer-Lam m Γ s
25
26
infer m Γ (App s1 s2) = infer-App m Γ s1 s2
26
27
infer m Γ (Fst s) = infer-Fst m Γ s
27
28
infer m Γ (Snd s) = infer-Snd m Γ s
@@ -33,30 +34,34 @@ mutual
33
34
Σ[ m≤m'' ∈ m ≤ m'' ]
34
35
Σ[ σ ∈ AListType m'' m' ]
35
36
Σ[ τ ∈ Type m' ]
36
- WellTypedTerm (substCxt≤ σ m≤m'' Γ) τ)
37
- infer-Var m Γ x = just (m , m , m≤m m , anil , τ , VarX)
37
+ Σ[ w ∈ WellTypedTerm (substCxt≤ σ m≤m'' Γ) τ ]
38
+ erase w ≡ Var x)
39
+ infer-Var m Γ x = just (m , m , m≤m m , anil , τ , VarX , eq)
38
40
where
39
41
τ : Type m
40
42
τ = lookup x Γ
41
43
VarX : WellTypedTerm (substCxt≤ anil (m≤m m) Γ) τ
42
44
VarX rewrite substCxt≤Anil Γ (m≤m m) = Var x
45
+ eq : erase VarX ≡ Var x
46
+ eq rewrite substCxt≤Anil Γ (m≤m m) = refl
43
47
44
48
infer-Lam : (m : ℕ) → {n : ℕ} → (Γ : Cxt {m} n) → (s : WellScopedTerm (suc n)) →
45
49
Maybe (Σ[ m'' ∈ ℕ ]
46
50
Σ[ m' ∈ ℕ ]
47
51
Σ[ m≤m'' ∈ m ≤ m'' ]
48
52
Σ[ σ ∈ AListType m'' m' ]
49
53
Σ[ τ ∈ Type m' ]
50
- WellTypedTerm (substCxt≤ σ m≤m'' Γ) τ)
54
+ Σ[ w ∈ WellTypedTerm (substCxt≤ σ m≤m'' Γ) τ ]
55
+ erase w ≡ Lam s)
51
56
infer-Lam m {n} Γ s
52
57
with let tx : Type (suc m)
53
58
tx = TVar (fromℕ m) -- new type variable
54
59
Γ' : Cxt {suc m} n
55
60
Γ' = liftCxt 1 Γ
56
61
in infer (suc m) (tx ∷ Γ') s
57
62
... | nothing = nothing
58
- ... | just (m'' , m' , 1+m≤m'' , σ , τ , w) =
59
- just (m'' , m' , m≤m'' , σ , tx' ⇒ τ , LamW)
63
+ ... | just (m'' , m' , 1+m≤m'' , σ , τ , w , eraseW≡S ) =
64
+ just (m'' , m' , m≤m'' , σ , tx' ⇒ τ , LamW , eraseLamW≡LamS )
60
65
where
61
66
tx : Type (suc m) -- the same as above
62
67
tx = TVar (fromℕ m)
@@ -70,31 +75,34 @@ mutual
70
75
σΓ'≡σΓ = substCxt≤+1 Γ 1+m≤m'' m≤m'' σ
71
76
LamW : WellTypedTerm (substCxt≤ σ m≤m'' Γ) (tx' ⇒ τ)
72
77
LamW rewrite sym σΓ'≡σΓ = Lam tx' w
78
+ eraseLamW≡LamS : erase LamW ≡ Lam s
79
+ eraseLamW≡LamS rewrite sym σΓ'≡σΓ = cong Lam eraseW≡S
73
80
74
81
infer-App : (m : ℕ) → {n : ℕ} → (Γ : Cxt {m} n) → (s1 s2 : WellScopedTerm n) →
75
82
Maybe (Σ[ m'' ∈ ℕ ]
76
83
Σ[ m' ∈ ℕ ]
77
84
Σ[ m≤m'' ∈ m ≤ m'' ]
78
85
Σ[ σ ∈ AListType m'' m' ]
79
86
Σ[ τ ∈ Type m' ]
80
- WellTypedTerm (substCxt≤ σ m≤m'' Γ) τ)
87
+ Σ[ w ∈ WellTypedTerm (substCxt≤ σ m≤m'' Γ) τ ]
88
+ erase w ≡ App s1 s2)
81
89
infer-App m {n} Γ s1 s2
82
90
with infer m Γ s1
83
91
... | nothing = nothing
84
- ... | just (m1'' , m1' , m≤m1'' , σ1 , t1 , w1)
92
+ ... | just (m1'' , m1' , m≤m1'' , σ1 , t1 , w1 , eraseW1≡S1 )
85
93
with let σ1Γ : Cxt {m1'} n
86
94
σ1Γ = substCxt≤ σ1 m≤m1'' Γ
87
95
in infer m1' σ1Γ s2
88
96
... | nothing = nothing
89
- ... | just (m2'' , m2' , m1'≤m2'' , σ2 , t2 , w2)
97
+ ... | just (m2'' , m2' , m1'≤m2'' , σ2 , t2 , w2 , eraseW2≡S2 )
90
98
with let t : Type (suc m2')
91
99
t = TVar (fromℕ m2') -- new type variable
92
100
σ2t1 : Type m2'
93
101
σ2t1 = substType≤ σ2 m1'≤m2'' t1
94
102
in mgu2 (liftType≤ (n≤m+n 1 m2') σ2t1) (liftType≤ (n≤m+n 1 m2') t2 ⇒ t)
95
103
... | nothing = nothing
96
104
... | just (m3' , σ3 , σ3σ2t1≡σ3t2⇒σ3t) =
97
- just (m3'' , m3' , m≤m3'' , σ , σ3t , AppW1W2)
105
+ just (m3'' , m3' , m≤m3'' , σ , σ3t , AppW1W2 , eraseAppW1W2≡AppS1S2 )
98
106
where
99
107
m3'' : ℕ
100
108
m3'' = suc m2' ∸ m2' + (m2'' ∸ m1' + m1'')
@@ -142,8 +150,10 @@ mutual
142
150
σ2t1 = substType≤ σ2 m1'≤m2'' t1
143
151
σ3σ2t1 : Type m3'
144
152
σ3σ2t1 = substType≤ σ3 (n≤m+n 1 m2') σ2t1
153
+ σ2w1 : WellTypedTerm σ2σ1Γ σ2t1
154
+ σ2w1 = substWTerm≤ σ2 m1'≤m2'' w1
145
155
σ3σ2w1 : WellTypedTerm σ3σ2σ1Γ σ3σ2t1
146
- σ3σ2w1 = substWTerm≤ σ3 (n≤m+n 1 m2') (substWTerm≤ σ2 m1'≤m2'' w1)
156
+ σ3σ2w1 = substWTerm≤ σ3 (n≤m+n 1 m2') σ2w1
147
157
-- w2
148
158
σ3t2 : Type m3'
149
159
σ3t2 = substType≤ σ3 (n≤m+n 1 m2') t2
@@ -163,26 +173,35 @@ mutual
163
173
W2 rewrite σΓ≡σ3σ2σ1Γ = σ3w2
164
174
AppW1W2 : WellTypedTerm σΓ σ3t
165
175
AppW1W2 = App W1 W2
176
+ -- erase
177
+ eraseAppW1W2≡AppS1S2 : erase AppW1W2 ≡ App s1 s2
178
+ eraseAppW1W2≡AppS1S2
179
+ rewrite σΓ≡σ3σ2σ1Γ | σ3t2⇒σ3t≡σ3σ2t1
180
+ | eraseSubstWTerm≤ σ3 (n≤m+n 1 m2') σ2w1
181
+ | eraseSubstWTerm≤ σ2 m1'≤m2'' w1
182
+ | eraseSubstWTerm≤ σ3 (n≤m+n 1 m2') w2 =
183
+ cong₂ App eraseW1≡S1 eraseW2≡S2
166
184
167
185
infer-Fst : (m : ℕ) → {n : ℕ} → (Γ : Cxt {m} n) → (s : WellScopedTerm n) →
168
186
Maybe (Σ[ m'' ∈ ℕ ]
169
187
Σ[ m' ∈ ℕ ]
170
188
Σ[ m≤m'' ∈ m ≤ m'' ]
171
189
Σ[ σ ∈ AListType m'' m' ]
172
190
Σ[ τ ∈ Type m' ]
173
- WellTypedTerm (substCxt≤ σ m≤m'' Γ) τ)
191
+ Σ[ w ∈ WellTypedTerm (substCxt≤ σ m≤m'' Γ) τ ]
192
+ erase w ≡ Fst s)
174
193
infer-Fst m {n} Γ s
175
194
with infer m Γ s
176
195
... | nothing = nothing
177
- ... | just (m1'' , m1' , m≤m1'' , σ1 , t , w)
196
+ ... | just (m1'' , m1' , m≤m1'' , σ1 , t , w , eraseW≡S )
178
197
with let t1 : Type (suc (suc m1')) -- new type variable
179
198
t1 = liftType≤ (n≤m+n 1 (suc m1')) (TVar (fromℕ m1'))
180
199
t2 : Type (suc (suc m1')) -- new type variable
181
200
t2 = TVar (fromℕ (suc m1'))
182
201
in mgu2 (liftType≤ (n≤m+n 2 m1') t) (t1 ∏ t2)
183
202
... | nothing = nothing
184
203
... | just (m2' , σ2 , σ2t≡σ2t1∏σ2t2) =
185
- just (m2'' , m2' , m≤m2'' , σ , σ2t1 , FstW)
204
+ just (m2'' , m2' , m≤m2'' , σ , σ2t1 , FstW , eraseFstW≡FstS )
186
205
where
187
206
m2'' : ℕ
188
207
m2'' = suc (suc m1') ∸ m1' + m1''
@@ -228,26 +247,33 @@ mutual
228
247
W rewrite σΓ≡σ2σ1Γ | σ2t1∏σ2t2'≡σ2t = σ2w
229
248
FstW : WellTypedTerm σΓ σ2t1
230
249
FstW = Fst W
250
+ -- erase
251
+ eraseFstW≡FstS : erase FstW ≡ Fst s
252
+ eraseFstW≡FstS
253
+ rewrite σΓ≡σ2σ1Γ | σ2t1∏σ2t2'≡σ2t
254
+ | eraseSubstWTerm≤ σ2 (n≤m+n 2 m1') w =
255
+ cong Fst eraseW≡S
231
256
232
257
infer-Snd : (m : ℕ) → {n : ℕ} → (Γ : Cxt {m} n) → (s : WellScopedTerm n) →
233
258
Maybe (Σ[ m'' ∈ ℕ ]
234
259
Σ[ m' ∈ ℕ ]
235
260
Σ[ m≤m'' ∈ m ≤ m'' ]
236
261
Σ[ σ ∈ AListType m'' m' ]
237
262
Σ[ τ ∈ Type m' ]
238
- WellTypedTerm (substCxt≤ σ m≤m'' Γ) τ)
263
+ Σ[ w ∈ WellTypedTerm (substCxt≤ σ m≤m'' Γ) τ ]
264
+ erase w ≡ Snd s)
239
265
infer-Snd m {n} Γ s
240
266
with infer m Γ s
241
267
... | nothing = nothing
242
- ... | just (m1'' , m1' , m≤m1'' , σ1 , t , w)
268
+ ... | just (m1'' , m1' , m≤m1'' , σ1 , t , w , eraseW≡S )
243
269
with let t1 : Type (suc (suc m1')) -- new type variable
244
270
t1 = liftType≤ (n≤m+n 1 (suc m1')) (TVar (fromℕ m1'))
245
271
t2 : Type (suc (suc m1')) -- new type variable
246
272
t2 = TVar (fromℕ (suc m1'))
247
273
in mgu2 (liftType≤ (n≤m+n 2 m1') t) (t1 ∏ t2)
248
274
... | nothing = nothing
249
275
... | just (m2' , σ2 , σ2t≡σ2t1∏σ2t2) =
250
- just (m2'' , m2' , m≤m2'' , σ , σ2t2 , SndW)
276
+ just (m2'' , m2' , m≤m2'' , σ , σ2t2 , SndW , eraseSndW≡SndS )
251
277
where
252
278
m2'' : ℕ
253
279
m2'' = suc (suc m1') ∸ m1' + m1''
@@ -293,24 +319,31 @@ mutual
293
319
W rewrite σΓ≡σ2σ1Γ | σ2t1∏σ2t2'≡σ2t = σ2w
294
320
SndW : WellTypedTerm σΓ σ2t2
295
321
SndW = Snd W
322
+ -- erase
323
+ eraseSndW≡SndS : erase SndW ≡ Snd s
324
+ eraseSndW≡SndS
325
+ rewrite σΓ≡σ2σ1Γ | σ2t1∏σ2t2'≡σ2t
326
+ | eraseSubstWTerm≤ σ2 (n≤m+n 2 m1') w =
327
+ cong Snd eraseW≡S
296
328
297
329
infer-Cons : (m : ℕ) → {n : ℕ} → (Γ : Cxt {m} n) → (s1 s2 : WellScopedTerm n) →
298
330
Maybe (Σ[ m'' ∈ ℕ ]
299
331
Σ[ m' ∈ ℕ ]
300
332
Σ[ m≤m'' ∈ m ≤ m'' ]
301
333
Σ[ σ ∈ AListType m'' m' ]
302
334
Σ[ τ ∈ Type m' ]
303
- WellTypedTerm (substCxt≤ σ m≤m'' Γ) τ)
335
+ Σ[ w ∈ WellTypedTerm (substCxt≤ σ m≤m'' Γ) τ ]
336
+ erase w ≡ Cons s1 s2)
304
337
infer-Cons m {n} Γ s1 s2
305
338
with infer m Γ s1
306
339
... | nothing = nothing
307
- ... | just (m1'' , m1' , m≤m1'' , σ1 , t1 , w1)
340
+ ... | just (m1'' , m1' , m≤m1'' , σ1 , t1 , w1 , eraseW1≡S1 )
308
341
with let σ1Γ : Cxt {m1'} n
309
342
σ1Γ = substCxt≤ σ1 m≤m1'' Γ
310
343
in infer m1' σ1Γ s2
311
344
... | nothing = nothing
312
- ... | just (m2'' , m2' , m1'≤m2'' , σ2 , t2 , w2) =
313
- just (m2'' ∸ m1' + m1'' , m2' , m≤m2''∸m1'+m1'' , σ , τ , ConsW1W2)
345
+ ... | just (m2'' , m2' , m1'≤m2'' , σ2 , t2 , w2 , eraseW2≡S2 ) =
346
+ just (m2'' ∸ m1' + m1'' , m2' , m≤m2''∸m1'+m1'' , σ , τ , ConsW1W2 , eraseConsW1W2≡ConsS1S2 )
314
347
where
315
348
m≤m2''∸m1'+m1'' : m ≤ m2'' ∸ m1' + m1''
316
349
m≤m2''∸m1'+m1'' =
@@ -350,3 +383,9 @@ mutual
350
383
τ = σ2t1 ∏ t2
351
384
ConsW1W2 : WellTypedTerm σΓ τ
352
385
ConsW1W2 = Cons W1 W2
386
+ -- erase
387
+ eraseConsW1W2≡ConsS1S2 : erase ConsW1W2 ≡ Cons s1 s2
388
+ eraseConsW1W2≡ConsS1S2
389
+ rewrite σΓ≡σ2σ1Γ
390
+ | eraseSubstWTerm≤ σ2 m1'≤m2'' w1
391
+ = cong₂ Cons eraseW1≡S1 eraseW2≡S2
0 commit comments