tla-ts 0.0.1 → 0.0.3-dev.6979965

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +85 -40
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.d.cts +215 -30
  4. package/dist/index.d.ts +215 -30
  5. package/dist/index.js +1 -1
  6. package/dist/parallel-worker.cjs +2 -2
  7. package/dist/parallel-worker.js +2 -2
  8. package/dist/parallel.cjs +1 -1
  9. package/dist/parallel.js +2 -2
  10. package/dist/run-cli.cjs +20 -1
  11. package/dist/run-cli.js +20 -1
  12. package/dist/transfer.cjs +388 -39
  13. package/dist/transfer.js +388 -39
  14. package/package.json +6 -2
  15. package/src/ast.ts +122 -5
  16. package/src/bags.ts +161 -71
  17. package/src/builtins.ts +203 -23
  18. package/src/bundled-modules.ts +63 -32
  19. package/src/check.ts +945 -238
  20. package/src/cli-options.ts +58 -0
  21. package/src/codegen.ts +52 -18
  22. package/src/config.ts +39 -11
  23. package/src/environment.ts +485 -140
  24. package/src/errors.ts +59 -1
  25. package/src/evaluate.ts +489 -137
  26. package/src/exit-codes.ts +75 -0
  27. package/src/fingerprints.ts +48 -13
  28. package/src/index.ts +9 -4
  29. package/src/instances.ts +221 -66
  30. package/src/java-overrides.ts +241 -0
  31. package/src/json.ts +153 -72
  32. package/src/levels.ts +850 -0
  33. package/src/lexer.ts +103 -28
  34. package/src/liveness.ts +47 -91
  35. package/src/obligation-action.ts +384 -0
  36. package/src/obligation-anon.ts +575 -0
  37. package/src/obligation-deref.ts +637 -0
  38. package/src/obligation-expression.ts +1060 -0
  39. package/src/obligation-format.ts +406 -0
  40. package/src/obligation-generate.ts +1074 -0
  41. package/src/obligation-levels.ts +329 -0
  42. package/src/obligation-module.ts +1042 -0
  43. package/src/obligation-printer.ts +889 -0
  44. package/src/obligation-proof.ts +76 -0
  45. package/src/obligation-source.ts +1084 -0
  46. package/src/obligation-tuples.ts +184 -0
  47. package/src/obligations.ts +316 -0
  48. package/src/parallel-worker.ts +121 -123
  49. package/src/parallel.ts +167 -83
  50. package/src/parser.ts +958 -205
  51. package/src/pretty-print.ts +259 -0
  52. package/src/randomization.ts +24 -113
  53. package/src/resolve.ts +472 -41
  54. package/src/run-cli.ts +427 -61
  55. package/src/runtime.ts +63 -28
  56. package/src/spec-description.ts +509 -0
  57. package/src/standard-levels.ts +105 -0
  58. package/src/standard-modules.ts +223 -92
  59. package/src/subexpressions.ts +21 -35
  60. package/src/substitution-levels.ts +184 -0
  61. package/src/successors.ts +261 -46
  62. package/src/symmetry.ts +65 -21
  63. package/src/tableau.ts +43 -37
  64. package/src/tlc-ext.ts +120 -33
  65. package/src/tlc-module.ts +71 -47
  66. package/src/tlc-modules.ts +1022 -0
  67. package/src/tlc-order.ts +497 -0
  68. package/src/tlc-random.ts +411 -0
  69. package/src/tlc-summary.ts +109 -0
  70. package/src/transfer.ts +26 -5
  71. package/src/values.ts +1231 -176
@@ -0,0 +1,1022 @@
1
+ // Data copied from tla2tools.jar (2026.10.24) that TLC's string and variable order depend on.
2
+
3
+ export const SANY_BUILTINS = [
4
+ "STRING",
5
+ "FALSE",
6
+ "TRUE",
7
+ "BOOLEAN",
8
+ "=",
9
+ "/=",
10
+ ".",
11
+ "'",
12
+ "\\lnot",
13
+ "\\neg",
14
+ "\\land",
15
+ "\\lor",
16
+ "\\equiv",
17
+ "=>",
18
+ "SUBSET",
19
+ "UNION",
20
+ "DOMAIN",
21
+ "\\subseteq",
22
+ "\\in",
23
+ "\\notin",
24
+ "\\",
25
+ "\\intersect",
26
+ "\\union",
27
+ "\\times",
28
+ "~>",
29
+ "[]",
30
+ "<>",
31
+ "ENABLED",
32
+ "UNCHANGED",
33
+ "\\cdot",
34
+ "-+->",
35
+ "$AngleAct",
36
+ "$BoundedChoose",
37
+ "$BoundedExists",
38
+ "$BoundedForall",
39
+ "$CartesianProd",
40
+ "$Case",
41
+ "$ConjList",
42
+ "$DisjList",
43
+ "$Except",
44
+ "$FcnApply",
45
+ "$FcnConstructor",
46
+ "$IfThenElse",
47
+ "$NonRecursiveFcnSpec",
48
+ "$Pair",
49
+ "$RcdConstructor",
50
+ "$RcdSelect",
51
+ "$RecursiveFcnSpec",
52
+ "$Seq",
53
+ "$SetEnumerate",
54
+ "$SetOfAll",
55
+ "$SetOfFcns",
56
+ "$SetOfRcds",
57
+ "$SF",
58
+ "$SquareAct",
59
+ "$SubsetOf",
60
+ "$TemporalExists",
61
+ "$TemporalForall",
62
+ "$TemporalWhile",
63
+ "$Tuple",
64
+ "$UnboundedChoose",
65
+ "$UnboundedExists",
66
+ "$UnboundedForall",
67
+ "$WF",
68
+ "$Nop",
69
+ "$Qed",
70
+ "$Pfcase",
71
+ "$Have",
72
+ "$Take",
73
+ "$Pick",
74
+ "$Witness",
75
+ "$Suffices",
76
+ ];
77
+
78
+ export const SANY_OPERATOR_SYNONYMS = [
79
+ ["\\lnot", "~", "\\neg", "¬"],
80
+ ["[]", "□"],
81
+ ["<>", "◇"],
82
+ ["\\land", "/\\", "∧"],
83
+ ["\\lor", "\\/", "∨"],
84
+ ["\\equiv", "<=>", "≡", "⇔"],
85
+ ["/=", "#", "≠"],
86
+ ["\\leq", "<=", "=<", "≤"],
87
+ ["\\geq", ">=", "≥"],
88
+ ["\\times", "\\X", "×"],
89
+ ["\\intersect", "\\cap", "∩"],
90
+ ["\\union", "\\cup", "∪"],
91
+ ["\\o", "\\circ", "∘"],
92
+ ["\\oplus", "(+)", "⊕"],
93
+ ["\\ominus", "(-)", "⊖"],
94
+ ["\\odot", "(.)", "⊙"],
95
+ ["\\oslash", "(/)", "⊘"],
96
+ ["\\otimes", "(\\X)", "⊗"],
97
+ ["\\approx", "≈"],
98
+ [":=", "≔"],
99
+ ["\\asymp", "≍"],
100
+ ["\\bigcirc", "◯"],
101
+ ["::=", "⩴"],
102
+ ["\\bullet", "●"],
103
+ ["\\cdot", "⋅"],
104
+ ["\\cong", "≅"],
105
+ ["\\div", "÷"],
106
+ ["\\doteq", "≐"],
107
+ ["..", "‥"],
108
+ ["...", "…"],
109
+ ["!!", "‼"],
110
+ ["\\gg", "≫"],
111
+ ["=>", "⇒"],
112
+ ["\\in", "∈"],
113
+ ["=|", "⫤"],
114
+ ["~>", "↝"],
115
+ ["\\ll", "≪"],
116
+ ["-|", "⊣"],
117
+ ["\\notin", "∉"],
118
+ ["-+->", "⇸"],
119
+ ["\\prec", "≺"],
120
+ ["\\preceq", "⪯"],
121
+ ["\\propto", "∝"],
122
+ ["??", "⁇"],
123
+ ["|=", "⊨"],
124
+ ["|-", "⊢"],
125
+ ["\\sim", "∼"],
126
+ ["\\simeq", "≃"],
127
+ ["\\sqcap", "⊓"],
128
+ ["\\sqcup", "⊔"],
129
+ ["\\sqsubset", "⊏"],
130
+ ["\\sqsubseteq", "⊑"],
131
+ ["\\sqsupset", "⊐"],
132
+ ["\\sqsupseteq", "⊒"],
133
+ ["\\star", "⋆"],
134
+ ["\\subset", "⊂"],
135
+ ["\\subseteq", "⊆"],
136
+ ["\\succ", "≻"],
137
+ ["\\succeq", "⪰"],
138
+ ["\\supset", "⊃"],
139
+ ["\\supseteq", "⊇"],
140
+ ["\\uplus", "⊎"],
141
+ ["||", "‖"],
142
+ ["\\wr", "≀"],
143
+ ["^+", "⁺"],
144
+ ];
145
+
146
+ export const TLC_STARTUP_STRINGS = [
147
+ "STRING",
148
+ "FALSE",
149
+ "TRUE",
150
+ "BOOLEAN",
151
+ "=",
152
+ "/=",
153
+ ".",
154
+ "'",
155
+ "\\lnot",
156
+ "\\neg",
157
+ "\\land",
158
+ "\\lor",
159
+ "\\equiv",
160
+ "=>",
161
+ "SUBSET",
162
+ "UNION",
163
+ "DOMAIN",
164
+ "\\subseteq",
165
+ "\\in",
166
+ "\\notin",
167
+ "\\",
168
+ "\\intersect",
169
+ "\\union",
170
+ "\\times",
171
+ "~>",
172
+ "[]",
173
+ "<>",
174
+ "ENABLED",
175
+ "UNCHANGED",
176
+ "\\cdot",
177
+ "-+->",
178
+ "$AngleAct",
179
+ "$BoundedChoose",
180
+ "$BoundedExists",
181
+ "$BoundedForall",
182
+ "$CartesianProd",
183
+ "$Case",
184
+ "$ConjList",
185
+ "$DisjList",
186
+ "$Except",
187
+ "$FcnApply",
188
+ "$FcnConstructor",
189
+ "$IfThenElse",
190
+ "$NonRecursiveFcnSpec",
191
+ "$Pair",
192
+ "$RcdConstructor",
193
+ "$RcdSelect",
194
+ "$RecursiveFcnSpec",
195
+ "$Seq",
196
+ "$SetEnumerate",
197
+ "$SetOfAll",
198
+ "$SetOfFcns",
199
+ "$SetOfRcds",
200
+ "$SF",
201
+ "$SquareAct",
202
+ "$SubsetOf",
203
+ "$TemporalExists",
204
+ "$TemporalForall",
205
+ "$TemporalWhile",
206
+ "$Tuple",
207
+ "$UnboundedChoose",
208
+ "$UnboundedExists",
209
+ "$UnboundedForall",
210
+ "$WF",
211
+ "$Nop",
212
+ "$Qed",
213
+ "$Pfcase",
214
+ "$Have",
215
+ "$Take",
216
+ "$Pick",
217
+ "$Witness",
218
+ "$Suffices",
219
+ "***I do not exist***",
220
+ "--TLA+ BUILTINS--",
221
+ "Formal_0",
222
+ "Formal_1",
223
+ "Formal_2",
224
+ "[",
225
+ "^",
226
+ "/",
227
+ "*",
228
+ "-",
229
+ "-.",
230
+ "+",
231
+ "^+",
232
+ "^*",
233
+ "^#",
234
+ "<",
235
+ "\\leq",
236
+ ">",
237
+ "\\geq",
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
+ "\\oplus",
266
+ "\\ominus",
267
+ "\\odot",
268
+ "\\oslash",
269
+ "\\otimes",
270
+ "\\uplus",
271
+ "\\sqcap",
272
+ "\\sqcup",
273
+ "\\div",
274
+ "\\wr",
275
+ "\\star",
276
+ "\\o",
277
+ "\\bigcirc",
278
+ "\\bullet",
279
+ "\\prec",
280
+ "\\succ",
281
+ "\\preceq",
282
+ "\\succeq",
283
+ "\\sim",
284
+ "\\simeq",
285
+ "\\ll",
286
+ "\\gg",
287
+ "\\asymp",
288
+ "\\subset",
289
+ "\\supset",
290
+ "\\supseteq",
291
+ "\\approx",
292
+ "\\cong",
293
+ "\\sqsubset",
294
+ "\\sqsubseteq",
295
+ "\\sqsupset",
296
+ "\\sqsupseteq",
297
+ "\\doteq",
298
+ "\\propto",
299
+ "~",
300
+ "¬",
301
+ "□",
302
+ "◇",
303
+ "/\\",
304
+ "∧",
305
+ "\\/",
306
+ "∨",
307
+ "<=>",
308
+ "≡",
309
+ "⇔",
310
+ "#",
311
+ "≠",
312
+ "<=",
313
+ "=<",
314
+ "≤",
315
+ ">=",
316
+ "≥",
317
+ "\\X",
318
+ "×",
319
+ "\\cap",
320
+ "∩",
321
+ "\\cup",
322
+ "∪",
323
+ "\\circ",
324
+ "∘",
325
+ "(+)",
326
+ "⊕",
327
+ "(-)",
328
+ "⊖",
329
+ "(.)",
330
+ "⊙",
331
+ "(/)",
332
+ "⊘",
333
+ "(\\X)",
334
+ "⊗",
335
+ "≈",
336
+ "≔",
337
+ "≍",
338
+ "◯",
339
+ "⩴",
340
+ "●",
341
+ "⋅",
342
+ "≅",
343
+ "÷",
344
+ "≐",
345
+ "‥",
346
+ "…",
347
+ "‼",
348
+ "≫",
349
+ "⇒",
350
+ "∈",
351
+ "⫤",
352
+ "↝",
353
+ "≪",
354
+ "⊣",
355
+ "∉",
356
+ "⇸",
357
+ "≺",
358
+ "⪯",
359
+ "∝",
360
+ "⁇",
361
+ "⊨",
362
+ "⊢",
363
+ "∼",
364
+ "≃",
365
+ "⊓",
366
+ "⊔",
367
+ "⊏",
368
+ "⊑",
369
+ "⊐",
370
+ "⊒",
371
+ "⋆",
372
+ "⊂",
373
+ "⊆",
374
+ "≻",
375
+ "⪰",
376
+ "⊃",
377
+ "⊇",
378
+ "⊎",
379
+ "‖",
380
+ "≀",
381
+ "⁺",
382
+ "@",
383
+ ];
384
+
385
+ export const TLC_RUNTIME_STRINGS = [
386
+ "exit",
387
+ "pause",
388
+ "config",
389
+ "spec",
390
+ "coverage",
391
+ "action",
392
+ "install",
393
+ "id",
394
+ "behavior",
395
+ "all",
396
+ "mode",
397
+ "deadlock",
398
+ "seed",
399
+ "fingerprint",
400
+ "worker",
401
+ "traces",
402
+ "depth",
403
+ "aril",
404
+ "sched",
405
+ "revision",
406
+ "timestamp",
407
+ "date",
408
+ "count",
409
+ "tag",
410
+ "calver",
411
+ "impliedinits",
412
+ "impliedactions",
413
+ "invariants",
414
+ "impliedtemporals",
415
+ "temporals",
416
+ "actions",
417
+ "inits",
418
+ "variables",
419
+ "actionconstraints",
420
+ "constraints",
421
+ "stats",
422
+ "duration",
423
+ "generated",
424
+ "diameter",
425
+ "distinct",
426
+ "initial",
427
+ "queue",
428
+ "retries",
429
+ "distinctvalues",
430
+ "levelmean",
431
+ "levelvariance",
432
+ "bfs",
433
+ ];
434
+
435
+ export const SANY_NODE_NAMES = [
436
+ "Not a node",
437
+ "N_ActDecl",
438
+ "N_ActionExpr",
439
+ "N_AssumeDecl",
440
+ "N_AssumeProve",
441
+ "N_Assumption",
442
+ "N_BeginModule",
443
+ "N_Body",
444
+ "N_BoundedQuant",
445
+ "N_Case",
446
+ "N_CaseArm",
447
+ "N_CaseStatement",
448
+ "N_ChooseStatement",
449
+ "N_ConjItem",
450
+ "N_ConjList",
451
+ "N_ConsDecl",
452
+ "N_DisjItem",
453
+ "N_DisjList",
454
+ "N_EndModule",
455
+ "N_Except",
456
+ "N_ExceptComponent",
457
+ "N_ExceptSpec",
458
+ "N_Times",
459
+ "N_Extends",
460
+ "N_FairnessExpr",
461
+ "N_FcnAppl",
462
+ "N_FcnConst",
463
+ "N_FieldSet",
464
+ "N_FieldVal",
465
+ "N_FunctionDefinition",
466
+ "N_FunctionParam",
467
+ "N_GeneralId",
468
+ "N_GenInfixOp",
469
+ "N_GenNonExpPrefixOp",
470
+ "N_GenPostfixOp",
471
+ "N_GenPrefixOp",
472
+ "N_IdentDecl",
473
+ "N_Real",
474
+ "N_IdentifierTuple",
475
+ "N_IdentLHS",
476
+ "N_IdPrefix",
477
+ "N_IdPrefixElement",
478
+ "N_IfThenElse",
479
+ "N_InfixDecl",
480
+ "N_InfixExpr",
481
+ "N_InfixLHS",
482
+ "N_InfixOp",
483
+ "N_InnerProof",
484
+ "N_Instance",
485
+ "N_NonLocalInstance",
486
+ "N_Integer",
487
+ "N_LeafProof",
488
+ "N_LetDefinitions",
489
+ "N_LetIn",
490
+ "N_MaybeBound",
491
+ "N_Module",
492
+ "N_ModuleDefinition",
493
+ "N_NonExpPrefixOp",
494
+ "N_Number",
495
+ "N_NumberedAssumeProve",
496
+ "N_OpApplication",
497
+ "N_OpArgs",
498
+ "N_OperatorDefinition",
499
+ "N_OtherArm",
500
+ "N_ParamDecl",
501
+ "N_ParamDeclaration",
502
+ "N_ParenExpr",
503
+ "N_PostfixDecl",
504
+ "N_PostfixExpr",
505
+ "N_PostfixLHS",
506
+ "N_PostfixOp",
507
+ "N_PrefixDecl",
508
+ "N_PrefixExpr",
509
+ "N_PrefixLHS",
510
+ "N_PrefixOp",
511
+ "N_Proof",
512
+ "N_ProofLet",
513
+ "N_ProofName",
514
+ "N_ProofStatement",
515
+ "N_ProofStep",
516
+ "N_QEDStep",
517
+ "N_QuantBound",
518
+ "N_RcdConstructor",
519
+ "N_RecordComponent",
520
+ "N_SetEnumerate",
521
+ "N_SetOfAll",
522
+ "N_SetOfFcns",
523
+ "N_SetOfRcds",
524
+ "N_String",
525
+ "N_SubsetOf",
526
+ "N_Substitution",
527
+ "N_TempDecl",
528
+ "N_Theorem",
529
+ "N_Tuple",
530
+ "N_UnBoundedOrBoundedChoose",
531
+ "N_UnboundedQuant",
532
+ "N_VariableDeclaration",
533
+ "Token =",
534
+ "Token \\in",
535
+ "N_NewSymb",
536
+ "N_Lambda",
537
+ "N_Recursive",
538
+ "N_Label",
539
+ "N_StructOp",
540
+ "N_NumerableStep",
541
+ "N_TerminalProof",
542
+ "N_UseOrHide",
543
+ "N_NonExprBody",
544
+ "N_DefStep",
545
+ "N_HaveStep",
546
+ "N_TakeStep",
547
+ "N_WitnessStep",
548
+ "N_PickStep",
549
+ "N_CaseStep",
550
+ "N_AssertStep",
551
+ ];
552
+
553
+ export const TLC_MODULE_SOURCES = new Map([
554
+ [
555
+ "Naturals",
556
+ `-------------------------------- MODULE Naturals ----------------------------
557
+ Nat == { }
558
+ a+b == {a, b}
559
+ a-b == CHOOSE n : b + n = a
560
+ a*b == TRUE
561
+ a^b == {a, b}
562
+ a<b == a = b
563
+ a>b == a = b
564
+ a \\leq b == a = b
565
+ a \\geq b == a = b
566
+ a % b == {a, b}
567
+ a \\div b == {a, b}
568
+ a .. b == {a, b}
569
+ =============================================================================
570
+ `,
571
+ ],
572
+ [
573
+ "Integers",
574
+ `-------------------------------- MODULE Integers ----------------------------
575
+ EXTENDS Naturals
576
+ Int == { }
577
+ -. a == 0 - a
578
+ =============================================================================
579
+ `,
580
+ ],
581
+ [
582
+ "Sequences",
583
+ `------------------------------ MODULE Sequences -----------------------------
584
+ LOCAL INSTANCE Naturals
585
+ Seq(S) == UNION {[1..n -> S] : n \\in Nat}
586
+ Len(s) == CHOOSE n \\in Nat : DOMAIN s = 1..n
587
+ s \\o t == [i \\in 1..(Len(s) + Len(t)) |-> IF i \\leq Len(s) THEN s[i]
588
+ ELSE t[i-Len(s)]]
589
+ Append(s, e) == s \\o <<e>>
590
+ Head(s) == s[1]
591
+ Tail(s) == CASE s # << >> -> [i \\in 1..(Len(s)-1) |-> s[i+1]]
592
+ SubSeq(s, m, n) == [i \\in 1..(1+n-m) |-> s[i+m-1]]
593
+ SelectSeq(s, Test(_)) ==
594
+ LET F[i \\in 0..Len(s)] ==
595
+ IF i = 0 THEN << >>
596
+ ELSE IF Test(s[i]) THEN Append(F[i-1], s[i])
597
+ ELSE F[i-1]
598
+ IN F[Len(s)]
599
+ =============================================================================
600
+ `,
601
+ ],
602
+ [
603
+ "FiniteSets",
604
+ `---------------------------- MODULE FiniteSets -----------------------------
605
+ LOCAL INSTANCE Naturals
606
+ LOCAL INSTANCE Sequences
607
+ IsFiniteSet(S) ==
608
+ \\E seq \\in Seq(S) : \\A s \\in S : \\E n \\in 1..Len(seq) : seq[n] = s
609
+ Cardinality(S) ==
610
+ LET CS[T \\in SUBSET S] == IF T = {} THEN 0
611
+ ELSE 1 + CS[T \\ {CHOOSE x : x \\in T}]
612
+ IN CS[S]
613
+ =============================================================================
614
+ `,
615
+ ],
616
+ [
617
+ "TLC",
618
+ `------------------------------- MODULE TLC ----------------------------------
619
+ LOCAL INSTANCE Naturals
620
+ LOCAL INSTANCE Sequences
621
+ LOCAL INSTANCE FiniteSets
622
+ -----------------------------------------------------------------------------
623
+ Print(out, val) == val
624
+ PrintT(out) == TRUE
625
+ Assert(val, out) == IF val = TRUE THEN TRUE
626
+ ELSE CHOOSE v : TRUE
627
+ JavaTime == CHOOSE n : n \\in Nat
628
+ TLCGet(i) == CHOOSE n : TRUE
629
+ TLCSet(i, v) == TRUE
630
+ -----------------------------------------------------------------------------
631
+ d :> e == [x \\in {d} |-> e]
632
+ f @@ g == [x \\in (DOMAIN f) \\cup (DOMAIN g) |->
633
+ IF x \\in DOMAIN f THEN f[x] ELSE g[x]]
634
+ Permutations(S) ==
635
+ {f \\in [S -> S] : \\A w \\in S : \\E v \\in S : f[v]=w}
636
+ -----------------------------------------------------------------------------
637
+ SortSeq(s, Op(_, _)) ==
638
+ LET Perm == CHOOSE p \\in Permutations(1 .. Len(s)) :
639
+ \\A i, j \\in 1..Len(s) :
640
+ (i < j) => Op(s[p[i]], s[p[j]]) \\/ (s[p[i]] = s[p[j]])
641
+ IN [i \\in 1..Len(s) |-> s[Perm[i]]]
642
+ RandomElement(s) == CHOOSE x \\in s : TRUE
643
+ Any == CHOOSE x : TRUE
644
+ ToString(v) == (CHOOSE x \\in [a : v, b : STRING] : TRUE).b
645
+ TLCEval(v) == v
646
+ =============================================================================
647
+ `,
648
+ ],
649
+ [
650
+ "TLCExt",
651
+ `------------------------------- MODULE TLCExt -------------------------------
652
+ LOCAL INSTANCE TLC
653
+ LOCAL INSTANCE Integers
654
+ -----------------------------------------------------------------------------
655
+ AssertEq(a, b) ==
656
+ IF a # b THEN
657
+ /\\ PrintT("Assertion failed")
658
+ /\\ PrintT(a)
659
+ /\\ PrintT(b)
660
+ /\\ a = b
661
+ ELSE a = b
662
+ AssertError(err, exp) ==
663
+ LET FailsEval(e) == CHOOSE b \\in BOOLEAN : TRUE
664
+ TLCError == CHOOSE s \\in STRING : TRUE
665
+ IN IF FailsEval(exp) THEN Assert(err = TLCError, TLCError) ELSE TRUE
666
+ -----------------------------------------------------------------------------
667
+ TLCGetOrDefault(key, defaultVal) ==
668
+ CHOOSE n : TRUE
669
+ TLCGetAndSet(key, Op(_,_), val, defaultVal) ==
670
+ LET oldVal == TLCGetOrDefault(key, defaultVal)
671
+ IN CHOOSE v \\in {oldVal} : TLCSet(key, Op(oldVal, val))
672
+ -----------------------------------------------------------------------------
673
+ Trace ==
674
+ TRUE
675
+ -----------------------------------------------------------------------------
676
+ CounterExample ==
677
+ TRUE
678
+ ToTrace(CE) ==
679
+ TRUE
680
+ -----------------------------------------------------------------------------
681
+ TLCModelValue(str) ==
682
+ CHOOSE v: ToString(v) = str
683
+ TLCDefer(expression) ==
684
+ TRUE
685
+ -----------------------------------------------------------------------------
686
+ TLCNoOp(val) ==
687
+ val
688
+ PickSuccessor(exp) ==
689
+ IF (exp)
690
+ THEN TRUE
691
+ ELSE CHOOSE bool \\in BOOLEAN : TRUE
692
+ -----------------------------------------------------------------------------
693
+ TLCCache(expression, closure) ==
694
+ expression
695
+ TLCFP(var) ==
696
+ CHOOSE i \\in Int: TRUE
697
+ -----------------------------------------------------------------------------
698
+ TLCEvalDefinition(definitionName) ==
699
+ TRUE
700
+ ============================================================================
701
+ `,
702
+ ],
703
+ [
704
+ "Bags",
705
+ `----------------------------- MODULE Bags --------------------------------
706
+ LOCAL INSTANCE Naturals
707
+ IsABag(B) ==
708
+ B \\in [DOMAIN B -> {n \\in Nat : n > 0}]
709
+ BagToSet(B) == DOMAIN B
710
+ SetToBag(S) == [e \\in S |-> 1]
711
+ BagIn(e,B) == e \\in BagToSet(B)
712
+ EmptyBag == SetToBag({})
713
+ B1 (+) B2 ==
714
+ [e \\in (DOMAIN B1) \\cup (DOMAIN B2) |->
715
+ (IF e \\in DOMAIN B1 THEN B1[e] ELSE 0)
716
+ + (IF e \\in DOMAIN B2 THEN B2[e] ELSE 0) ]
717
+ B1 (-) B2 ==
718
+ LET B == [e \\in DOMAIN B1 |-> IF e \\in DOMAIN B2 THEN B1[e] - B2[e]
719
+ ELSE B1[e]]
720
+ IN [e \\in {d \\in DOMAIN B : B[d] > 0} |-> B[e]]
721
+ LOCAL Sum(f) ==
722
+ LET DSum[S \\in SUBSET DOMAIN f] ==
723
+ LET elt == CHOOSE e \\in S : TRUE
724
+ IN IF S = {} THEN 0
725
+ ELSE f[elt] + DSum[S \\ {elt}]
726
+ IN DSum[DOMAIN f]
727
+ BagUnion(S) ==
728
+ [e \\in UNION {BagToSet(B) : B \\in S} |->
729
+ Sum( [B \\in S |-> IF BagIn(e, B) THEN B[e] ELSE 0] ) ]
730
+ B1 \\sqsubseteq B2 ==
731
+ /\\ (DOMAIN B1) \\subseteq (DOMAIN B2)
732
+ /\\ \\A e \\in DOMAIN B1 : B1[e] \\leq B2[e]
733
+ SubBag(B) ==
734
+ LET RemoveFromDom(x, f) == [y \\in (DOMAIN f) \\ {x} |-> f[y]]
735
+ Combine(x, BagSet) ==
736
+ BagSet \\cup
737
+ {[y \\in (DOMAIN f) \\cup {x} |-> IF y = x THEN i ELSE f[y]] :
738
+ f \\in BagSet, i \\in 1..B[x]}
739
+ Biggest == LET Range == {B[x] : x \\in DOMAIN B}
740
+ IN IF Range = {} THEN 0
741
+ ELSE CHOOSE r \\in Range :
742
+ \\A s \\in Range : r \\geq s
743
+ RSB[BB \\in UNION {[S -> 1..Biggest] : S \\in SUBSET DOMAIN B}] ==
744
+ IF BB = << >> THEN {<< >>}
745
+ ELSE LET x == CHOOSE x \\in DOMAIN BB : TRUE
746
+ IN Combine(x, RSB[RemoveFromDom(x, BB)])
747
+ IN RSB[B]
748
+ BagOfAll(F(_), B) ==
749
+ [e \\in {F(d) : d \\in BagToSet(B)} |->
750
+ Sum( [d \\in BagToSet(B) |-> IF F(d) = e THEN B[d] ELSE 0] ) ]
751
+ BagCardinality(B) ==
752
+ Sum(B)
753
+ CopiesIn(e, B) ==
754
+ IF BagIn(e, B) THEN B[e] ELSE 0
755
+ =============================================================================
756
+ 6 Apr 99 : Modified version for standard module set
757
+ 7 Dec 98 : Corrected error found by Stephan Merz.
758
+ 6 Dec 98 : Modified comments based on suggestions by Lyle Ramshaw.
759
+ 5 Dec 98 : Initial version.
760
+ `,
761
+ ],
762
+ [
763
+ "Json",
764
+ `-------------------------------- MODULE Json --------------------------------
765
+ LOCAL INSTANCE Sequences
766
+ LOCAL INSTANCE FiniteSets
767
+ LOCAL INSTANCE TLC
768
+ -----------------------------------------------------------------------------
769
+ LOCAL IsSequence(F, D) == TRUE \\/ FALSE
770
+ LOCAL ToJsonKeyValue(F, d) ==
771
+ ToString(ToString(d)) \\o ":" \\o ToString(F[d])
772
+ RECURSIVE ToJsonObjectString(_,_)
773
+ LOCAL ToJsonObjectString(F, D) ==
774
+ LET d == CHOOSE d \\in D: TRUE
775
+ IN IF D = DOMAIN F
776
+ THEN "{" \\o ToJsonKeyValue(F, d) \\o IF D \\ {d} = {}
777
+ THEN "}"
778
+ ELSE ToJsonObjectString(F, D \\ {d})
779
+ ELSE ", " \\o ToJsonKeyValue(F, d) \\o IF D \\ {d} = {}
780
+ THEN "}"
781
+ ELSE ToJsonObjectString(F, D \\ {d})
782
+ RECURSIVE ToJsonArrayString(_,_)
783
+ LOCAL ToJsonArrayString(F, D) ==
784
+ LET d == CHOOSE d \\in D: TRUE
785
+ IN IF D = DOMAIN F
786
+ THEN "[" \\o ToString(F[d]) \\o IF D \\ {d} = {}
787
+ THEN "]"
788
+ ELSE ToJsonArrayString(F, D \\ {d})
789
+ ELSE ", " \\o ToString(F[d]) \\o IF D \\ {d} = {}
790
+ THEN "]"
791
+ ELSE ToJsonArrayString(F, D \\ {d})
792
+ RECURSIVE ToJsonString(_,_)
793
+ LOCAL ToJsonString(F, D) ==
794
+ IF IsFiniteSet(F) \\/ IsSequence(F, D) THEN
795
+ ToJsonArrayString(F, D)
796
+ ELSE
797
+ ToJsonObjectString(F, D)
798
+ ToJson(value) ==
799
+ IF DOMAIN value = {} THEN
800
+ "{}"
801
+ ELSE
802
+ ToJsonString(value, DOMAIN value)
803
+ ToJsonArray(value) ==
804
+ IF DOMAIN value = {} THEN
805
+ "[]"
806
+ ELSE
807
+ ToJsonArrayString(value, DOMAIN value)
808
+ ToJsonObject(value) ==
809
+ IF DOMAIN value = {} THEN
810
+ "{}"
811
+ ELSE
812
+ ToJsonObjectString(value, DOMAIN value)
813
+ JsonSerialize(absoluteFilename, value) ==
814
+ TRUE
815
+ JsonDeserialize(absoluteFilename) ==
816
+ CHOOSE val : TRUE
817
+ ndJsonSerialize(absoluteFilename, value) ==
818
+ TRUE
819
+ ndJsonDeserialize(absoluteFilename) ==
820
+ CHOOSE val : TRUE
821
+ =============================================================================
822
+ `,
823
+ ],
824
+ [
825
+ "Randomization",
826
+ `-------------------------- MODULE Randomization------------------------------
827
+ LOCAL INSTANCE Naturals
828
+ LOCAL INSTANCE FiniteSets
829
+ RandomSubset(k, S) == CHOOSE T \\in SUBSET S : Cardinality(T) = k
830
+ RandomSetOfSubsets(k, n, S) == CHOOSE T \\in SUBSET SUBSET S :
831
+ Cardinality(T) \\leq k
832
+ TestRandomSetOfSubsets(k, n, S) ==
833
+ [i \\in 1..5 |-> Cardinality(RandomSetOfSubsets(k, n, S))]
834
+ =============================================================================
835
+ `,
836
+ ],
837
+ [
838
+ "Reals",
839
+ `-------------------------------- MODULE Reals -------------------------------
840
+ EXTENDS Integers
841
+ Real == "Reals"
842
+ a / b == CHOOSE m \\in Real : m * b = a
843
+ Infinity == CHOOSE i : (i \\notin Real) /\\ (\\A r \\in Real : i > r)
844
+ =============================================================================
845
+ `,
846
+ ],
847
+ [
848
+ "RealTime",
849
+ `----------------------------- MODULE RealTime -------------------------------
850
+ EXTENDS Reals
851
+ VARIABLE now
852
+ RTBound(A, v, D, E) ==
853
+ LET TNext(t) == t' = IF <<A>>_v \\/ ~(ENABLED <<A>>_v)'
854
+ THEN 0
855
+ ELSE t + (now'-now)
856
+ Timer(t) == (t=0) /\\ [][TNext(t)]_<<t, v, now>>
857
+ MaxTime(t) == [](t \\leq E)
858
+ MinTime(t) == [][A => t \\geq D]_v
859
+ IN \\EE t : Timer(t) /\\ MaxTime(t) /\\ MinTime(t)
860
+ -----------------------------------------------------------------------------
861
+ RTnow(v) == LET NowNext == /\\ now' \\in {r \\in Real : r > now}
862
+ /\\ UNCHANGED v
863
+ IN /\\ now \\in Real
864
+ /\\ [][NowNext]_now
865
+ /\\ \\A r \\in Real : WF_now(NowNext /\\ (now'>r))
866
+ =============================================================================
867
+ `,
868
+ ],
869
+ [
870
+ "Toolbox",
871
+ `----------------------------- MODULE Toolbox --------------------------------
872
+ LOCAL INSTANCE Naturals
873
+ LOCAL INSTANCE FiniteSets
874
+ LOCAL INSTANCE TLC
875
+ -----------------------------------------------------------------------------
876
+ _TETrace ==
877
+ CHOOSE f \\in [ (Nat \\ {0}) -> STRING ] : TRUE
878
+ LOCAL _TETraceLength == Cardinality(DOMAIN _TETrace)
879
+ _TEPosition ==
880
+ IF TLCGet("level") >= _TETraceLength
881
+ THEN _TETraceLength
882
+ ELSE IF TLCGet("level") = 0 THEN 1 ELSE TLCGet("level")
883
+ =============================================================================
884
+ `,
885
+ ],
886
+ [
887
+ "_Possible",
888
+ `------------------------------ MODULE _Possible ------------------------------
889
+ LOCAL INSTANCE TLC
890
+ LOCAL INSTANCE TLCExt
891
+ LOCAL INSTANCE Naturals
892
+ LOCAL INSTANCE Sequences
893
+ LOCAL _Update(Op(_,_), val) ==
894
+ TLCSet("s:_possible", Op(TLCGetOrDefault("s:_possible", <<>>), val))
895
+ _Track(expr, name) ==
896
+ _Update(LAMBDA old, b:
897
+ IF b
898
+ THEN
899
+ IF name \\in DOMAIN old
900
+ THEN [old EXCEPT ![name] = @ + 1]
901
+ ELSE old @@ (name :> 1)
902
+ ELSE old @@ (name :> 0), expr)
903
+ LOCAL _Merge(a, b) ==
904
+ [name \\in (DOMAIN a) \\cup (DOMAIN b) |->
905
+ (IF name \\in DOMAIN a THEN a[name] ELSE 0) +
906
+ (IF name \\in DOMAIN b THEN b[name] ELSE 0)]
907
+ _Counts ==
908
+ LET workers == TLCGet("all:named")["s:_possible"]
909
+ n == Len(workers)
910
+ Fold[i \\in 0..n] ==
911
+ IF i = 0 THEN <<>>
912
+ ELSE _Merge(Fold[i-1], workers[i])
913
+ IN Fold[n]
914
+ _CheckName(name) ==
915
+ LET counts == _Counts
916
+ IN (name \\notin DOMAIN counts \\/ counts[name] = 0)
917
+ => (PrintT(counts) /\\ FALSE)
918
+ _PrintCounts == PrintT(_Counts)
919
+ =============================================================================
920
+ `,
921
+ ],
922
+ ]);
923
+
924
+ // The Java methods that override standard module operators, as java.lang.reflect.Method prints
925
+ // them in TLC's errors.
926
+ export const TLC_JAVA_METHODS = new Map([
927
+ [
928
+ "FiniteSets",
929
+ new Map([
930
+ [
931
+ "IsFiniteSet",
932
+ "public static tlc2.value.IBoolValue tlc2.module.FiniteSets.IsFiniteSet(tlc2.value.impl.Value)",
933
+ ],
934
+ [
935
+ "Cardinality",
936
+ "public static tlc2.value.impl.IntValue tlc2.module.FiniteSets.Cardinality(tlc2.value.impl.Value)",
937
+ ],
938
+ ]),
939
+ ],
940
+ [
941
+ "Sequences",
942
+ new Map([
943
+ [
944
+ "Seq",
945
+ "public static tlc2.value.impl.Value tlc2.module.Sequences.Seq(tlc2.value.impl.Value)",
946
+ ],
947
+ [
948
+ "Len",
949
+ "public static tlc2.value.impl.IntValue tlc2.module.Sequences.Len(tlc2.value.impl.Value)",
950
+ ],
951
+ [
952
+ "Head",
953
+ "public static tlc2.value.impl.Value tlc2.module.Sequences.Head(tlc2.value.impl.Value)",
954
+ ],
955
+ [
956
+ "Tail",
957
+ "public static tlc2.value.impl.Value tlc2.module.Sequences.Tail(tlc2.value.impl.Value)",
958
+ ],
959
+ [
960
+ "Append",
961
+ "public static tlc2.value.impl.Value tlc2.module.Sequences.Append(tlc2.value.impl.Value,tlc2.value.impl.Value)",
962
+ ],
963
+ [
964
+ "\\o",
965
+ "public static tlc2.value.impl.Value tlc2.module.Sequences.Concat(tlc2.value.impl.Value,tlc2.value.impl.Value)",
966
+ ],
967
+ [
968
+ "SubSeq",
969
+ "public static tlc2.value.impl.Value tlc2.module.Sequences.SubSeq(tlc2.value.impl.Value,tlc2.value.impl.Value,tlc2.value.impl.Value)",
970
+ ],
971
+ [
972
+ "SelectSeq",
973
+ "public static tlc2.value.impl.Value tlc2.module.Sequences.SelectSeq(tlc2.value.impl.Value,tlc2.value.impl.Value)",
974
+ ],
975
+ ]),
976
+ ],
977
+ [
978
+ "TLC",
979
+ new Map([
980
+ [
981
+ "Print",
982
+ "public static tlc2.value.impl.Value tlc2.module.TLC.Print(tlc2.value.impl.Value,tlc2.value.impl.Value)",
983
+ ],
984
+ [
985
+ "PrintT",
986
+ "public static tlc2.value.impl.Value tlc2.module.TLC.PrintT(tlc2.value.impl.Value)",
987
+ ],
988
+ [
989
+ "ToString",
990
+ "public static tlc2.value.impl.Value tlc2.module.TLC.ToString(tlc2.value.impl.Value)",
991
+ ],
992
+ [
993
+ "Assert",
994
+ "public static tlc2.value.impl.Value tlc2.module.TLC.Assert(tlc2.value.impl.Value,tlc2.value.impl.Value)",
995
+ ],
996
+ [
997
+ ":>",
998
+ "public static tlc2.value.impl.Value tlc2.module.TLC.MakeFcn(tlc2.value.impl.Value,tlc2.value.impl.Value)",
999
+ ],
1000
+ [
1001
+ "@@",
1002
+ "public static tlc2.value.impl.Value tlc2.module.TLC.CombineFcn(tlc2.value.impl.Value,tlc2.value.impl.Value)",
1003
+ ],
1004
+ [
1005
+ "SortSeq",
1006
+ "public static tlc2.value.impl.Value tlc2.module.TLC.SortSeq(tlc2.value.impl.Value,tlc2.value.impl.Value)",
1007
+ ],
1008
+ [
1009
+ "Permutations",
1010
+ "public static tlc2.value.impl.Value tlc2.module.TLC.Permutations(tlc2.value.impl.Value)",
1011
+ ],
1012
+ [
1013
+ "RandomElement",
1014
+ "public static tlc2.value.impl.Value tlc2.module.TLC.RandomElement(tlc2.value.impl.Value)",
1015
+ ],
1016
+ [
1017
+ "TLCEval",
1018
+ "public static tlc2.value.impl.Value tlc2.module.TLCEval.tlcEval(tlc2.tool.impl.Tool,tla2sany.semantic.ExprOrOpArgNode[],tlc2.util.Context,tlc2.tool.TLCState,tlc2.tool.TLCState,int,tlc2.tool.coverage.CostModel)",
1019
+ ],
1020
+ ]),
1021
+ ],
1022
+ ]);