-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdemo_context_sensitive.lean
281 lines (216 loc) · 6.89 KB
/
demo_context_sensitive.lean
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
import classes.context_sensitive.basics.toolbox
import utilities.list_utils
inductive Te
| a_ : Te
| b_ : Te
| c_ : Te
inductive Nt
| B_ : Nt
| C_ : Nt
| R_ : Nt
| S_ : Nt
| X_ : Nt
| Y_ : Nt
| Z_ : Nt
private def a : symbol Te Nt := symbol.terminal Te.a_
private def b : symbol Te Nt := symbol.terminal Te.b_
private def c : symbol Te Nt := symbol.terminal Te.c_
private def B : symbol Te Nt := symbol.nonterminal Nt.B_
private def C : symbol Te Nt := symbol.nonterminal Nt.C_
private def R : symbol Te Nt := symbol.nonterminal Nt.R_
private def S : symbol Te Nt := symbol.nonterminal Nt.S_
private def X : symbol Te Nt := symbol.nonterminal Nt.X_
private def Y : symbol Te Nt := symbol.nonterminal Nt.Y_
private def Z : symbol Te Nt := symbol.nonterminal Nt.Z_
/-- rule `S → aSBC | aRC` as two context-sensitive rules -/
private def r₁ : csrule Te Nt := csrule.mk [] Nt.S_ [] [a, S, B, C]
private def r₂ : csrule Te Nt := csrule.mk [] Nt.S_ [] [a, R, C]
/-- non-contracting rule `CB → BC` modelled by `CB → XB → XC → BC` which is context-sensitive -/
private def r₃ : csrule Te Nt := csrule.mk [] Nt.C_ [B] [X]
private def r₃' : csrule Te Nt := csrule.mk [X] Nt.B_ [] [C]
private def r₃'': csrule Te Nt := csrule.mk [] Nt.X_ [C] [B]
/-- non-contracting rule `RB → bR` modelled by `RB → YB → YR → bR` which is context-sensitive -/
private def r₄ : csrule Te Nt := csrule.mk [] Nt.R_ [B] [Y]
private def r₄' : csrule Te Nt := csrule.mk [Y] Nt.B_ [] [R]
private def r₄'': csrule Te Nt := csrule.mk [] Nt.Y_ [R] [b]
/-- non-contracting rule `RC → bc` modelled by `RC → ZC → Zc → bc` which is context-sensitive -/
private def r₅ : csrule Te Nt := csrule.mk [] Nt.R_ [C] [Z]
private def r₅' : csrule Te Nt := csrule.mk [Z] Nt.C_ [] [c]
private def r₅'': csrule Te Nt := csrule.mk [] Nt.Z_ [c] [b]
/-- context-sensitive rule `cC → cc` -/
private def r₆ : csrule Te Nt := csrule.mk [c] Nt.C_ [] [c]
private def my_grammar : CS_grammar Te :=
CS_grammar.mk Nt Nt.S_ [r₁, r₂, r₃, r₃', r₃'', r₄, r₄', r₄'', r₅, r₅', r₅'', r₆]
/-- generate `abc` by the grammar above -/
example : [Te.a_, Te.b_, Te.c_] ∈ CS_language my_grammar :=
begin
unfold my_grammar,
apply CS_deri_of_tran_deri,
{
use r₂,
split_ile,
use [[], []],
split;
refl,
},
apply CS_deri_of_tran_deri,
{
use r₅,
split_ile,
use [[a], []],
split;
refl,
},
apply CS_deri_of_tran_deri,
{
use r₅',
split_ile,
use [[a], []],
split;
refl,
},
apply CS_deri_of_tran,
{
use r₅'',
split_ile,
use [[a], []],
split;
refl,
},
end
private meta def CS_step (rule : pexpr) (pref post : pexpr) : tactic unit := `[
apply CS_deri_of_tran_deri,
tactic.use [rule],
split_ile,
tactic.use [pref, post],
split;
refl
]
/-- generate `aabbcc` by the grammar above -/
example : [Te.a_, Te.a_, Te.b_, Te.b_, Te.c_, Te.c_] ∈ CS_language my_grammar :=
begin
unfold my_grammar,
-- S
CS_step ``(r₁) ``([]) ``([]),
-- aSBC
CS_step ``(r₂) ``([a]) ``([B, C]),
-- aaRCBClet
CS_step ``(r₃) ``([a, a, R]) ``([C]),
CS_step ``(r₃') ``([a, a, R]) ``([C]),
CS_step ``(r₃'') ``([a, a, R]) ``([C]),
-- aaRBCC
CS_step ``(r₄) ``([a, a]) ``([C, C]),
CS_step ``(r₄') ``([a, a]) ``([C, C]),
CS_step ``(r₄'') ``([a, a]) ``([C, C]),
-- aabRCC
CS_step ``(r₅) ``([a, a, b]) ``([C]),
CS_step ``(r₅') ``([a, a, b]) ``([C]),
CS_step ``(r₅'') ``([a, a, b]) ``([C]),
-- aabbcC
CS_step ``(r₆) ``([a, a, b, b]) ``([]),
-- aabbcc
apply CS_deri_self,
end
private meta def combined_steps_r₃ (pre pos : pexpr) : tactic unit := `[
CS_step ``(r₃) pre pos,
CS_step ``(r₃') pre pos,
CS_step ``(r₃'') pre pos
]
private meta def combined_steps_r₄ (pre pos : pexpr) : tactic unit := `[
CS_step ``(r₄) pre pos,
CS_step ``(r₄') pre pos,
CS_step ``(r₄'') pre pos
]
/-- generate `aaabbbccc` by the grammar above -/
example : [Te.a_, Te.a_, Te.a_, Te.b_, Te.b_, Te.b_, Te.c_, Te.c_, Te.c_] ∈ CS_language my_grammar :=
begin
-- S
CS_step ``(r₁) ``([]) ``([]),
-- aSBC
CS_step ``(r₁) ``([a]) ``([B, C]),
-- aaSBCBC
CS_step ``(r₂) ``([a, a]) ``([B, C, B, C]),
-- aaaRCBCBC
combined_steps_r₃ ``([a, a, a, R]) ``([C, B, C]),
-- aaaRBCCBC
combined_steps_r₃ ``([a, a, a, R, B, C]) ``([C]),
-- aaaRBCBCC
combined_steps_r₃ ``([a, a, a, R, B]) ``([C, C]),
-- aaaRBBCCC
combined_steps_r₄ ``([a, a, a]) ``([B, C, C, C]),
-- aaabRBCCC
combined_steps_r₄ ``([a, a, a, b]) ``([C, C, C]),
-- aaabbRCCC
CS_step ``(r₅) ``([a, a, a, b, b]) ``([C, C]),
CS_step ``(r₅') ``([a, a, a, b, b]) ``([C, C]),
CS_step ``(r₅'') ``([a, a, a, b, b]) ``([C, C]),
-- aaabbbcCC
CS_step ``(r₆) ``([a, a, a, b, b, b]) ``([C]),
-- aaabbbccC
CS_step ``(r₆) ``([a, a, a, b, b, b, c]) ``([]),
-- aaabbbccc
apply CS_deri_self,
end
/-- generate ` a^4 . b^4 . c^4 ` by the grammar above -/
example : [Te.a_, Te.a_, Te.a_, Te.a_,
Te.b_, Te.b_, Te.b_, Te.b_,
Te.c_, Te.c_, Te.c_, Te.c_]
∈ CS_language my_grammar :=
begin
-- .S.
CS_step ``(r₁) ``([]) ``([]),
-- .aSBC.
-- a.S.BC
CS_step ``(r₁) ``([a]) ``([B, C]),
-- a.aSBC.BC
-- aa.S.BCBC
CS_step ``(r₁) ``([a, a]) ``([B, C, B, C]),
-- aa.aSBC.BCBC
-- aaa.S.BCBCBC
CS_step ``(r₂) ``([a, a, a]) ``([B, C, B, C, B, C]),
-- aaa.aRC.BCBCBC
-- aaaaR.CB.CBCBC
combined_steps_r₃ ``([a, a, a, a, R]) ``([C, B, C, B, C]),
-- aaaaR.BC.CBCBC
-- aaaaRBC.CB.CBC
combined_steps_r₃ ``([a, a, a, a, R, B, C]) ``([C, B, C]),
-- aaaaRBC.BC.CBC
-- aaaaRB.CB.CCBC
combined_steps_r₃ ``([a, a, a, a, R, B]) ``([C, C, B, C]),
-- aaaaRB.BC.CCBC
-- aaaaRBBCC.CB.C
combined_steps_r₃ ``([a, a, a, a, R, B, B, C, C]) ``([C]),
-- aaaaRBBCC.BC.C
-- aaaaRBBC.CB.CC
combined_steps_r₃ ``([a, a, a, a, R, B, B, C]) ``([C, C]),
-- aaaaRBBC.BC.CC
-- aaaaRBB.CB.CCC
combined_steps_r₃ ``([a, a, a, a, R, B, B]) ``([C, C, C]),
-- aaaaRBB.BC.CCC
-- aaaa.RB.BBCCCC
combined_steps_r₄ ``([a, a, a, a]) ``([B, B, C, C, C, C]),
-- aaaa.bR.BBCCCC
-- aaaab.RB.BCCCC
combined_steps_r₄ ``([a, a, a, a, b]) ``([B, C, C, C, C]),
-- aaaab.bR.BCCCC
-- aaaabb.RB.CCCC
combined_steps_r₄ ``([a, a, a, a, b, b]) ``([C, C, C, C]),
-- aaaabb.bR.CCCC
-- aaaabbb.RC.CCC
CS_step ``(r₅) ``([a, a, a, a, b, b, b]) ``([C, C, C]),
-- aaaabbb.ZC.CCC
CS_step ``(r₅') ``([a, a, a, a, b, b, b]) ``([C, C, C]),
-- aaaabbb.Zc.CCC
CS_step ``(r₅'') ``([a, a, a, a, b, b, b]) ``([C, C, C]),
-- aaaabbb.bc.CCC
-- aaaabbbb.cC.CC
CS_step ``(r₆) ``([a, a, a, a, b, b, b, b]) ``([C, C]),
-- aaaabbbb.cc.CC
-- aaaabbbbc.cC.C
CS_step ``(r₆) ``([a, a, a, a, b, b, b, b, c]) ``([C]),
-- aaaabbbbc.cc.C
-- aaaabbbbcc.cC.
CS_step ``(r₆) ``([a, a, a, a, b, b, b, b, c, c]) ``([]),
-- aaaabbbbcc.cc.
apply CS_deri_self,
end