blob: c211ce3333174852b244f16e39c166da0c54834b (
plain)
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
|
module Core.Var
import Core.Context
import Core.Thinning
%prefix_record_projections off
-- Variables -------------------------------------------------------------------
data IsVar : Nat -> Context -> Type where
Here : IsVar 0 (sx :< n)
There : IsVar k sx -> IsVar (S k) (sx :< n)
export
record Var (sx : Context) where
constructor MakeVar
index : Nat
0 prf : IsVar index sx
%name IsVar prf
%name Var i, j, k
-- Constructors ----------------------------------------------------------------
export
here : Var (sx :< n)
here = MakeVar 0 Here
export
there : Var sx -> Var (sx :< n)
there (MakeVar index prf) = MakeVar (S index) (There prf)
-- Views -----------------------------------------------------------------------
namespace View
public export
data View : Var sx -> Type where
Here : View (here {sx, n})
There : (i : Var sx) -> View (there i)
%name View.View view
export
view : (i : Var sx) -> View i
view (MakeVar 0 Here) = Here
view (MakeVar (S k) (There prf)) = There (MakeVar k prf)
-- Views are Unique
viewInverse : {0 i : Var sx} -> View i -> Var sx
viewInverse Here = here
viewInverse (There i) = there i
viewInversePrf1 : (view : View i) -> viewInverse view = i
viewInversePrf1 Here = Refl
viewInversePrf1 (There i) = Refl
viewInversePrf2 :
{0 i : Var sx} ->
(v : View i) ->
view (viewInverse v) = (rewrite viewInversePrf1 v in v)
viewInversePrf2 Here = Refl
viewInversePrf2 (There (MakeVar index prf)) = Refl
export
viewUnique : {0 i : Var sx} -> (view1, view2 : View i) -> view1 = view2
viewUnique view1 view2 =
rewrite sym $ viewInversePrf2 view1 in
rewrite sym $ viewInversePrf2 view2 in
rewrite viewInversePrf1 view1 in
rewrite viewInversePrf1 view2 in
Refl
-- Weakening -------------------------------------------------------------------
doWkn : Var sx -> {0 thin : sx `Thins` sy} -> View thin -> Var sy
doWkn' : {0 i : Var (sx :< n)} -> View i -> sx `Thins` sy -> Var (sy :< n)
doWkn i (Id sy) = i
doWkn i (Drop thin n) = there $ doWkn i (view thin)
doWkn i (Keep thin n) = doWkn' (view i) thin
doWkn' Here thin = here
doWkn' (There i) thin = there $ doWkn i (view thin)
export
wkn : Var sx -> sx `Thins` sy -> Var sy
wkn i thin = doWkn i (view thin)
-- Respects Identity
export
wknId : (i : Var sx) -> wkn i (id sx) = i
wknId i = cong (doWkn i) $ viewUnique (view (id sx)) (Id sx)
-- Is Homomorphic
export
doWknHomo :
(i : Var sx) ->
{thin1 : sx `Thins` sy} ->
{thin2 : sy `Thins` sz} ->
(view1 : View thin1) ->
(view2 : View thin2) ->
doWkn (doWkn i view1) view2 = wkn i (thin2 . thin1)
doWknHomo' :
{0 i : Var (sx :< n)} ->
(v : View i) ->
(thin1 : sx `Thins` sy) ->
(thin2 : sy `Thins` sz) ->
doWkn' (view $ doWkn' v thin1) thin2 = doWkn' v (thin2 . thin1)
doWknHomo i view1 (Id sz) =
rewrite compLeftIdentity thin1 in
cong (doWkn i) $ viewUnique view1 (view thin1)
doWknHomo i view1 (Drop thin2 n) =
rewrite compLeftDrop thin2 thin1 n in
rewrite
viewUnique
(view $ drop (thin2 . thin1) n)
(Drop (thin2 . thin1) n)
in
cong there $ doWknHomo i view1 (view thin2)
doWknHomo i (Id _) (Keep thin2 n) =
rewrite compRightIdentity $ keep thin2 n in
rewrite
viewUnique
(view $ keep thin2 n)
(Keep thin2 n)
in
Refl
doWknHomo i (Drop thin1 n) (Keep thin2 n) =
rewrite compRightDrop thin2 thin1 n in
rewrite
viewUnique
(view $ drop (thin2 . thin1) n)
(Drop (thin2 . thin1) n)
in
rewrite
Var.viewUnique
(view $ there {n} $ doWkn i $ view thin1)
(There $ doWkn i $ view thin1)
in
cong there $ doWknHomo i (view thin1) (view thin2)
doWknHomo i (Keep {prf = prf1} thin1 n) (Keep {prf = prf2} thin2 n) =
rewrite compKeep thin2 thin1 n in
rewrite
viewUnique
(view $ keep (thin2 . thin1) n)
(Keep {prf = compPresNotId prf2 prf1} (thin2 . thin1) n)
in
doWknHomo' (view i) thin1 thin2
doWknHomo' Here thin1 thin2 = Refl
doWknHomo' (There i) thin1 thin2 =
rewrite
viewUnique
(view $ there {n} $ doWkn i $ view thin1)
(There $ doWkn i $ view thin1)
in
cong there $ doWknHomo i (view thin1) (view thin2)
export
wknHomo :
(i : Var sx) ->
(thin1 : sx `Thins` sy) ->
(thin2 : sy `Thins` sz) ->
wkn (wkn i thin1) thin2 = wkn i (thin2 . thin1)
wknHomo i thin1 thin2 = doWknHomo i (view thin1) (view thin2)
-- Concrete weakenings
export
wknDropIsThere :
(i : Var sx) ->
(thin : sx `Thins` sy) ->
(0 n : Name) ->
wkn i (drop thin n) = there (wkn i thin)
wknDropIsThere i thin n = rewrite viewUnique (view $ drop thin n) (Drop thin n) in Refl
export
wknKeepHereIsHere :
(thin : sx `Thins` sy) ->
(0 n : Name) ->
wkn Core.Var.here (keep thin n) = Core.Var.here
wknKeepHereIsHere thin n = lemma $ view thin
where
lemma :
forall sx, sy.
{0 thin : sx `Thins` sy} ->
View thin ->
wkn Core.Var.here (keep thin n) = Core.Var.here
lemma (Id sx) =
rewrite keepIdIsId sx n in
rewrite viewUnique (view $ id $ sx :< n) (Id $ sx :< n) in
Refl
lemma (Drop thin m) =
rewrite viewUnique (view $ keep (drop thin m) n) (Keep {prf = dropIsNotId thin m} _ n) in
Refl
lemma (Keep {prf} thin m) =
rewrite
viewUnique
(view $ keep (keep thin m) n)
(Keep {prf = keepNotIdIsNotId prf m} (keep thin m) n)
in
Refl
export
wknKeepThereIsThere :
(i : Var sx) ->
(thin : sx `Thins` sy) ->
(0 n : Name) ->
wkn (there i) (keep thin n) = there (wkn i thin)
wknKeepThereIsThere i thin n = lemma i $ view thin
where
lemma :
forall sx, sy.
(i : Var sx) ->
{0 thin : sx `Thins` sy} ->
View thin ->
wkn (there i) (keep thin n) = there (wkn i thin)
lemma i (Id sx) =
rewrite keepIdIsId sx n in
rewrite viewUnique (view $ id $ sx :< n) (Id $ sx :< n) in
rewrite viewUnique (view $ id sx) (Id sx) in
Refl
lemma i (Drop thin m) =
rewrite viewUnique (view $ keep (drop thin m) n) (Keep {prf = dropIsNotId thin m} _ n) in
rewrite viewUnique (view $ there {n} i) (There i) in
Refl
lemma i (Keep {prf} thin m) =
rewrite
viewUnique
(view $ keep (keep thin m) n)
(Keep {prf = keepNotIdIsNotId prf m} (keep thin m) n)
in
rewrite viewUnique (view $ there {n} i) (There i) in
Refl
|