@stevenvo780/st-lang 4.5.2 → 4.6.0

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 (185) hide show
  1. package/dist/categorical/fin-set.d.ts +39 -0
  2. package/dist/categorical/fin-set.d.ts.map +1 -0
  3. package/dist/categorical/fin-set.js +217 -0
  4. package/dist/categorical/fin-set.js.map +1 -0
  5. package/dist/categorical/free.d.ts +23 -0
  6. package/dist/categorical/free.d.ts.map +1 -0
  7. package/dist/categorical/free.js +168 -0
  8. package/dist/categorical/free.js.map +1 -0
  9. package/dist/categorical/functor.d.ts +40 -0
  10. package/dist/categorical/functor.d.ts.map +1 -0
  11. package/dist/categorical/functor.js +139 -0
  12. package/dist/categorical/functor.js.map +1 -0
  13. package/dist/categorical/index.d.ts +11 -0
  14. package/dist/categorical/index.d.ts.map +1 -0
  15. package/dist/categorical/index.js +33 -0
  16. package/dist/categorical/index.js.map +1 -0
  17. package/dist/categorical/limits.d.ts +64 -0
  18. package/dist/categorical/limits.d.ts.map +1 -0
  19. package/dist/categorical/limits.js +248 -0
  20. package/dist/categorical/limits.js.map +1 -0
  21. package/dist/categorical/monoidal.d.ts +14 -0
  22. package/dist/categorical/monoidal.d.ts.map +1 -0
  23. package/dist/categorical/monoidal.js +148 -0
  24. package/dist/categorical/monoidal.js.map +1 -0
  25. package/dist/categorical/poset.d.ts +14 -0
  26. package/dist/categorical/poset.d.ts.map +1 -0
  27. package/dist/categorical/poset.js +115 -0
  28. package/dist/categorical/poset.js.map +1 -0
  29. package/dist/categorical/types.d.ts +111 -0
  30. package/dist/categorical/types.d.ts.map +1 -0
  31. package/dist/categorical/types.js +15 -0
  32. package/dist/categorical/types.js.map +1 -0
  33. package/dist/csp-hoare/analysis.d.ts +51 -0
  34. package/dist/csp-hoare/analysis.d.ts.map +1 -0
  35. package/dist/csp-hoare/analysis.js +317 -0
  36. package/dist/csp-hoare/analysis.js.map +1 -0
  37. package/dist/csp-hoare/examples.d.ts +33 -0
  38. package/dist/csp-hoare/examples.d.ts.map +1 -0
  39. package/dist/csp-hoare/examples.js +108 -0
  40. package/dist/csp-hoare/examples.js.map +1 -0
  41. package/dist/csp-hoare/index.d.ts +6 -0
  42. package/dist/csp-hoare/index.d.ts.map +1 -0
  43. package/dist/csp-hoare/index.js +50 -0
  44. package/dist/csp-hoare/index.js.map +1 -0
  45. package/dist/csp-hoare/semantics.d.ts +49 -0
  46. package/dist/csp-hoare/semantics.d.ts.map +1 -0
  47. package/dist/csp-hoare/semantics.js +494 -0
  48. package/dist/csp-hoare/semantics.js.map +1 -0
  49. package/dist/csp-hoare/types.d.ts +60 -0
  50. package/dist/csp-hoare/types.d.ts.map +1 -0
  51. package/dist/csp-hoare/types.js +31 -0
  52. package/dist/csp-hoare/types.js.map +1 -0
  53. package/dist/hindley-milner/index.d.ts +7 -0
  54. package/dist/hindley-milner/index.d.ts.map +1 -0
  55. package/dist/hindley-milner/index.js +60 -0
  56. package/dist/hindley-milner/index.js.map +1 -0
  57. package/dist/hindley-milner/infer.d.ts +26 -0
  58. package/dist/hindley-milner/infer.d.ts.map +1 -0
  59. package/dist/hindley-milner/infer.js +278 -0
  60. package/dist/hindley-milner/infer.js.map +1 -0
  61. package/dist/hindley-milner/substitution.d.ts +21 -0
  62. package/dist/hindley-milner/substitution.d.ts.map +1 -0
  63. package/dist/hindley-milner/substitution.js +215 -0
  64. package/dist/hindley-milner/substitution.js.map +1 -0
  65. package/dist/hindley-milner/types.d.ts +84 -0
  66. package/dist/hindley-milner/types.d.ts.map +1 -0
  67. package/dist/hindley-milner/types.js +166 -0
  68. package/dist/hindley-milner/types.js.map +1 -0
  69. package/dist/hott/equality.d.ts +4 -0
  70. package/dist/hott/equality.d.ts.map +1 -0
  71. package/dist/hott/equality.js +108 -0
  72. package/dist/hott/equality.js.map +1 -0
  73. package/dist/hott/index.d.ts +13 -0
  74. package/dist/hott/index.d.ts.map +1 -0
  75. package/dist/hott/index.js +77 -0
  76. package/dist/hott/index.js.map +1 -0
  77. package/dist/hott/infer.d.ts +11 -0
  78. package/dist/hott/infer.d.ts.map +1 -0
  79. package/dist/hott/infer.js +465 -0
  80. package/dist/hott/infer.js.map +1 -0
  81. package/dist/hott/normalize.d.ts +5 -0
  82. package/dist/hott/normalize.d.ts.map +1 -0
  83. package/dist/hott/normalize.js +240 -0
  84. package/dist/hott/normalize.js.map +1 -0
  85. package/dist/hott/path-algebra.d.ts +25 -0
  86. package/dist/hott/path-algebra.d.ts.map +1 -0
  87. package/dist/hott/path-algebra.js +67 -0
  88. package/dist/hott/path-algebra.js.map +1 -0
  89. package/dist/hott/substitute.d.ts +3 -0
  90. package/dist/hott/substitute.d.ts.map +1 -0
  91. package/dist/hott/substitute.js +131 -0
  92. package/dist/hott/substitute.js.map +1 -0
  93. package/dist/hott/types.d.ts +126 -0
  94. package/dist/hott/types.d.ts.map +1 -0
  95. package/dist/hott/types.js +346 -0
  96. package/dist/hott/types.js.map +1 -0
  97. package/dist/index.d.ts +7 -0
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +48 -3
  100. package/dist/index.js.map +1 -1
  101. package/dist/lemma-synthesis/index.d.ts +124 -0
  102. package/dist/lemma-synthesis/index.d.ts.map +1 -0
  103. package/dist/lemma-synthesis/index.js +640 -0
  104. package/dist/lemma-synthesis/index.js.map +1 -0
  105. package/dist/tactic-dsl/combinators.d.ts +6 -0
  106. package/dist/tactic-dsl/combinators.d.ts.map +1 -0
  107. package/dist/tactic-dsl/combinators.js +98 -0
  108. package/dist/tactic-dsl/combinators.js.map +1 -0
  109. package/dist/tactic-dsl/index.d.ts +39 -0
  110. package/dist/tactic-dsl/index.d.ts.map +1 -0
  111. package/dist/tactic-dsl/index.js +162 -0
  112. package/dist/tactic-dsl/index.js.map +1 -0
  113. package/dist/tactic-dsl/tactics.d.ts +21 -0
  114. package/dist/tactic-dsl/tactics.d.ts.map +1 -0
  115. package/dist/tactic-dsl/tactics.js +536 -0
  116. package/dist/tactic-dsl/tactics.js.map +1 -0
  117. package/dist/tactic-dsl/types.d.ts +54 -0
  118. package/dist/tactic-dsl/types.d.ts.map +1 -0
  119. package/dist/tactic-dsl/types.js +226 -0
  120. package/dist/tactic-dsl/types.js.map +1 -0
  121. package/dist/tests/categorical/categorical.test.d.ts +2 -0
  122. package/dist/tests/categorical/categorical.test.d.ts.map +1 -0
  123. package/dist/tests/categorical/categorical.test.js +300 -0
  124. package/dist/tests/categorical/categorical.test.js.map +1 -0
  125. package/dist/tests/csp-hoare/csp-hoare.test.d.ts +2 -0
  126. package/dist/tests/csp-hoare/csp-hoare.test.d.ts.map +1 -0
  127. package/dist/tests/csp-hoare/csp-hoare.test.js +313 -0
  128. package/dist/tests/csp-hoare/csp-hoare.test.js.map +1 -0
  129. package/dist/tests/hindley-milner/hindley-milner.test.d.ts +2 -0
  130. package/dist/tests/hindley-milner/hindley-milner.test.d.ts.map +1 -0
  131. package/dist/tests/hindley-milner/hindley-milner.test.js +327 -0
  132. package/dist/tests/hindley-milner/hindley-milner.test.js.map +1 -0
  133. package/dist/tests/hott/hott.test.d.ts +2 -0
  134. package/dist/tests/hott/hott.test.d.ts.map +1 -0
  135. package/dist/tests/hott/hott.test.js +271 -0
  136. package/dist/tests/hott/hott.test.js.map +1 -0
  137. package/dist/tests/lemma-synthesis/lemma-synthesis.test.d.ts +2 -0
  138. package/dist/tests/lemma-synthesis/lemma-synthesis.test.d.ts.map +1 -0
  139. package/dist/tests/lemma-synthesis/lemma-synthesis.test.js +460 -0
  140. package/dist/tests/lemma-synthesis/lemma-synthesis.test.js.map +1 -0
  141. package/dist/tests/tactic-dsl/tactic-dsl.test.d.ts +2 -0
  142. package/dist/tests/tactic-dsl/tactic-dsl.test.d.ts.map +1 -0
  143. package/dist/tests/tactic-dsl/tactic-dsl.test.js +259 -0
  144. package/dist/tests/tactic-dsl/tactic-dsl.test.js.map +1 -0
  145. package/dist/tests/tptp/bridge.test.d.ts +2 -0
  146. package/dist/tests/tptp/bridge.test.d.ts.map +1 -0
  147. package/dist/tests/tptp/bridge.test.js +154 -0
  148. package/dist/tests/tptp/bridge.test.js.map +1 -0
  149. package/dist/tests/tptp/emitter.test.d.ts +2 -0
  150. package/dist/tests/tptp/emitter.test.d.ts.map +1 -0
  151. package/dist/tests/tptp/emitter.test.js +128 -0
  152. package/dist/tests/tptp/emitter.test.js.map +1 -0
  153. package/dist/tests/tptp/parser.test.d.ts +2 -0
  154. package/dist/tests/tptp/parser.test.d.ts.map +1 -0
  155. package/dist/tests/tptp/parser.test.js +192 -0
  156. package/dist/tests/tptp/parser.test.js.map +1 -0
  157. package/dist/tests/tptp/tokenizer.test.d.ts +2 -0
  158. package/dist/tests/tptp/tokenizer.test.d.ts.map +1 -0
  159. package/dist/tests/tptp/tokenizer.test.js +60 -0
  160. package/dist/tests/tptp/tokenizer.test.js.map +1 -0
  161. package/dist/tptp/ast.d.ts +73 -0
  162. package/dist/tptp/ast.d.ts.map +1 -0
  163. package/dist/tptp/ast.js +35 -0
  164. package/dist/tptp/ast.js.map +1 -0
  165. package/dist/tptp/bridge.d.ts +14 -0
  166. package/dist/tptp/bridge.d.ts.map +1 -0
  167. package/dist/tptp/bridge.js +146 -0
  168. package/dist/tptp/bridge.js.map +1 -0
  169. package/dist/tptp/emitter.d.ts +5 -0
  170. package/dist/tptp/emitter.d.ts.map +1 -0
  171. package/dist/tptp/emitter.js +103 -0
  172. package/dist/tptp/emitter.js.map +1 -0
  173. package/dist/tptp/index.d.ts +7 -0
  174. package/dist/tptp/index.d.ts.map +1 -0
  175. package/dist/tptp/index.js +31 -0
  176. package/dist/tptp/index.js.map +1 -0
  177. package/dist/tptp/parser.d.ts +23 -0
  178. package/dist/tptp/parser.d.ts.map +1 -0
  179. package/dist/tptp/parser.js +440 -0
  180. package/dist/tptp/parser.js.map +1 -0
  181. package/dist/tptp/tokenizer.d.ts +14 -0
  182. package/dist/tptp/tokenizer.d.ts.map +1 -0
  183. package/dist/tptp/tokenizer.js +264 -0
  184. package/dist/tptp/tokenizer.js.map +1 -0
  185. package/package.json +4 -1
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // ST Categorical — Poset como categoría
4
+ // ============================================================
5
+ // Un poset (P, ≤) genera una categoría con un único morfismo a→b
6
+ // por cada par (a, b) tal que a ≤ b. La identidad es a ≤ a y la
7
+ // composición es transitividad. Reflexividad y transitividad están
8
+ // validadas por construcción.
9
+ // ============================================================
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.Poset = Poset;
12
+ /**
13
+ * Construye la categoría poset. `elements` define los objetos y
14
+ * `leq` los pares a≤b explícitos. La clausura reflexivo-transitiva
15
+ * se calcula y se realiza como morfismos del Category resultante.
16
+ */
17
+ function Poset(elements, leq) {
18
+ // Clausura reflexivo-transitiva sobre la relación dada.
19
+ const closure = new Set();
20
+ for (const e of elements)
21
+ closure.add(`${e}|${e}`);
22
+ for (const [a, b] of leq)
23
+ closure.add(`${a}|${b}`);
24
+ let changed = true;
25
+ while (changed) {
26
+ changed = false;
27
+ const snapshot = Array.from(closure).map((s) => s.split('|'));
28
+ for (const [a, b] of snapshot) {
29
+ for (const [c, d] of snapshot) {
30
+ if (b === c) {
31
+ const key = `${a}|${d}`;
32
+ if (!closure.has(key)) {
33
+ closure.add(key);
34
+ changed = true;
35
+ }
36
+ }
37
+ }
38
+ }
39
+ }
40
+ // Antisimetría se asume verificada por el cliente (no la chequeamos
41
+ // aquí — si el cliente da un ciclo, simplemente colapsa elementos en
42
+ // la categoría resultante y los tests lo detectarán).
43
+ const morphisms = new Map();
44
+ for (const key of closure) {
45
+ const [a, b] = key.split('|');
46
+ const mid = `${a}→${b}:leq`;
47
+ morphisms.set(mid, { id: mid, src: a, tgt: b });
48
+ }
49
+ const objectsSet = new Set(elements);
50
+ function identity(obj) {
51
+ const m = morphisms.get(`${obj}→${obj}:leq`);
52
+ if (!m)
53
+ throw new Error(`Poset: missing identity for ${obj}`);
54
+ return m;
55
+ }
56
+ function compose(g, f) {
57
+ if (f.tgt !== g.src) {
58
+ throw new Error(`Poset compose: dom mismatch ${f.id} ; ${g.id}`);
59
+ }
60
+ const id = `${f.src}→${g.tgt}:leq`;
61
+ const m = morphisms.get(id);
62
+ if (!m)
63
+ throw new Error(`Poset compose: missing morphism ${id}`);
64
+ return m;
65
+ }
66
+ function source(m) {
67
+ return m.src;
68
+ }
69
+ function target(m) {
70
+ return m.tgt;
71
+ }
72
+ function eqMor(a, b) {
73
+ return a.id === b.id;
74
+ }
75
+ function eqObj(a, b) {
76
+ return a === b;
77
+ }
78
+ function hom(a, b) {
79
+ const m = morphisms.get(`${a}→${b}:leq`);
80
+ return m ? [m] : [];
81
+ }
82
+ function verifyAssociativity() {
83
+ // En un poset cualquier composición es única, asociativa por
84
+ // construcción.
85
+ return true;
86
+ }
87
+ function verifyIdentity() {
88
+ // Reflexividad y composición con identidad: triviales por
89
+ // construcción al estar la clausura reflexiva añadida.
90
+ for (const m of morphisms.values()) {
91
+ const idSrc = identity(m.src);
92
+ const idTgt = identity(m.tgt);
93
+ if (compose(m, idSrc).id !== m.id)
94
+ return false;
95
+ if (compose(idTgt, m).id !== m.id)
96
+ return false;
97
+ }
98
+ return true;
99
+ }
100
+ return {
101
+ name: 'Poset',
102
+ objects: objectsSet,
103
+ morphisms,
104
+ identity,
105
+ compose,
106
+ source,
107
+ target,
108
+ eqMor,
109
+ eqObj,
110
+ hom,
111
+ verifyAssociativity,
112
+ verifyIdentity,
113
+ };
114
+ }
115
+ //# sourceMappingURL=poset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poset.js","sourceRoot":"","sources":["../../src/categorical/poset.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,wCAAwC;AACxC,+DAA+D;AAC/D,iEAAiE;AACjE,gEAAgE;AAChE,mEAAmE;AACnE,8BAA8B;AAC9B,+DAA+D;;AAgB/D,sBAsGC;AA3GD;;;;GAIG;AACH,SAAgB,KAAK,CACnB,QAA+B,EAC/B,GAA6C;IAE7C,wDAAwD;IACxD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEnD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,OAAO,OAAO,EAAE,CAAC;QACf,OAAO,GAAG,KAAK,CAAC;QAChB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC,CAAC;QAClF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC9B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACZ,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBACtB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBACjB,OAAO,GAAG,IAAI,CAAC;oBACjB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,qEAAqE;IACrE,sDAAsD;IAEtD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;QAClD,MAAM,GAAG,GAAU,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QACnC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS,QAAQ,CAAC,CAAC;IAE7C,SAAS,QAAQ,CAAC,GAAW;QAC3B,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,SAAS,OAAO,CAAC,CAAW,EAAE,CAAW;QACvC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,EAAE,GAAU,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;QAC1C,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,EAAE,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,SAAS,MAAM,CAAC,CAAW;QACzB,OAAO,CAAC,CAAC,GAAG,CAAC;IACf,CAAC;IACD,SAAS,MAAM,CAAC,CAAW;QACzB,OAAO,CAAC,CAAC,GAAG,CAAC;IACf,CAAC;IACD,SAAS,KAAK,CAAC,CAAW,EAAE,CAAW;QACrC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;IACvB,CAAC;IACD,SAAS,KAAK,CAAC,CAAS,EAAE,CAAS;QACjC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IACD,SAAS,GAAG,CAAC,CAAS,EAAE,CAAS;QAC/B,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtB,CAAC;IACD,SAAS,mBAAmB;QAC1B,6DAA6D;QAC7D,gBAAgB;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,SAAS,cAAc;QACrB,0DAA0D;QAC1D,uDAAuD;QACvD,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAC;YAChD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,UAAU;QACnB,SAAS;QACT,QAAQ;QACR,OAAO;QACP,MAAM;QACN,MAAM;QACN,KAAK;QACL,KAAK;QACL,GAAG;QACH,mBAAmB;QACnB,cAAc;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Identidad estable de un morfismo. Las categorías construidas
3
+ * en este módulo usan strings derivados de `src→tgt:name`, pero
4
+ * un cliente puede definir su propio esquema mientras sea único.
5
+ */
6
+ export type MorId = string;
7
+ /**
8
+ * Una categoría sobre objetos `Obj` y morfismos `Mor`. Las
9
+ * propiedades `objects` y `morphisms` exponen el grafo subyacente
10
+ * para tests y consumidores que necesiten iterar.
11
+ *
12
+ * Los morfismos viven en un `Map<MorId, Mor>` para que el chequeo
13
+ * de leyes pueda muestrear pares aleatorios sin coste prohibitivo.
14
+ */
15
+ export interface Category<Obj, Mor> {
16
+ readonly name: string;
17
+ readonly objects: Set<Obj>;
18
+ readonly morphisms: Map<MorId, Mor>;
19
+ /** Devuelve la identidad para un objeto (axioma: existe y es única). */
20
+ identity(obj: Obj): Mor;
21
+ /** Composición g ∘ f (lee de derecha a izquierda: aplica f y luego g). */
22
+ compose(g: Mor, f: Mor): Mor;
23
+ /** Dominio del morfismo. */
24
+ source(m: Mor): Obj;
25
+ /** Codominio del morfismo. */
26
+ target(m: Mor): Obj;
27
+ /** Igualdad de morfismos (semántica del modelo concreto). */
28
+ eqMor(a: Mor, b: Mor): boolean;
29
+ /** Igualdad de objetos (semántica del modelo concreto). */
30
+ eqObj(a: Obj, b: Obj): boolean;
31
+ /** Devuelve todos los morfismos a→b. Útil para tests y para limits. */
32
+ hom(a: Obj, b: Obj): Mor[];
33
+ /** Verifica asociatividad: (h∘g)∘f = h∘(g∘f) sobre un muestreo. */
34
+ verifyAssociativity(sample?: number): boolean;
35
+ /** Verifica id ∘ f = f y f ∘ id = f. */
36
+ verifyIdentity(sample?: number): boolean;
37
+ }
38
+ /**
39
+ * Functor F : C → D, dado por su acción en objetos y morfismos.
40
+ * Debe preservar identidad y composición; ambas son verificables.
41
+ */
42
+ export interface Functor<O1, M1, O2, M2> {
43
+ readonly name: string;
44
+ readonly source: Category<O1, M1>;
45
+ readonly target: Category<O2, M2>;
46
+ onObjects(obj: O1): O2;
47
+ onMorphisms(mor: M1): M2;
48
+ /** F(id_a) = id_{F(a)} para todo objeto. */
49
+ verifyIdentityPreservation(): boolean;
50
+ /** F(g∘f) = F(g)∘F(f). */
51
+ verifyComposition(sample?: number): boolean;
52
+ }
53
+ /**
54
+ * Transformación natural η : F ⇒ G entre functores paralelos
55
+ * F, G : C → D. Cada componente `η_a : F(a) → G(a)`. La condición
56
+ * de naturalidad es G(f) ∘ η_a = η_b ∘ F(f) para f : a→b en C.
57
+ */
58
+ export interface NaturalTransformation<O1, M1, O2, M2> {
59
+ readonly name: string;
60
+ readonly source: Functor<O1, M1, O2, M2>;
61
+ readonly target: Functor<O1, M1, O2, M2>;
62
+ component(obj: O1): M2;
63
+ verifyNaturality(sample?: number): boolean;
64
+ }
65
+ /**
66
+ * Un diagrama es un functor desde una categoría índice J (típicamente
67
+ * pequeña, finita) a la categoría ambiente C. Para nuestros usos
68
+ * concretos representamos el diagrama por sus vértices (objetos
69
+ * de C imagen) y sus aristas (morfismos forzados entre ellos).
70
+ */
71
+ export interface Diagram<O, M> {
72
+ readonly vertices: Map<string, O>;
73
+ readonly edges: Array<{
74
+ from: string;
75
+ to: string;
76
+ mor: M;
77
+ }>;
78
+ }
79
+ /**
80
+ * Cono sobre un diagrama: un objeto ápice junto con un morfismo
81
+ * (`leg`) hacia cada vértice del diagrama, conmutando con sus aristas.
82
+ */
83
+ export interface Cone<O, M> {
84
+ apex: O;
85
+ legs: Map<string, M>;
86
+ }
87
+ /**
88
+ * Cocono (dual del cono): un ápice con morfismos *desde* cada vértice.
89
+ */
90
+ export interface Cocone<O, M> {
91
+ apex: O;
92
+ legs: Map<string, M>;
93
+ }
94
+ /**
95
+ * Categoría monoidal: añade producto tensorial y unidad sobre
96
+ * la estructura categórica. No imponemos asociadores ni unitores
97
+ * explícitos — los modelos concretos (Set con ×) son estrictos
98
+ * suficiente para verificar α, λ, ρ por igualdad en objetos.
99
+ */
100
+ export interface MonoidalCategory<O, M> extends Category<O, M> {
101
+ readonly unit: O;
102
+ tensor(a: O, b: O): O;
103
+ tensorMor(f: M, g: M): M;
104
+ /** Unitor izquierdo: 1 ⊗ a ≅ a (verificable por igualdad de objetos). */
105
+ verifyLeftUnitor(sample?: number): boolean;
106
+ /** Unitor derecho: a ⊗ 1 ≅ a. */
107
+ verifyRightUnitor(sample?: number): boolean;
108
+ /** Asociador: (a⊗b)⊗c = a⊗(b⊗c). */
109
+ verifyAssociator(sample?: number): boolean;
110
+ }
111
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/categorical/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // ST Categorical — Tipos públicos
4
+ // ============================================================
5
+ // Definiciones de interfaz para Category, Functor,
6
+ // NaturalTransformation, Cone, Diagram y MonoidalCategory.
7
+ //
8
+ // Decisión de diseño: cada morfismo se identifica por su `id`
9
+ // (clave estable string-able). La categoría es responsable de
10
+ // resolver compose / source / target a partir de la identidad
11
+ // del morfismo. Esto permite igualdad estructural simple por
12
+ // `id`, sin tener que comparar callbacks o funciones.
13
+ // ============================================================
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/categorical/types.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,kCAAkC;AAClC,+DAA+D;AAC/D,mDAAmD;AACnD,2DAA2D;AAC3D,EAAE;AACF,8DAA8D;AAC9D,8DAA8D;AAC9D,8DAA8D;AAC9D,6DAA6D;AAC7D,sDAAsD;AACtD,+DAA+D"}
@@ -0,0 +1,51 @@
1
+ import type { FailurePair, Process, Trace } from './types';
2
+ /**
3
+ * Enumera todas las trazas de `p` hasta longitud `maxLength` (inclusive).
4
+ * Incluye la traza vacía (siempre presente) y los prefijos intermedios.
5
+ *
6
+ * Las trazas se devuelven sin duplicados, ordenadas por longitud
7
+ * ascendente, y como copias de arrays inmutables (las modificaciones no
8
+ * afectan el motor).
9
+ */
10
+ export declare function traces(p: Process, maxLength?: number): Trace[];
11
+ /**
12
+ * Calcula failures hasta `maxLength`. Para cada traza alcanzable, registra
13
+ * los refusal sets posibles iterando todas las resoluciones internas del
14
+ * estado tras la traza.
15
+ *
16
+ * Devuelve una lista (no un set) porque los refusal sets son objetos —
17
+ * agrupamos por igualdad estructural y deduplicamos manualmente.
18
+ */
19
+ export declare function failures(p: Process, maxLength?: number): FailurePair[];
20
+ /**
21
+ * Hay deadlock si el proceso no ofrece NINGÚN evento (ni siquiera ✓) en
22
+ * ALGUNA resolución interna alcanzable desde el estado inicial.
23
+ *
24
+ * En `STOP` el chequeo es trivial: `nextEvents(STOP) = ∅`.
25
+ */
26
+ export declare function isDeadlocked(p: Process): boolean;
27
+ /**
28
+ * Detección heurística de livelock: el proceso recorre eventos ocultos
29
+ * (τ) indefinidamente sin avanzar visiblemente. Implementación: chequea
30
+ * si la profundidad de despliegues internos excede `depth` sin ofrecer
31
+ * eventos visibles.
32
+ *
33
+ * No es decisión: usamos límite acotado. Útil para advertir sobre `μX.X`
34
+ * o `(a → STOP) \ {a}` con loop.
35
+ */
36
+ export declare function isLiveLocked(p: Process, depth?: number): boolean;
37
+ /**
38
+ * P ⊑_T Q : Q refina a P en trazas sii cada traza de Q es traza de P.
39
+ * Equivalentemente: Q no puede hacer nada que P no pudiera observar.
40
+ */
41
+ export declare function refinesTraces(spec: Process, impl: Process, maxLength?: number): boolean;
42
+ /**
43
+ * P ⊑_F Q : refinamiento en failures. Q refina a P sii:
44
+ * (a) traces(Q) ⊆ traces(P)
45
+ * (b) failures(Q) ⊆ failures(P)
46
+ *
47
+ * Una falla `(t, R)` de Q debe poder ser exhibida también por P. Esto
48
+ * capta el principio de que Q es "menos no-determinista" que P.
49
+ */
50
+ export declare function refinesFailures(spec: Process, impl: Process, maxLength?: number): boolean;
51
+ //# sourceMappingURL=analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/csp-hoare/analysis.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAS,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKlE;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,SAAI,GAAG,KAAK,EAAE,CAqCzD;AAuBD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,SAAI,GAAG,WAAW,EAAE,CAoCjE;AAwBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAKhD;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,SAAK,GAAG,OAAO,CAS5D;AAqDD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,SAAI,GAAG,OAAO,CAOlF;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,SAAI,GAAG,OAAO,CA8BpF"}
@@ -0,0 +1,317 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // CSP Hoare — Trazas, failures, deadlock, livelock, refinement
4
+ // ============================================================
5
+ // Sobre la LTS definida en `semantics.ts` calculamos las semánticas
6
+ // observacionales clásicas de CSP:
7
+ //
8
+ // • traces(P) — conjunto de prefijos de eventos visibles posibles.
9
+ // • failures(P) — pares (traza, refusal). El conjunto de refusal es el
10
+ // conjunto de eventos que el proceso PUEDE rehusar tras
11
+ // esa traza, bajo ALGUNA resolución del no-determinismo.
12
+ //
13
+ // Refinement (notación CSP estándar):
14
+ //
15
+ // P ⊑_T Q ⇔ traces(Q) ⊆ traces(P)
16
+ // P ⊑_F Q ⇔ traces(Q) ⊆ traces(P) ∧ failures(Q) ⊆ failures(P)
17
+ //
18
+ // Intuición: Q refina a P sii Q es "más predecible" / "más determinista".
19
+ // STOP es el refinement máximo: refina todo lo que tenga traza vacía.
20
+ // ============================================================
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.traces = traces;
23
+ exports.failures = failures;
24
+ exports.isDeadlocked = isDeadlocked;
25
+ exports.isLiveLocked = isLiveLocked;
26
+ exports.refinesTraces = refinesTraces;
27
+ exports.refinesFailures = refinesFailures;
28
+ const semantics_1 = require("./semantics");
29
+ // ── Trazas ──────────────────────────────────────────────────
30
+ /**
31
+ * Enumera todas las trazas de `p` hasta longitud `maxLength` (inclusive).
32
+ * Incluye la traza vacía (siempre presente) y los prefijos intermedios.
33
+ *
34
+ * Las trazas se devuelven sin duplicados, ordenadas por longitud
35
+ * ascendente, y como copias de arrays inmutables (las modificaciones no
36
+ * afectan el motor).
37
+ */
38
+ function traces(p, maxLength = 6) {
39
+ const seen = new Set();
40
+ const out = [];
41
+ const visit = (q, prefix) => {
42
+ const key = prefix.join('');
43
+ if (seen.has(key))
44
+ return;
45
+ seen.add(key);
46
+ out.push([...prefix]);
47
+ if (prefix.length >= maxLength)
48
+ return;
49
+ // Para enumerar trazas hay que considerar TODAS las resoluciones
50
+ // internas: cada rama puede ofrecer eventos distintos.
51
+ const resolutions = (0, semantics_1.internalResolutions)(q);
52
+ for (const r of resolutions) {
53
+ const initials = (0, semantics_1.nextEvents)(r);
54
+ for (const e of initials) {
55
+ const next = (0, semantics_1.step)(r, e);
56
+ if (next !== null) {
57
+ visit(next, [...prefix, e]);
58
+ }
59
+ }
60
+ }
61
+ };
62
+ visit(p, []);
63
+ // Orden estable: por longitud, luego lex.
64
+ out.sort((a, b) => {
65
+ if (a.length !== b.length)
66
+ return a.length - b.length;
67
+ for (let i = 0; i < a.length; i++) {
68
+ const av = a[i] ?? '';
69
+ const bv = b[i] ?? '';
70
+ if (av !== bv)
71
+ return av < bv ? -1 : 1;
72
+ }
73
+ return 0;
74
+ });
75
+ return out;
76
+ }
77
+ // ── Failures ────────────────────────────────────────────────
78
+ /**
79
+ * Para una RESOLUCIÓN interna estable `q`, el conjunto de refusal máximo
80
+ * sobre un alfabeto candidato `Σ` es: todo evento de `Σ` que `q` no
81
+ * ofrezca como inicial. (Definición estándar: R es refusal sii q no
82
+ * tiene transición para ningún a ∈ R.)
83
+ *
84
+ * `candidates` debe ser el conjunto de eventos relevantes (alfabeto de
85
+ * comparación) — típicamente la unión sintáctica de los alfabetos de los
86
+ * procesos involucrados en un test de refinement.
87
+ */
88
+ function refusalsOf(q, candidates) {
89
+ const offered = (0, semantics_1.nextEvents)(q);
90
+ const r = new Set();
91
+ for (const e of candidates) {
92
+ if (!offered.has(e))
93
+ r.add(e);
94
+ }
95
+ return r;
96
+ }
97
+ /**
98
+ * Calcula failures hasta `maxLength`. Para cada traza alcanzable, registra
99
+ * los refusal sets posibles iterando todas las resoluciones internas del
100
+ * estado tras la traza.
101
+ *
102
+ * Devuelve una lista (no un set) porque los refusal sets son objetos —
103
+ * agrupamos por igualdad estructural y deduplicamos manualmente.
104
+ */
105
+ function failures(p, maxLength = 4) {
106
+ const alphaPrime = collectVisibleEvents(p);
107
+ const reachable = [];
108
+ const seenStates = new Set();
109
+ const enqueue = (state, trace) => {
110
+ const key = trace.join('');
111
+ if (seenStates.has(key))
112
+ return;
113
+ seenStates.add(key);
114
+ reachable.push({ state, trace });
115
+ if (trace.length >= maxLength)
116
+ return;
117
+ const resolutions = (0, semantics_1.internalResolutions)(state);
118
+ for (const r of resolutions) {
119
+ const initials = (0, semantics_1.nextEvents)(r);
120
+ for (const e of initials) {
121
+ const next = (0, semantics_1.step)(r, e);
122
+ if (next !== null)
123
+ enqueue(next, [...trace, e]);
124
+ }
125
+ }
126
+ };
127
+ enqueue(p, []);
128
+ const out = [];
129
+ const seenPairs = new Set();
130
+ for (const { state, trace } of reachable) {
131
+ const resolutions = (0, semantics_1.internalResolutions)(state);
132
+ for (const r of resolutions) {
133
+ const ref = refusalsOf(r, alphaPrime);
134
+ const k = trace.join('') + '|' + [...ref].sort().join(',');
135
+ if (seenPairs.has(k))
136
+ continue;
137
+ seenPairs.add(k);
138
+ out.push({ trace: [...trace], refusal: ref });
139
+ }
140
+ }
141
+ return out;
142
+ }
143
+ /** Alfabeto visible relevante (incluye tick si aparece). */
144
+ function collectVisibleEvents(p) {
145
+ // Reaprovechamos `traces` superficialmente: alcanzamos hasta profundidad
146
+ // moderada para acumular eventos efectivamente observables.
147
+ const out = new Set();
148
+ const visit = (q, depth) => {
149
+ if (depth > 8)
150
+ return;
151
+ for (const r of (0, semantics_1.internalResolutions)(q)) {
152
+ const initials = (0, semantics_1.nextEvents)(r);
153
+ for (const e of initials) {
154
+ out.add(e);
155
+ const next = (0, semantics_1.step)(r, e);
156
+ if (next !== null)
157
+ visit(next, depth + 1);
158
+ }
159
+ }
160
+ };
161
+ visit(p, 0);
162
+ return out;
163
+ }
164
+ // ── Deadlock / livelock ─────────────────────────────────────
165
+ /**
166
+ * Hay deadlock si el proceso no ofrece NINGÚN evento (ni siquiera ✓) en
167
+ * ALGUNA resolución interna alcanzable desde el estado inicial.
168
+ *
169
+ * En `STOP` el chequeo es trivial: `nextEvents(STOP) = ∅`.
170
+ */
171
+ function isDeadlocked(p) {
172
+ for (const r of (0, semantics_1.internalResolutions)(p)) {
173
+ if ((0, semantics_1.nextEvents)(r).size === 0)
174
+ return true;
175
+ }
176
+ return false;
177
+ }
178
+ /**
179
+ * Detección heurística de livelock: el proceso recorre eventos ocultos
180
+ * (τ) indefinidamente sin avanzar visiblemente. Implementación: chequea
181
+ * si la profundidad de despliegues internos excede `depth` sin ofrecer
182
+ * eventos visibles.
183
+ *
184
+ * No es decisión: usamos límite acotado. Útil para advertir sobre `μX.X`
185
+ * o `(a → STOP) \ {a}` con loop.
186
+ */
187
+ function isLiveLocked(p, depth = 32) {
188
+ // Estrategia: si tras `depth` resoluciones internas seguidas no hay
189
+ // eventos visibles (cardinality 0) pero la recursión sigue siendo
190
+ // "productiva" internamente, lo consideramos livelock probable.
191
+ const initials = (0, semantics_1.nextEvents)(p);
192
+ if (initials.size > 0)
193
+ return false;
194
+ // Sin eventos: distinguir deadlock estructural (STOP) vs livelock real
195
+ // requiere examinar el cuerpo de la recursión.
196
+ return isLiveLockedRec(p, depth);
197
+ }
198
+ function isLiveLockedRec(p, depth) {
199
+ if (depth <= 0)
200
+ return true;
201
+ // Si hay recursión que se autoincorpora sin guarda visible, divergir.
202
+ if (p.kind === 'recursion') {
203
+ // Cuerpo sin prefix ni skip → diverge.
204
+ if (!hasVisibleGuard(p.body, p.name))
205
+ return true;
206
+ return false;
207
+ }
208
+ if (p.kind === 'hide') {
209
+ // Si todos los eventos iniciales son ocultos, podemos estar en un loop τ.
210
+ const hidden = new Set(p.events);
211
+ const inner = (0, semantics_1.nextEvents)(p.process);
212
+ if (inner.size === 0)
213
+ return false;
214
+ let allHidden = true;
215
+ for (const e of inner) {
216
+ if (!hidden.has(e)) {
217
+ allHidden = false;
218
+ break;
219
+ }
220
+ }
221
+ return allHidden;
222
+ }
223
+ return false;
224
+ }
225
+ function hasVisibleGuard(body, recName) {
226
+ switch (body.kind) {
227
+ case 'prefix':
228
+ return true; // hay un evento visible antes de recurrir.
229
+ case 'skip':
230
+ return true; // SKIP da ✓ (visible).
231
+ case 'choice':
232
+ case 'internal':
233
+ case 'parallel':
234
+ case 'interleave':
235
+ case 'sequence':
236
+ return hasVisibleGuard(body.left, recName) || hasVisibleGuard(body.right, recName);
237
+ case 'hide':
238
+ case 'rename':
239
+ return hasVisibleGuard(body.process, recName);
240
+ case 'recursion':
241
+ return hasVisibleGuard(body.body, recName);
242
+ case 'var':
243
+ return body.name !== recName; // si referencia otra var, asumimos guardada.
244
+ case 'stop':
245
+ return true; // STOP no es guarda pero tampoco divergente.
246
+ }
247
+ }
248
+ // ── Refinement ──────────────────────────────────────────────
249
+ /**
250
+ * P ⊑_T Q : Q refina a P en trazas sii cada traza de Q es traza de P.
251
+ * Equivalentemente: Q no puede hacer nada que P no pudiera observar.
252
+ */
253
+ function refinesTraces(spec, impl, maxLength = 6) {
254
+ const specTraces = encodeSet(traces(spec, maxLength));
255
+ const implTraces = traces(impl, maxLength);
256
+ for (const t of implTraces) {
257
+ if (!specTraces.has(encodeTrace(t)))
258
+ return false;
259
+ }
260
+ return true;
261
+ }
262
+ /**
263
+ * P ⊑_F Q : refinamiento en failures. Q refina a P sii:
264
+ * (a) traces(Q) ⊆ traces(P)
265
+ * (b) failures(Q) ⊆ failures(P)
266
+ *
267
+ * Una falla `(t, R)` de Q debe poder ser exhibida también por P. Esto
268
+ * capta el principio de que Q es "menos no-determinista" que P.
269
+ */
270
+ function refinesFailures(spec, impl, maxLength = 4) {
271
+ if (!refinesTraces(spec, impl, maxLength))
272
+ return false;
273
+ const specF = failures(spec, maxLength);
274
+ const implF = failures(impl, maxLength);
275
+ // Para cada failure de impl, debe existir un failure de spec con la
276
+ // misma traza y un refusal ⊇ del de impl. (Refusal sets son cerrados
277
+ // por subconjunto en CSP: si P rehúsa R, también rehúsa todo R' ⊆ R.)
278
+ const specByTrace = new Map();
279
+ for (const f of specF) {
280
+ const k = encodeTrace(f.trace);
281
+ const arr = specByTrace.get(k) ?? [];
282
+ arr.push(f.refusal);
283
+ specByTrace.set(k, arr);
284
+ }
285
+ for (const f of implF) {
286
+ const k = encodeTrace(f.trace);
287
+ const candidates = specByTrace.get(k);
288
+ if (!candidates)
289
+ return false;
290
+ let matched = false;
291
+ for (const r of candidates) {
292
+ if (subsetEq(f.refusal, r)) {
293
+ matched = true;
294
+ break;
295
+ }
296
+ }
297
+ if (!matched)
298
+ return false;
299
+ }
300
+ return true;
301
+ }
302
+ function encodeTrace(t) {
303
+ return t.join('');
304
+ }
305
+ function encodeSet(ts) {
306
+ const out = new Set();
307
+ for (const t of ts)
308
+ out.add(encodeTrace(t));
309
+ return out;
310
+ }
311
+ function subsetEq(a, b) {
312
+ for (const e of a)
313
+ if (!b.has(e))
314
+ return false;
315
+ return true;
316
+ }
317
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/csp-hoare/analysis.ts"],"names":[],"mappings":"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"}