1272343Sngie(*****************************************************************************)
2272343Sngie(* Create "ExtendedSyntaxTheory" representing abstract syntax of full PSL    *)
3272343Sngie(*****************************************************************************)
4272343Sngie
5272343Sngie(*****************************************************************************)
6272343Sngie(* START BOILERPLATE                                                         *)
7272343Sngie(*****************************************************************************)
8272343Sngie
9272343Sngie(******************************************************************************
10272343Sngie* Boilerplate needed for compilation
11272343Sngie******************************************************************************)
12272343Sngieopen HolKernel Parse boolLib bossLib;
13272343Sngie
14272343Sngie(******************************************************************************
15272343Sngie* Open theories
16272343Sngie******************************************************************************)
17272343Sngieopen intLib stringLib stringTheory SyntaxTheory SyntacticSugarTheory;
18272343Sngie
19272343Sngie(******************************************************************************
20272343Sngie* Set default parsing to natural numbers rather than integers
21272343Sngie******************************************************************************)
22272343Sngieval _ = intLib.deprecate_int();
23272343Sngie
24272343Sngie(*****************************************************************************)
25272343Sngie(* END BOILERPLATE                                                           *)
26272343Sngie(*****************************************************************************)
27272343Sngie
28272343Sngie(******************************************************************************
29272343Sngie* Start a new theory called ExtendedSyntaxTheory
30272343Sngie******************************************************************************)
31272343Sngieval _ = new_theory "ExtendedSyntax";
32272343Sngie
33272343Sngie(******************************************************************************
34272343Sngie* Extended boolean expressions
35272343Sngie******************************************************************************)
36272343Sngieval ebexp_def =
37272343Sngie time
38272343Sngie Hol_datatype
39272343Sngie  `ebexp =
40272343Sngie    EB_PROP              of string                (* atomic proposition      *)
41272343Sngie  | EB_NOT               of ebexp                 (* negation                *)
42272343Sngie  | EB_AND               of ebexp # ebexp         (* conjunction             *)
43272343Sngie(*=========  Following are defined operators (i.e. syntactic sugar) =========*)
44272343Sngie  | EB_OR                of ebexp # ebexp         (* disjunction             *)
45272343Sngie  | EB_IMP               of ebexp # ebexp         (* implication             *)
46272343Sngie  | EB_IFF               of ebexp # ebexp         (* logical equivalence     *)
47272343Sngie  | EB_TRUE                                       (* T                       *)
48272343Sngie  | EB_FALSE                                      (* F                       *)
49272343Sngie  `;
50272343Sngie
51272343Sngie(******************************************************************************
52272343Sngie* Specification of an iteration number or range (Count of LRM A.3.6)
53272343Sngie******************************************************************************)
54272343Sngieval _ = type_abbrev("range", ``:num # num option``);
55272343Sngie
56272343Sngie(******************************************************************************
57272343Sngie* Extended Sequential Extended Regular Expressions (SEREs)
58272343Sngie******************************************************************************)
59272343Sngieval esere_def =
60 time
61 Hol_datatype
62  `esere =
63    ES_BOOL              of ebexp                 (* boolean expression      *)
64  | ES_CAT               of esere # esere         (* r1 ;  r2                *)
65  | ES_FUSION            of esere # esere         (* r1 :  r2                *)
66  | ES_OR                of esere # esere         (* r1 |  r2                *)
67  | ES_AND               of esere # esere         (* r1 && r2                *)
68  | ES_REPEAT            of esere                 (* r[*]                    *)
69  | ES_CLOCK             of esere # ebexp         (* r@clk                   *)
70(*=========  Following are defined operators (i.e. syntactic sugar) =========*)
71  | ES_FLEX_AND          of esere # esere         (* r1 &  r2                *)
72  | ES_RANGE_REPEAT      of esere # range         (* r[* i]                  *)
73  | ES_NON_ZERO_REPEAT   of esere                 (* r[+]                    *)
74  | ES_RANGE_EQ_REPEAT   of ebexp # range         (* b[= i]                  *)
75  | ES_RANGE_GOTO_REPEAT of ebexp # range         (* b[-> i]                 *)
76  `;
77
78(******************************************************************************
79* Extended Formulas
80* runtime: 589.300s,    gctime: 151.590s,     systime: 3.800s. (on bass)
81******************************************************************************)
82val efl_def =
83 time
84 Hol_datatype
85  `efl =
86    EF_BOOL              of ebexp                 (* boolean expression      *)
87  | EF_NOT               of efl                   (* \neg f                  *)
88  | EF_AND               of efl # efl             (* f1 \wedge f2            *)
89  | EF_STRONG_X          of efl                   (* X! f                    *)
90  | EF_U                 of efl # efl             (* [f1 U f2]               *)
91  | EF_SUFFIX_IMP        of esere # efl           (* {r}(f)                  *)
92  | EF_STRONG_IMP        of esere # esere         (* {r1} |-> {r2}!          *)
93  | EF_WEAK_IMP          of esere # esere         (* {r1} |-> {r2}           *)
94  | EF_ABORT             of efl # ebexp           (* f abort b               *)
95  | EF_STRONG_CLOCK      of efl # ebexp           (* f@clk!                  *)
96(*=========  Following are defined operators (i.e. syntactic sugar) =========*)
97  | EF_WEAK_CLOCK        of efl # ebexp           (* f@clk                   *)
98  | EF_OR                of efl # efl             (* f1 \vee f2              *)
99  | EF_IMP               of efl # efl             (* f1 \rightarrow f2       *)
100  | EF_IFF               of efl # efl             (* f1 \leftrightarrow f2   *)
101  | EF_WEAK_X            of efl                   (* X f                     *)
102  | EF_F                 of efl                   (* F f                     *)
103  | EF_G                 of efl                   (* G f                     *)
104  | EF_W                 of efl # efl             (* [f1 W f2]               *)
105  | EF_ALWAYS            of efl                   (* always f                *)
106  | EF_NEVER             of efl                   (* never f                 *)
107  | EF_WEAK_NEXT         of efl                   (* next f                  *)
108  | EF_STRONG_NEXT       of efl                   (* next! f                 *)
109  | EF_STRONG_EVENTUALLY of efl                   (* next! f                 *)
110  | EF_STRONG_UNTIL      of efl # efl             (* [f1 until! f2]          *)
111  | EF_WEAK_UNTIL        of efl # efl             (* [f1 until f2]           *)
112  | EF_STRONG_UNTIL_INC  of efl # efl             (* [f1 until!_ f2]         *)
113  | EF_WEAK_UNTIL_INC    of efl # efl             (* [f1 until_ f2]          *)
114  | EF_STRONG_BEFORE     of efl # efl             (* [f1 before! f2]         *)
115  | EF_WEAK_BEFORE       of efl # efl             (* [f1 before f2]          *)
116  | EF_STRONG_BEFORE_INC
117                         of efl # efl             (* [f1 before!_ f2]        *)
118  | EF_WEAK_BEFORE_INC   of efl # efl             (* [f1 before_ f2]         *)
119  | EF_NUM_WEAK_X        of num # efl             (* X[n](f)                 *)
120  | EF_NUM_STRONG_X      of num # efl             (* X![n](f)                *)
121  | EF_NUM_WEAK_NEXT     of num # efl             (* next[n](f)              *)
122  | EF_NUM_STRONG_NEXT   of num # efl             (* next![n](f)             *)
123  | EF_NUM_WEAK_NEXT_A   of range # efl           (* next_a[n](f)            *)
124  | EF_NUM_STRONG_NEXT_A of range # efl            (* next_a![n](f)           *)
125  | EF_NUM_WEAK_NEXT_E   of range # efl           (* next_e[n](f)            *)
126  | EF_NUM_STRONG_NEXT_E of range # efl            (* next_e![n](f)           *)
127  | EF_STRONG_NEXT_EVENT of ebexp # efl            (* next_event!(b)(f)       *)
128  | EF_WEAK_NEXT_EVENT   of ebexp # efl           (* next_event(b)(f)        *)
129  | EF_NUM_STRONG_NEXT_EVENT
130                         of ebexp # num # efl     (* next_event!(b)[i](f)    *)
131  | EF_NUM_WEAK_NEXT_EVENT
132                         of ebexp # num # efl     (* next_event(b)[i](f)     *)
133  | EF_NUM_STRONG_NEXT_EVENT_A
134                         of ebexp # range # efl   (* next_event_a!(b)[i](f)  *)
135  | EF_NUM_WEAK_NEXT_EVENT_A
136                         of ebexp # range # efl   (* next_event_a(b)[i](f)   *)
137  | EF_NUM_STRONG_NEXT_EVENT_E
138                         of ebexp # range # efl   (* next_event_e!(b)[i](f)  *)
139  | EF_NUM_WEAK_NEXT_EVENT_E
140                         of ebexp # range # efl   (* next_event_e(b)[i](f)   *)
141  | EF_SKIP_STRONG_IMP   of esere # esere         (* {r1} |=> {r2}!          *)
142  | EF_SKIP_WEAK_IMP     of esere # esere         (* {r1} |=> {r2}           *)
143  | EF_SERE_ALWAYS       of esere                 (* always r                *)
144  | EF_SERE_NEVER        of esere                 (* never r                 *)
145  | EF_SERE_STRONG_EVENTUALLY
146                         of esere                 (* eventually! r           *)
147  | EF_STRONG_WITHIN     of esere # ebexp # esere (* within!(r1,b)r2         *)
148  | EF_WEAK_WITHIN       of esere # ebexp # esere (* within(r1,b)r2          *)
149  | EF_STRONG_WITHIN_INC of esere # ebexp # esere (* within!_(r1,b)r2        *)
150  | EF_WEAK_WITHIN_INC   of esere # ebexp # esere (* within_(r1,b)r2         *)
151  | EF_STRONG_WHILENOT   of ebexp # esere         (* whilenot!(b)r           *)
152  | EF_WEAK_WHILENOT     of ebexp # esere         (* whilenot(b)r            *)
153  | EF_STRONG_WHILENOT_INC
154                         of ebexp # esere         (* whilenot!_(b)r          *)
155  | EF_WEAK_WHILENOT_INC of ebexp # esere         (* whilenot_(b)r           *)
156  `;
157
158
159(******************************************************************************
160* Translate booleans from extended syntax into core syntax
161******************************************************************************)
162val B_DESUGAR_def =
163 Define
164  `(B_DESUGAR(EB_PROP p)     = B_PROP p)                          /\
165   (B_DESUGAR(EB_NOT b)      = B_NOT(B_DESUGAR b))                /\
166   (B_DESUGAR(EB_AND(b1,b2)) = B_AND(B_DESUGAR b1, B_DESUGAR b2)) /\
167   (B_DESUGAR(EB_OR(b1,b2))  = B_OR(B_DESUGAR b1, B_DESUGAR b2))  /\
168   (B_DESUGAR(EB_IMP(b1,b2)) = B_IMP(B_DESUGAR b1, B_DESUGAR b2)) /\
169   (B_DESUGAR(EB_IFF(b1,b2)) = B_IFF(B_DESUGAR b1, B_DESUGAR b2)) /\
170   (B_DESUGAR EB_TRUE        = B_TRUE)                            /\
171   (B_DESUGAR EB_FALSE       = B_FALSE)`;
172
173
174(******************************************************************************
175* Translate extended SEREs into core syntax
176******************************************************************************)
177val S_DESUGAR_def =
178 Define
179  `(S_DESUGAR(ES_BOOL b) =
180     S_BOOL(B_DESUGAR b))
181   /\
182   (S_DESUGAR(ES_CAT(r1,r2)) =
183     S_CAT(S_DESUGAR r1, S_DESUGAR r2))
184   /\
185   (S_DESUGAR(ES_FUSION(r1,r2)) =
186     S_FUSION(S_DESUGAR r1, S_DESUGAR r2))
187   /\
188   (S_DESUGAR(ES_OR(r1,r2)) =
189     S_OR(S_DESUGAR r1, S_DESUGAR r2))
190   /\
191   (S_DESUGAR(ES_AND(r1,r2)) =
192     S_AND(S_DESUGAR r1, S_DESUGAR r2))
193   /\
194   (S_DESUGAR(ES_REPEAT r) =
195     S_REPEAT(S_DESUGAR r))
196   /\
197   (S_DESUGAR(ES_CLOCK(r,b)) =
198     S_CLOCK(S_DESUGAR r, B_DESUGAR b))
199   /\
200   (S_DESUGAR(ES_FLEX_AND(r1,r2)) =
201     S_FLEX_AND(S_DESUGAR r1, S_DESUGAR r2))
202   /\
203   (S_DESUGAR(ES_RANGE_REPEAT(r,rng)) =
204     S_RANGE_REPEAT(S_DESUGAR r, rng))
205   /\
206   (S_DESUGAR(ES_NON_ZERO_REPEAT r) =
207     S_NON_ZERO_REPEAT(S_DESUGAR r))
208   /\
209   (S_DESUGAR(ES_RANGE_EQ_REPEAT(b, rng)) =
210     S_RANGE_EQ_REPEAT(B_DESUGAR b, rng))
211   /\
212   (S_DESUGAR(ES_RANGE_GOTO_REPEAT(b,rng)) =
213     S_RANGE_GOTO_REPEAT(B_DESUGAR b, rng))`;
214
215(******************************************************************************
216* Definitions connecting syntax-oriented names with semantic constants
217******************************************************************************)
218val F_STRONG_X_def = Define `F_STRONG_X = F_NEXT`;
219
220val F_U_def = Define `F_U = F_UNTIL`;
221
222val F_IMP_def = Define `F_IMP = F_IMPLIES`;
223
224(******************************************************************************
225* Translate extended formulas into core syntax
226******************************************************************************)
227val F_DESUGAR_def =
228 Define
229  `(F_DESUGAR(EF_BOOL b) =
230     F_BOOL(B_DESUGAR b))
231   /\
232   (F_DESUGAR(EF_NOT f) =
233     F_NOT(F_DESUGAR f))
234   /\
235   (F_DESUGAR(EF_AND(f1,f2)) =
236     F_AND(F_DESUGAR f1, F_DESUGAR f2))
237   /\
238   (F_DESUGAR(EF_STRONG_X f) =
239     F_STRONG_X(F_DESUGAR f))
240   /\
241   (F_DESUGAR(EF_U(f1,f2)) =
242     F_U(F_DESUGAR f1, F_DESUGAR f2))
243   /\
244   (F_DESUGAR(EF_SUFFIX_IMP(r,f)) =
245     F_SUFFIX_IMP(S_DESUGAR r, F_DESUGAR f))
246   /\
247   (F_DESUGAR(EF_STRONG_IMP(r1,r2)) =
248     F_STRONG_IMP(S_DESUGAR r1, S_DESUGAR r2))
249   /\
250   (F_DESUGAR(EF_WEAK_IMP(r1,r2)) =
251     F_WEAK_IMP(S_DESUGAR r1, S_DESUGAR r2))
252   /\
253   (F_DESUGAR(EF_ABORT(f,b)) =
254     F_ABORT(F_DESUGAR f, B_DESUGAR b))
255   /\
256   (F_DESUGAR(EF_STRONG_CLOCK(f,b)) =
257     F_STRONG_CLOCK(F_DESUGAR f, B_DESUGAR b))
258   /\
259   (F_DESUGAR(EF_WEAK_CLOCK(f,b)) =
260     F_WEAK_CLOCK(F_DESUGAR f, B_DESUGAR b))
261   /\
262   (F_DESUGAR(EF_OR(f1,f2)) =
263     F_OR(F_DESUGAR f1, F_DESUGAR f2))
264   /\
265   (F_DESUGAR(EF_IMP(f1,f2)) =
266     F_IMP(F_DESUGAR f1, F_DESUGAR f2))
267   /\
268   (F_DESUGAR(EF_IFF(f1,f2)) =
269     F_IFF(F_DESUGAR f1, F_DESUGAR f2))
270   /\
271   (F_DESUGAR(EF_WEAK_X f) =
272     F_WEAK_X(F_DESUGAR f))
273   /\
274   (F_DESUGAR(EF_F f) =
275     F_F(F_DESUGAR f))
276   /\
277   (F_DESUGAR(EF_G f) =
278     F_G(F_DESUGAR f))
279   /\
280   (F_DESUGAR(EF_W(f1,f2)) =
281     F_W(F_DESUGAR f1, F_DESUGAR f2))
282   /\
283   (F_DESUGAR(EF_ALWAYS f) =
284     F_ALWAYS(F_DESUGAR f))
285   /\
286   (F_DESUGAR(EF_NEVER f) =
287     F_NEVER(F_DESUGAR f))
288   /\
289   (F_DESUGAR(EF_WEAK_NEXT f) =
290     F_WEAK_NEXT(F_DESUGAR f))
291   /\
292   (F_DESUGAR(EF_STRONG_NEXT f) =
293     F_STRONG_NEXT(F_DESUGAR f))
294   /\
295   (F_DESUGAR(EF_STRONG_EVENTUALLY f) =
296     F_STRONG_EVENTUALLY(F_DESUGAR f))
297   /\
298   (F_DESUGAR(EF_STRONG_UNTIL(f1,f2)) =
299     F_STRONG_UNTIL(F_DESUGAR f1, F_DESUGAR f2))
300   /\
301   (F_DESUGAR(EF_WEAK_UNTIL(f1,f2)) =
302     F_WEAK_UNTIL(F_DESUGAR f1, F_DESUGAR f2))
303   /\
304   (F_DESUGAR(EF_STRONG_UNTIL_INC(f1,f2)) =
305     F_STRONG_UNTIL_INC(F_DESUGAR f1, F_DESUGAR f2))
306   /\
307   (F_DESUGAR(EF_WEAK_UNTIL_INC(f1,f2)) =
308     F_WEAK_UNTIL_INC(F_DESUGAR f1, F_DESUGAR f2))
309   /\
310   (F_DESUGAR(EF_STRONG_BEFORE(f1,f2)) =
311     F_STRONG_BEFORE(F_DESUGAR f1, F_DESUGAR f2))
312   /\
313   (F_DESUGAR(EF_WEAK_BEFORE(f1,f2)) =
314     F_WEAK_BEFORE(F_DESUGAR f1, F_DESUGAR f2))
315   /\
316   (F_DESUGAR(EF_STRONG_BEFORE_INC(f1,f2)) =
317     F_STRONG_BEFORE_INC(F_DESUGAR f1, F_DESUGAR f2))
318   /\
319   (F_DESUGAR(EF_WEAK_BEFORE_INC(f1,f2)) =
320     F_WEAK_BEFORE_INC(F_DESUGAR f1, F_DESUGAR f2))
321   /\
322   (F_DESUGAR(EF_NUM_WEAK_X(n,f)) =
323     F_NUM_WEAK_X(n, F_DESUGAR f))
324   /\
325   (F_DESUGAR(EF_NUM_STRONG_X(n,f)) =
326     F_NUM_STRONG_X(n, F_DESUGAR f))
327   /\
328   (F_DESUGAR(EF_NUM_WEAK_NEXT(n,f)) =
329     F_NUM_WEAK_NEXT(n, F_DESUGAR f))
330   /\
331   (F_DESUGAR(EF_NUM_STRONG_NEXT(n,f)) =
332     F_NUM_STRONG_NEXT(n, F_DESUGAR f))
333   /\
334   (F_DESUGAR(EF_NUM_WEAK_NEXT_A(rng,f)) =
335     F_NUM_WEAK_NEXT_A(rng, F_DESUGAR f))
336   /\
337   (F_DESUGAR(EF_NUM_STRONG_NEXT_A(rng,f)) =
338     F_NUM_STRONG_NEXT_A(rng, F_DESUGAR f))
339   /\
340   (F_DESUGAR(EF_NUM_WEAK_NEXT_E(rng,f)) =
341     F_NUM_WEAK_NEXT_E(rng, F_DESUGAR f))
342   /\
343   (F_DESUGAR(EF_NUM_STRONG_NEXT_E(rng,f)) =
344     F_NUM_STRONG_NEXT_E(rng, F_DESUGAR f))
345   /\
346   (F_DESUGAR(EF_STRONG_NEXT_EVENT(b,f)) =
347     F_STRONG_NEXT_EVENT(B_DESUGAR b, F_DESUGAR f))
348   /\
349   (F_DESUGAR(EF_WEAK_NEXT_EVENT(b,f)) =
350     F_WEAK_NEXT_EVENT(B_DESUGAR b, F_DESUGAR f))
351   /\
352   (F_DESUGAR(EF_NUM_STRONG_NEXT_EVENT(b,n,f)) =
353     F_NUM_STRONG_NEXT_EVENT(B_DESUGAR b, n, F_DESUGAR f))
354   /\
355   (F_DESUGAR(EF_NUM_WEAK_NEXT_EVENT(b,n,f)) =
356     F_NUM_WEAK_NEXT_EVENT(B_DESUGAR b, n, F_DESUGAR f))
357   /\
358   (F_DESUGAR(EF_NUM_STRONG_NEXT_EVENT_A(b,rng,f)) =
359     F_NUM_STRONG_NEXT_EVENT_A(B_DESUGAR b, rng, F_DESUGAR f))
360   /\
361   (F_DESUGAR(EF_NUM_WEAK_NEXT_EVENT_A(b,rng,f)) =
362     F_NUM_WEAK_NEXT_EVENT_A(B_DESUGAR b, rng, F_DESUGAR f))
363   /\
364   (F_DESUGAR(EF_NUM_STRONG_NEXT_EVENT_E(b,rng,f)) =
365     F_NUM_STRONG_NEXT_EVENT_E(B_DESUGAR b, rng, F_DESUGAR f))
366   /\
367   (F_DESUGAR(EF_NUM_WEAK_NEXT_EVENT_E(b,rng,f)) =
368     F_NUM_WEAK_NEXT_EVENT_E(B_DESUGAR b, rng, F_DESUGAR f))
369   /\
370   (F_DESUGAR(EF_SKIP_STRONG_IMP(r1,r2)) =
371     F_SKIP_STRONG_IMP(S_DESUGAR r1, S_DESUGAR r2))
372   /\
373   (F_DESUGAR(EF_SKIP_WEAK_IMP(r1,r2)) =
374     F_SKIP_WEAK_IMP(S_DESUGAR r1, S_DESUGAR r2))
375   /\
376   (F_DESUGAR(EF_SERE_ALWAYS r) =
377     F_SERE_ALWAYS(S_DESUGAR r))
378   /\
379   (F_DESUGAR(EF_SERE_NEVER r) =
380     F_SERE_NEVER(S_DESUGAR r))
381   /\
382   (F_DESUGAR(EF_SERE_STRONG_EVENTUALLY r) =
383     F_SERE_STRONG_EVENTUALLY(S_DESUGAR r))
384   /\
385   (F_DESUGAR(EF_STRONG_WITHIN(r1,b,r2)) =
386     F_STRONG_WITHIN(S_DESUGAR r1, B_DESUGAR b, S_DESUGAR r2))
387   /\
388   (F_DESUGAR(EF_WEAK_WITHIN(r1,b,r2)) =
389     F_WEAK_WITHIN(S_DESUGAR r1, B_DESUGAR b, S_DESUGAR r2))
390   /\
391   (F_DESUGAR(EF_STRONG_WITHIN_INC(r1,b,r2)) =
392     F_STRONG_WITHIN_INC(S_DESUGAR r1, B_DESUGAR b, S_DESUGAR r2))
393   /\
394   (F_DESUGAR(EF_WEAK_WITHIN_INC(r1,b,r2)) =
395     F_WEAK_WITHIN_INC(S_DESUGAR r1, B_DESUGAR b, S_DESUGAR r2))
396   /\
397   (F_DESUGAR(EF_STRONG_WHILENOT(b,r)) =
398     F_STRONG_WHILENOT(B_DESUGAR b, S_DESUGAR r))
399   /\
400   (F_DESUGAR(EF_WEAK_WHILENOT(b,r)) =
401     F_WEAK_WHILENOT(B_DESUGAR b, S_DESUGAR r))
402   /\
403   (F_DESUGAR(EF_STRONG_WHILENOT_INC(b,r)) =
404     F_STRONG_WHILENOT_INC(B_DESUGAR b, S_DESUGAR r))
405   /\
406   (F_DESUGAR(EF_WEAK_WHILENOT_INC(b,r)) =
407     F_WEAK_WHILENOT_INC(B_DESUGAR b, S_DESUGAR r))`;
408
409val _ = export_theory();
410