@stevenvo780/st-lang 4.7.0 → 4.8.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 (145) hide show
  1. package/dist/namespaces/reasoning.d.ts +2 -1
  2. package/dist/namespaces/reasoning.d.ts.map +1 -1
  3. package/dist/namespaces/reasoning.js +3 -1
  4. package/dist/namespaces/reasoning.js.map +1 -1
  5. package/dist/reasoning/combinatorial-games/index.d.ts +105 -0
  6. package/dist/reasoning/combinatorial-games/index.d.ts.map +1 -0
  7. package/dist/reasoning/combinatorial-games/index.js +377 -0
  8. package/dist/reasoning/combinatorial-games/index.js.map +1 -0
  9. package/dist/reasoning/mechanism-design/auctions.d.ts +49 -0
  10. package/dist/reasoning/mechanism-design/auctions.d.ts.map +1 -0
  11. package/dist/reasoning/mechanism-design/auctions.js +179 -0
  12. package/dist/reasoning/mechanism-design/auctions.js.map +1 -0
  13. package/dist/reasoning/mechanism-design/index.d.ts +5 -0
  14. package/dist/reasoning/mechanism-design/index.d.ts.map +1 -0
  15. package/dist/reasoning/mechanism-design/index.js +39 -0
  16. package/dist/reasoning/mechanism-design/index.js.map +1 -0
  17. package/dist/reasoning/mechanism-design/myerson.d.ts +64 -0
  18. package/dist/reasoning/mechanism-design/myerson.d.ts.map +1 -0
  19. package/dist/reasoning/mechanism-design/myerson.js +253 -0
  20. package/dist/reasoning/mechanism-design/myerson.js.map +1 -0
  21. package/dist/reasoning/mechanism-design/types.d.ts +44 -0
  22. package/dist/reasoning/mechanism-design/types.d.ts.map +1 -0
  23. package/dist/reasoning/mechanism-design/types.js +22 -0
  24. package/dist/reasoning/mechanism-design/types.js.map +1 -0
  25. package/dist/reasoning/mechanism-design/vcg.d.ts +29 -0
  26. package/dist/reasoning/mechanism-design/vcg.d.ts.map +1 -0
  27. package/dist/reasoning/mechanism-design/vcg.js +305 -0
  28. package/dist/reasoning/mechanism-design/vcg.js.map +1 -0
  29. package/dist/reasoning/probabilistic/distributions.d.ts +44 -0
  30. package/dist/reasoning/probabilistic/distributions.d.ts.map +1 -0
  31. package/dist/reasoning/probabilistic/distributions.js +207 -0
  32. package/dist/reasoning/probabilistic/distributions.js.map +1 -0
  33. package/dist/reasoning/probabilistic/examples.d.ts +31 -0
  34. package/dist/reasoning/probabilistic/examples.d.ts.map +1 -0
  35. package/dist/reasoning/probabilistic/examples.js +85 -0
  36. package/dist/reasoning/probabilistic/examples.js.map +1 -0
  37. package/dist/reasoning/probabilistic/index.d.ts +6 -0
  38. package/dist/reasoning/probabilistic/index.d.ts.map +1 -0
  39. package/dist/reasoning/probabilistic/index.js +42 -0
  40. package/dist/reasoning/probabilistic/index.js.map +1 -0
  41. package/dist/reasoning/probabilistic/inference.d.ts +45 -0
  42. package/dist/reasoning/probabilistic/inference.d.ts.map +1 -0
  43. package/dist/reasoning/probabilistic/inference.js +579 -0
  44. package/dist/reasoning/probabilistic/inference.js.map +1 -0
  45. package/dist/reasoning/probabilistic/types.d.ts +153 -0
  46. package/dist/reasoning/probabilistic/types.d.ts.map +1 -0
  47. package/dist/reasoning/probabilistic/types.js +37 -0
  48. package/dist/reasoning/probabilistic/types.js.map +1 -0
  49. package/dist/solver/smt-z3/index.d.ts +3 -0
  50. package/dist/solver/smt-z3/index.d.ts.map +1 -0
  51. package/dist/solver/smt-z3/index.js +11 -0
  52. package/dist/solver/smt-z3/index.js.map +1 -0
  53. package/dist/solver/smt-z3/types.d.ts +52 -0
  54. package/dist/solver/smt-z3/types.d.ts.map +1 -0
  55. package/dist/solver/smt-z3/types.js +6 -0
  56. package/dist/solver/smt-z3/types.js.map +1 -0
  57. package/dist/solver/smt-z3/z3-wasm-backend.d.ts +88 -0
  58. package/dist/solver/smt-z3/z3-wasm-backend.d.ts.map +1 -0
  59. package/dist/solver/smt-z3/z3-wasm-backend.js +437 -0
  60. package/dist/solver/smt-z3/z3-wasm-backend.js.map +1 -0
  61. package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.d.ts +2 -0
  62. package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.d.ts.map +1 -0
  63. package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.js +203 -0
  64. package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.js.map +1 -0
  65. package/dist/tests/reasoning/mechanism-design/mechanism-design.test.d.ts +2 -0
  66. package/dist/tests/reasoning/mechanism-design/mechanism-design.test.d.ts.map +1 -0
  67. package/dist/tests/reasoning/mechanism-design/mechanism-design.test.js +290 -0
  68. package/dist/tests/reasoning/mechanism-design/mechanism-design.test.js.map +1 -0
  69. package/dist/tests/reasoning/probabilistic/probabilistic.test.d.ts +2 -0
  70. package/dist/tests/reasoning/probabilistic/probabilistic.test.d.ts.map +1 -0
  71. package/dist/tests/reasoning/probabilistic/probabilistic.test.js +370 -0
  72. package/dist/tests/reasoning/probabilistic/probabilistic.test.js.map +1 -0
  73. package/dist/tests/solver/smt-z3/z3-wasm-backend.test.d.ts +2 -0
  74. package/dist/tests/solver/smt-z3/z3-wasm-backend.test.d.ts.map +1 -0
  75. package/dist/tests/solver/smt-z3/z3-wasm-backend.test.js +394 -0
  76. package/dist/tests/solver/smt-z3/z3-wasm-backend.test.js.map +1 -0
  77. package/dist/tests/tooling/proof-guidance/features.test.d.ts +2 -0
  78. package/dist/tests/tooling/proof-guidance/features.test.d.ts.map +1 -0
  79. package/dist/tests/tooling/proof-guidance/features.test.js +72 -0
  80. package/dist/tests/tooling/proof-guidance/features.test.js.map +1 -0
  81. package/dist/tests/tooling/proof-guidance/model.test.d.ts +2 -0
  82. package/dist/tests/tooling/proof-guidance/model.test.d.ts.map +1 -0
  83. package/dist/tests/tooling/proof-guidance/model.test.js +165 -0
  84. package/dist/tests/tooling/proof-guidance/model.test.js.map +1 -0
  85. package/dist/tests/tooling/proof-guidance/search.test.d.ts +2 -0
  86. package/dist/tests/tooling/proof-guidance/search.test.d.ts.map +1 -0
  87. package/dist/tests/tooling/proof-guidance/search.test.js +238 -0
  88. package/dist/tests/tooling/proof-guidance/search.test.js.map +1 -0
  89. package/dist/tests/type-theory/cubical/cubical.test.d.ts +2 -0
  90. package/dist/tests/type-theory/cubical/cubical.test.d.ts.map +1 -0
  91. package/dist/tests/type-theory/cubical/cubical.test.js +207 -0
  92. package/dist/tests/type-theory/cubical/cubical.test.js.map +1 -0
  93. package/dist/tooling/proof-guidance/features.d.ts +10 -0
  94. package/dist/tooling/proof-guidance/features.d.ts.map +1 -0
  95. package/dist/tooling/proof-guidance/features.js +97 -0
  96. package/dist/tooling/proof-guidance/features.js.map +1 -0
  97. package/dist/tooling/proof-guidance/index.d.ts +5 -0
  98. package/dist/tooling/proof-guidance/index.d.ts.map +1 -0
  99. package/dist/tooling/proof-guidance/index.js +25 -0
  100. package/dist/tooling/proof-guidance/index.js.map +1 -0
  101. package/dist/tooling/proof-guidance/model.d.ts +42 -0
  102. package/dist/tooling/proof-guidance/model.d.ts.map +1 -0
  103. package/dist/tooling/proof-guidance/model.js +149 -0
  104. package/dist/tooling/proof-guidance/model.js.map +1 -0
  105. package/dist/tooling/proof-guidance/search.d.ts +7 -0
  106. package/dist/tooling/proof-guidance/search.d.ts.map +1 -0
  107. package/dist/tooling/proof-guidance/search.js +102 -0
  108. package/dist/tooling/proof-guidance/search.js.map +1 -0
  109. package/dist/tooling/proof-guidance/types.d.ts +77 -0
  110. package/dist/tooling/proof-guidance/types.d.ts.map +1 -0
  111. package/dist/tooling/proof-guidance/types.js +8 -0
  112. package/dist/tooling/proof-guidance/types.js.map +1 -0
  113. package/dist/type-theory/cubical/equality.d.ts +4 -0
  114. package/dist/type-theory/cubical/equality.d.ts.map +1 -0
  115. package/dist/type-theory/cubical/equality.js +78 -0
  116. package/dist/type-theory/cubical/equality.js.map +1 -0
  117. package/dist/type-theory/cubical/index.d.ts +14 -0
  118. package/dist/type-theory/cubical/index.d.ts.map +1 -0
  119. package/dist/type-theory/cubical/index.js +71 -0
  120. package/dist/type-theory/cubical/index.js.map +1 -0
  121. package/dist/type-theory/cubical/infer.d.ts +18 -0
  122. package/dist/type-theory/cubical/infer.d.ts.map +1 -0
  123. package/dist/type-theory/cubical/infer.js +241 -0
  124. package/dist/type-theory/cubical/infer.js.map +1 -0
  125. package/dist/type-theory/cubical/interval.d.ts +12 -0
  126. package/dist/type-theory/cubical/interval.d.ts.map +1 -0
  127. package/dist/type-theory/cubical/interval.js +118 -0
  128. package/dist/type-theory/cubical/interval.js.map +1 -0
  129. package/dist/type-theory/cubical/normalize.d.ts +5 -0
  130. package/dist/type-theory/cubical/normalize.d.ts.map +1 -0
  131. package/dist/type-theory/cubical/normalize.js +191 -0
  132. package/dist/type-theory/cubical/normalize.js.map +1 -0
  133. package/dist/type-theory/cubical/path-algebra.d.ts +12 -0
  134. package/dist/type-theory/cubical/path-algebra.d.ts.map +1 -0
  135. package/dist/type-theory/cubical/path-algebra.js +109 -0
  136. package/dist/type-theory/cubical/path-algebra.js.map +1 -0
  137. package/dist/type-theory/cubical/substitute.d.ts +3 -0
  138. package/dist/type-theory/cubical/substitute.d.ts.map +1 -0
  139. package/dist/type-theory/cubical/substitute.js +109 -0
  140. package/dist/type-theory/cubical/substitute.js.map +1 -0
  141. package/dist/type-theory/cubical/types.d.ts +77 -0
  142. package/dist/type-theory/cubical/types.d.ts.map +1 -0
  143. package/dist/type-theory/cubical/types.js +258 -0
  144. package/dist/type-theory/cubical/types.js.map +1 -0
  145. package/package.json +1 -1
@@ -0,0 +1,437 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // ST SMT-Z3 — Backend real basado en z3-solver (WASM in-process)
4
+ // ============================================================
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.Z3WasmBackend = void 0;
40
+ exports.isZ3Available = isZ3Available;
41
+ exports.detectAvailableSMT = detectAvailableSMT;
42
+ let cachedZ3Module;
43
+ let cachedInitError;
44
+ /** Carga perezosa de z3-solver. Cachea el módulo entre instancias. */
45
+ async function loadZ3() {
46
+ if (cachedZ3Module)
47
+ return cachedZ3Module;
48
+ if (cachedInitError !== undefined)
49
+ throw cachedInitError;
50
+ try {
51
+ // Import dinámico + cast a `any`: la API real de z3-solver expone
52
+ // genéricos por Context<Name> que harían el wrapper invasivo. El
53
+ // contrato externo del backend está fijado por AsyncSMTBackend, así
54
+ // que el cast queda contenido aquí.
55
+ const mod = (await Promise.resolve().then(() => __importStar(require('z3-solver'))));
56
+ cachedZ3Module = (await mod.init());
57
+ return cachedZ3Module;
58
+ }
59
+ catch (err) {
60
+ cachedInitError = err;
61
+ throw err;
62
+ }
63
+ }
64
+ /**
65
+ * `isZ3Available()` intenta inicializar z3-solver y devuelve true si
66
+ * obtiene un Context utilizable. No lanza. Útil para skip de tests y
67
+ * detección de runtime.
68
+ */
69
+ async function isZ3Available() {
70
+ try {
71
+ const z3 = await loadZ3();
72
+ // Smoke: crear y liberar un Solver. Si falla el WASM, salimos por catch.
73
+ const ctx = z3.Context('detect-' + Date.now().toString(36));
74
+ const s = new ctx.Solver();
75
+ s.release();
76
+ return true;
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ }
82
+ /**
83
+ * Detector unificado de runtime SMT con preferencia por el WASM in-process.
84
+ * - z3-wasm si la WASM bind carga.
85
+ * - z3-subprocess o cvc5-subprocess si hay binario en PATH.
86
+ * - 'none' si no hay nada.
87
+ */
88
+ async function detectAvailableSMT() {
89
+ if (await isZ3Available())
90
+ return 'z3-wasm';
91
+ // Fallback: importar el detector subprocess sin acoplar build target.
92
+ try {
93
+ const { detectAvailableSMTDetailed } = await Promise.resolve().then(() => __importStar(require('../smt/subprocess-backend')));
94
+ const detected = detectAvailableSMTDetailed();
95
+ if (detected.solver === 'z3')
96
+ return 'z3-subprocess';
97
+ if (detected.solver === 'cvc5')
98
+ return 'cvc5-subprocess';
99
+ }
100
+ catch {
101
+ // ignore — subprocess backend opcional
102
+ }
103
+ return 'none';
104
+ }
105
+ let contextCounter = 0;
106
+ /**
107
+ * Z3WasmBackend — wrapper sobre z3-solver con interfaz AsyncSMTBackend.
108
+ *
109
+ * Modelo de estado:
110
+ * - Mantiene un único `Solver` Z3 cuyo stack push/pop se sincroniza con
111
+ * `scopes[]` del host (espejo). Esto permite re-hidratar el solver con
112
+ * `solver.reset()` + replay de scopes si fuera necesario (no se hace
113
+ * en el flujo normal, sólo en `reset()`).
114
+ * - `assertFormula(body)` mete `(assert body)` en el solver actual,
115
+ * pero también lo registra en `scopes[top].assertions` por trazabilidad.
116
+ * - `getUnsatCore()` requiere haber usado `assertNamed(name, body)`:
117
+ * estos asserts se envuelven en `(=> <track> <body>)` y se pasan como
118
+ * assumption literals al check(). El core devuelto es la lista de
119
+ * nombres `track`.
120
+ */
121
+ class Z3WasmBackend {
122
+ name = 'z3-wasm';
123
+ z3;
124
+ ctx;
125
+ solver;
126
+ logic;
127
+ produceUnsatCore;
128
+ produceModels;
129
+ timeoutMs;
130
+ scopes = [{ decls: [], assertions: [] }];
131
+ /** Tracks declarados como Bool y usados como assumption literals. */
132
+ trackNames = new Set();
133
+ lastModel;
134
+ lastUnsatCore = [];
135
+ lastStatistics = {};
136
+ constructor(z3, ctx, options = {}) {
137
+ this.z3 = z3;
138
+ this.ctx = ctx;
139
+ this.logic = options.logic;
140
+ this.produceUnsatCore = options.produceUnsatCore ?? true;
141
+ this.produceModels = options.produceModels ?? true;
142
+ this.timeoutMs = options.timeoutMs;
143
+ this.solver = this.buildSolver();
144
+ }
145
+ /** Crea un backend nuevo. Falla si z3-solver no puede inicializarse. */
146
+ static async create(logicOrOptions) {
147
+ const options = typeof logicOrOptions === 'string' ? { logic: logicOrOptions } : (logicOrOptions ?? {});
148
+ const z3 = await loadZ3();
149
+ // Cada backend usa su propio Context Z3 para evitar cross-talk entre tests.
150
+ contextCounter += 1;
151
+ const ctx = z3.Context(`st-z3-wasm-${contextCounter}`);
152
+ return new Z3WasmBackend(z3, ctx, options);
153
+ }
154
+ /** Resetea el solver (drop all asserts y scopes). */
155
+ reset() {
156
+ try {
157
+ this.solver.release();
158
+ }
159
+ catch {
160
+ // ignore — release es best-effort
161
+ }
162
+ this.solver = this.buildSolver();
163
+ this.scopes = [{ decls: [], assertions: [] }];
164
+ this.trackNames = new Set();
165
+ this.lastModel = undefined;
166
+ this.lastUnsatCore = [];
167
+ this.lastStatistics = {};
168
+ }
169
+ push() {
170
+ this.solver.push();
171
+ this.scopes.push({ decls: [], assertions: [] });
172
+ }
173
+ pop(levels = 1) {
174
+ const target = Math.min(levels, this.scopes.length - 1);
175
+ if (target <= 0)
176
+ return;
177
+ this.solver.pop(target);
178
+ for (let i = 0; i < target; i += 1) {
179
+ this.scopes.pop();
180
+ }
181
+ }
182
+ declareConst(name, sort, bvWidth) {
183
+ const decl = { name, sort };
184
+ if (sort === 'BitVec')
185
+ decl.bvWidth = bvWidth ?? 32;
186
+ this.currentScope().decls.push(decl);
187
+ this.solver.fromString(this.formatDecl(decl));
188
+ }
189
+ /**
190
+ * Inserta una aserción directa (sin tracking). El cuerpo es SMT-LIB v2
191
+ * SIN envolver en `(assert ...)`.
192
+ */
193
+ assertFormula(smtlib) {
194
+ const body = smtlib.trim();
195
+ if (!body)
196
+ return;
197
+ this.currentScope().assertions.push({ body });
198
+ this.solver.fromString(`(assert ${body})`);
199
+ }
200
+ /**
201
+ * Aserción nombrada para participar de unsat core. El `trackName` se
202
+ * declara como Bool fresco y la aserción real se mete como
203
+ * `(=> trackName body)`. En checkSat() esos tracks se pasan como
204
+ * assumption literals.
205
+ */
206
+ assertNamed(trackName, smtlib) {
207
+ if (!this.produceUnsatCore) {
208
+ // Si el solver no produce core, degradamos a assert simple.
209
+ this.assertFormula(smtlib);
210
+ return;
211
+ }
212
+ const body = smtlib.trim();
213
+ if (!body)
214
+ return;
215
+ if (this.trackNames.has(trackName)) {
216
+ throw new Error(`[z3-wasm] trackName "${trackName}" ya fue usado en este backend`);
217
+ }
218
+ this.trackNames.add(trackName);
219
+ this.currentScope().assertions.push({ body, trackName });
220
+ this.solver.fromString(`(declare-const ${trackName} Bool)`);
221
+ this.solver.fromString(`(assert (=> ${trackName} ${body}))`);
222
+ }
223
+ async checkSat() {
224
+ const assumptions = [];
225
+ if (this.produceUnsatCore) {
226
+ for (const name of this.trackNames) {
227
+ assumptions.push(this.ctx.Bool.const(name));
228
+ }
229
+ }
230
+ let result;
231
+ try {
232
+ result =
233
+ assumptions.length > 0
234
+ ? await this.solver.check(...assumptions)
235
+ : await this.solver.check();
236
+ }
237
+ catch (err) {
238
+ // WASM throw — devolver unknown en lugar de propagar, alineado con el
239
+ // resto de backends que nunca tiran en checkSat.
240
+ this.lastModel = undefined;
241
+ this.lastUnsatCore = [];
242
+ // Bug-friendly: pegar mensaje a las statistics para diagnóstico.
243
+ this.lastStatistics = { error: 1 };
244
+ void err;
245
+ return 'unknown';
246
+ }
247
+ if (result === 'sat') {
248
+ this.lastModel = this.extractModel();
249
+ this.lastUnsatCore = [];
250
+ }
251
+ else if (result === 'unsat') {
252
+ this.lastModel = undefined;
253
+ this.lastUnsatCore = this.extractUnsatCore();
254
+ }
255
+ else {
256
+ this.lastModel = undefined;
257
+ this.lastUnsatCore = [];
258
+ }
259
+ this.lastStatistics = this.extractStatistics();
260
+ return result;
261
+ }
262
+ getModel() {
263
+ return this.lastModel ? { ...this.lastModel } : undefined;
264
+ }
265
+ getUnsatCore() {
266
+ return [...this.lastUnsatCore];
267
+ }
268
+ /**
269
+ * `setOption` envuelve `solver.set(key, value)`. Acepta los nombres
270
+ * estándar Z3 (ej. `timeout`, `random_seed`).
271
+ */
272
+ setOption(key, value) {
273
+ this.solver.set(key, value);
274
+ }
275
+ /** Devuelve la última snapshot de stats Z3 capturada en checkSat(). */
276
+ getStatistics() {
277
+ return { ...this.lastStatistics };
278
+ }
279
+ /**
280
+ * Cierra el solver liberando memoria WASM. Después de close() el
281
+ * backend no debe usarse.
282
+ */
283
+ close() {
284
+ try {
285
+ this.solver.release();
286
+ }
287
+ catch {
288
+ // ignore — release es best-effort
289
+ }
290
+ }
291
+ // --------------------------------------------------------------
292
+ // Internals
293
+ // --------------------------------------------------------------
294
+ buildSolver() {
295
+ const solver = this.logic ? new this.ctx.Solver(this.logic) : new this.ctx.Solver();
296
+ if (this.produceUnsatCore) {
297
+ solver.set('unsat_core', true);
298
+ }
299
+ if (this.produceModels) {
300
+ solver.set('model', true);
301
+ }
302
+ if (this.timeoutMs !== undefined) {
303
+ solver.set('timeout', this.timeoutMs);
304
+ }
305
+ return solver;
306
+ }
307
+ currentScope() {
308
+ const top = this.scopes[this.scopes.length - 1];
309
+ if (!top) {
310
+ const fresh = { decls: [], assertions: [] };
311
+ this.scopes.push(fresh);
312
+ return fresh;
313
+ }
314
+ return top;
315
+ }
316
+ formatDecl(decl) {
317
+ if (decl.sort === 'BitVec') {
318
+ return `(declare-const ${decl.name} (_ BitVec ${decl.bvWidth ?? 32}))`;
319
+ }
320
+ return `(declare-const ${decl.name} ${decl.sort})`;
321
+ }
322
+ extractModel() {
323
+ let model;
324
+ try {
325
+ model = this.solver.model();
326
+ }
327
+ catch {
328
+ return undefined;
329
+ }
330
+ const out = {};
331
+ const decls = model.decls();
332
+ for (const d of decls) {
333
+ const nameAst = d.name();
334
+ const name = nameAst.toString();
335
+ // Saltamos los track names usados internamente para unsat-core.
336
+ if (this.trackNames.has(name))
337
+ continue;
338
+ let raw;
339
+ try {
340
+ raw = model.get(d).toString().trim();
341
+ }
342
+ catch {
343
+ continue;
344
+ }
345
+ out[name] = parseZ3Value(raw);
346
+ }
347
+ return Object.keys(out).length > 0 ? out : undefined;
348
+ }
349
+ extractUnsatCore() {
350
+ let core;
351
+ try {
352
+ core = this.solver.unsatCore();
353
+ }
354
+ catch {
355
+ return [];
356
+ }
357
+ const names = [];
358
+ const len = core.length();
359
+ for (let i = 0; i < len; i += 1) {
360
+ try {
361
+ const lit = core.get(i);
362
+ names.push(lit.toString());
363
+ }
364
+ catch {
365
+ // ignore literal corrupto
366
+ }
367
+ }
368
+ return names;
369
+ }
370
+ extractStatistics() {
371
+ let stats;
372
+ try {
373
+ stats = this.solver.statistics();
374
+ }
375
+ catch {
376
+ return {};
377
+ }
378
+ const out = {};
379
+ try {
380
+ const iter = stats[Symbol.iterator]();
381
+ while (true) {
382
+ const step = iter.next();
383
+ if (step.done)
384
+ break;
385
+ const entry = step.value;
386
+ if (typeof entry.value === 'number' && Number.isFinite(entry.value)) {
387
+ out[entry.key] = entry.value;
388
+ }
389
+ }
390
+ }
391
+ catch {
392
+ // Si la iteración de stats falla, mantenemos el snapshot vacío.
393
+ }
394
+ return out;
395
+ }
396
+ }
397
+ exports.Z3WasmBackend = Z3WasmBackend;
398
+ /**
399
+ * Decodifica el `toString()` de un valor Z3 a una representación JS:
400
+ * - "true"/"false" → boolean
401
+ * - "#xFF" / "#b101" → number (con guard a Number.MAX_SAFE_INTEGER)
402
+ * - decimales y enteros → number (cuando entran en safe range)
403
+ * - resto → string crudo
404
+ */
405
+ function parseZ3Value(raw) {
406
+ if (raw === 'true')
407
+ return true;
408
+ if (raw === 'false')
409
+ return false;
410
+ if (raw.startsWith('#x')) {
411
+ const n = Number.parseInt(raw.slice(2), 16);
412
+ return Number.isSafeInteger(n) ? n : raw;
413
+ }
414
+ if (raw.startsWith('#b')) {
415
+ const n = Number.parseInt(raw.slice(2), 2);
416
+ return Number.isSafeInteger(n) ? n : raw;
417
+ }
418
+ // (- 5) → -5
419
+ const negMatch = /^\(-\s+(\d+(?:\.\d+)?)\)$/.exec(raw);
420
+ if (negMatch && negMatch[1] !== undefined) {
421
+ const n = Number(`-${negMatch[1]}`);
422
+ return Number.isFinite(n) ? n : raw;
423
+ }
424
+ // Racional (/ a b) → a/b
425
+ const ratMatch = /^\(\/\s+(\d+(?:\.\d+)?)\s+(\d+(?:\.\d+)?)\)$/.exec(raw);
426
+ if (ratMatch && ratMatch[1] !== undefined && ratMatch[2] !== undefined) {
427
+ const a = Number(ratMatch[1]);
428
+ const b = Number(ratMatch[2]);
429
+ if (Number.isFinite(a) && Number.isFinite(b) && b !== 0)
430
+ return a / b;
431
+ }
432
+ const numeric = Number(raw);
433
+ if (!Number.isNaN(numeric) && Number.isFinite(numeric))
434
+ return numeric;
435
+ return raw;
436
+ }
437
+ //# sourceMappingURL=z3-wasm-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"z3-wasm-backend.js","sourceRoot":"","sources":["../../../src/solver/smt-z3/z3-wasm-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=combinatorial-games.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combinatorial-games.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/reasoning/combinatorial-games/combinatorial-games.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // ST Combinatorial Games — Tests
4
+ // ============================================================
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const combinatorial_games_1 = require("../../../reasoning/combinatorial-games");
8
+ (0, vitest_1.describe)('combinatorial-games — mex', () => {
9
+ (0, vitest_1.it)('mex(∅) = 0', () => {
10
+ (0, vitest_1.expect)((0, combinatorial_games_1.mex)(new Set())).toBe(0);
11
+ });
12
+ (0, vitest_1.it)('mex({0,1,3}) = 2', () => {
13
+ (0, vitest_1.expect)((0, combinatorial_games_1.mex)(new Set([0, 1, 3]))).toBe(2);
14
+ });
15
+ (0, vitest_1.it)('mex({1,2}) = 0', () => {
16
+ (0, vitest_1.expect)((0, combinatorial_games_1.mex)(new Set([1, 2]))).toBe(0);
17
+ });
18
+ (0, vitest_1.it)('mex({0,1,2,3,4}) = 5', () => {
19
+ (0, vitest_1.expect)((0, combinatorial_games_1.mex)(new Set([0, 1, 2, 3, 4]))).toBe(5);
20
+ });
21
+ });
22
+ (0, vitest_1.describe)('combinatorial-games — nimSum', () => {
23
+ (0, vitest_1.it)('nimSum([]) = 0', () => {
24
+ (0, vitest_1.expect)((0, combinatorial_games_1.nimSum)([])).toBe(0);
25
+ });
26
+ (0, vitest_1.it)('XOR de Nim(3,4,5) = 2', () => {
27
+ (0, vitest_1.expect)((0, combinatorial_games_1.nimSum)([3, 4, 5])).toBe(2);
28
+ });
29
+ (0, vitest_1.it)('XOR de a,a = 0 (autoinverso)', () => {
30
+ (0, vitest_1.expect)((0, combinatorial_games_1.nimSum)([7, 7])).toBe(0);
31
+ });
32
+ });
33
+ (0, vitest_1.describe)('combinatorial-games — Nim 1D (un solo montón)', () => {
34
+ (0, vitest_1.it)('grundy(0) = 0 (terminal)', () => {
35
+ (0, vitest_1.expect)((0, combinatorial_games_1.grundyValue)((0, combinatorial_games_1.nim1d)(0), 0)).toBe(0);
36
+ });
37
+ (0, vitest_1.it)('grundy(n) = n para n ∈ [0..7]', () => {
38
+ for (let n = 0; n <= 7; n += 1) {
39
+ (0, vitest_1.expect)((0, combinatorial_games_1.grundyValue)((0, combinatorial_games_1.nim1d)(n), n)).toBe(n);
40
+ }
41
+ });
42
+ (0, vitest_1.it)('isWinning para n>0', () => {
43
+ (0, vitest_1.expect)((0, combinatorial_games_1.isWinning)((0, combinatorial_games_1.nim1d)(5), 5)).toBe(true);
44
+ });
45
+ });
46
+ (0, vitest_1.describe)('combinatorial-games — Nim multi-pila', () => {
47
+ (0, vitest_1.it)('Nim(3,4,5) grundy = 2 (winning position)', () => {
48
+ const g = (0, combinatorial_games_1.nim)([3, 4, 5]);
49
+ (0, vitest_1.expect)((0, combinatorial_games_1.grundyValue)(g, g.initial)).toBe(2);
50
+ (0, vitest_1.expect)((0, combinatorial_games_1.isWinning)(g, g.initial)).toBe(true);
51
+ });
52
+ (0, vitest_1.it)('Nim(3,3) grundy = 0 (losing for player to move)', () => {
53
+ const g = (0, combinatorial_games_1.nim)([3, 3]);
54
+ (0, vitest_1.expect)((0, combinatorial_games_1.grundyValue)(g, g.initial)).toBe(0);
55
+ (0, vitest_1.expect)((0, combinatorial_games_1.isWinning)(g, g.initial)).toBe(false);
56
+ });
57
+ (0, vitest_1.it)('Nim(1,2,3) grundy = 0', () => {
58
+ const g = (0, combinatorial_games_1.nim)([1, 2, 3]);
59
+ (0, vitest_1.expect)((0, combinatorial_games_1.grundyValue)(g, g.initial)).toBe(0);
60
+ });
61
+ (0, vitest_1.it)('Nim() vacío es terminal (grundy 0)', () => {
62
+ const g = (0, combinatorial_games_1.nim)([]);
63
+ (0, vitest_1.expect)((0, combinatorial_games_1.grundyValue)(g, g.initial)).toBe(0);
64
+ (0, vitest_1.expect)((0, combinatorial_games_1.isWinning)(g, g.initial)).toBe(false);
65
+ });
66
+ });
67
+ (0, vitest_1.describe)('combinatorial-games — Chomp', () => {
68
+ (0, vitest_1.it)('Chomp 1x1 grundy = 0 (poison cell, losing)', () => {
69
+ const g = (0, combinatorial_games_1.chompGame)(1, 1);
70
+ (0, vitest_1.expect)((0, combinatorial_games_1.grundyValue)(g, g.initial)).toBe(0);
71
+ (0, vitest_1.expect)((0, combinatorial_games_1.isWinning)(g, g.initial)).toBe(false);
72
+ });
73
+ (0, vitest_1.it)('Chomp 2x2 es ganador para el primer jugador (grundy ≠ 0)', () => {
74
+ const g = (0, combinatorial_games_1.chompGame)(2, 2);
75
+ (0, vitest_1.expect)((0, combinatorial_games_1.isWinning)(g, g.initial)).toBe(true);
76
+ });
77
+ (0, vitest_1.it)('Chomp 3x2 es ganador para el primer jugador', () => {
78
+ const g = (0, combinatorial_games_1.chompGame)(3, 2);
79
+ (0, vitest_1.expect)((0, combinatorial_games_1.isWinning)(g, g.initial)).toBe(true);
80
+ });
81
+ });
82
+ (0, vitest_1.describe)('combinatorial-games — multiGameGrundy (suma disjunta)', () => {
83
+ (0, vitest_1.it)('XOR de Grundys = grundy del compuesto', () => {
84
+ const g1 = (0, combinatorial_games_1.nim1d)(3);
85
+ const g2 = (0, combinatorial_games_1.nim1d)(4);
86
+ const g3 = (0, combinatorial_games_1.nim1d)(5);
87
+ // Cada uno tiene grundy igual a su valor → XOR = 3⊕4⊕5 = 2.
88
+ (0, vitest_1.expect)((0, combinatorial_games_1.multiGameGrundy)([g1, g2, g3], [3, 4, 5])).toBe(2);
89
+ });
90
+ (0, vitest_1.it)('Suma de dos Nim(2) iguales = 0', () => {
91
+ const g = (0, combinatorial_games_1.nim1d)(2);
92
+ (0, vitest_1.expect)((0, combinatorial_games_1.multiGameGrundy)([g, g], [2, 2])).toBe(0);
93
+ });
94
+ (0, vitest_1.it)('multiGameGrundy con longitudes desiguales lanza', () => {
95
+ (0, vitest_1.expect)(() => (0, combinatorial_games_1.multiGameGrundy)([(0, combinatorial_games_1.nim1d)(1)], [1, 2])).toThrow();
96
+ });
97
+ });
98
+ (0, vitest_1.describe)('combinatorial-games — Surreal numbers básicos', () => {
99
+ (0, vitest_1.it)('ZERO es { | }', () => {
100
+ (0, vitest_1.expect)(combinatorial_games_1.ZERO.left).toEqual([]);
101
+ (0, vitest_1.expect)(combinatorial_games_1.ZERO.right).toEqual([]);
102
+ });
103
+ (0, vitest_1.it)('ONE es { 0 | } y compara igual a fromInt(1)', () => {
104
+ (0, vitest_1.expect)(combinatorial_games_1.ONE.left).toHaveLength(1);
105
+ (0, vitest_1.expect)(combinatorial_games_1.ONE.right).toHaveLength(0);
106
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)(combinatorial_games_1.ONE, (0, combinatorial_games_1.fromInt)(1))).toBe(0);
107
+ });
108
+ (0, vitest_1.it)('fromInt(0) = ZERO', () => {
109
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)((0, combinatorial_games_1.fromInt)(0), combinatorial_games_1.ZERO)).toBe(0);
110
+ });
111
+ (0, vitest_1.it)('fromInt(3) > fromInt(2) > fromInt(1) > 0', () => {
112
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)((0, combinatorial_games_1.fromInt)(3), (0, combinatorial_games_1.fromInt)(2))).toBe(1);
113
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)((0, combinatorial_games_1.fromInt)(2), (0, combinatorial_games_1.fromInt)(1))).toBe(1);
114
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)((0, combinatorial_games_1.fromInt)(1), combinatorial_games_1.ZERO)).toBe(1);
115
+ });
116
+ (0, vitest_1.it)('compare(ONE, ZERO) = 1', () => {
117
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)(combinatorial_games_1.ONE, combinatorial_games_1.ZERO)).toBe(1);
118
+ });
119
+ });
120
+ (0, vitest_1.describe)('combinatorial-games — Surreal: negate / add', () => {
121
+ (0, vitest_1.it)('negate(ONE) ≡ -1', () => {
122
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)((0, combinatorial_games_1.negate)(combinatorial_games_1.ONE), combinatorial_games_1.MINUS_ONE)).toBe(0);
123
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)((0, combinatorial_games_1.negate)(combinatorial_games_1.ONE), (0, combinatorial_games_1.fromInt)(-1))).toBe(0);
124
+ });
125
+ (0, vitest_1.it)('negate(negate(x)) ≡ x', () => {
126
+ const two = (0, combinatorial_games_1.fromInt)(2);
127
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)((0, combinatorial_games_1.negate)((0, combinatorial_games_1.negate)(two)), two)).toBe(0);
128
+ });
129
+ (0, vitest_1.it)('add(ONE, ONE) ≡ fromInt(2)', () => {
130
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)((0, combinatorial_games_1.add)(combinatorial_games_1.ONE, combinatorial_games_1.ONE), (0, combinatorial_games_1.fromInt)(2))).toBe(0);
131
+ });
132
+ (0, vitest_1.it)('add(ZERO, x) ≡ x (identidad)', () => {
133
+ const three = (0, combinatorial_games_1.fromInt)(3);
134
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)((0, combinatorial_games_1.add)(combinatorial_games_1.ZERO, three), three)).toBe(0);
135
+ });
136
+ (0, vitest_1.it)('add(x, negate(x)) ≡ 0', () => {
137
+ const two = (0, combinatorial_games_1.fromInt)(2);
138
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)((0, combinatorial_games_1.add)(two, (0, combinatorial_games_1.negate)(two)), combinatorial_games_1.ZERO)).toBe(0);
139
+ });
140
+ (0, vitest_1.it)('add(fromInt(2), fromInt(3)) ≡ fromInt(5)', () => {
141
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)((0, combinatorial_games_1.add)((0, combinatorial_games_1.fromInt)(2), (0, combinatorial_games_1.fromInt)(3)), (0, combinatorial_games_1.fromInt)(5))).toBe(0);
142
+ });
143
+ });
144
+ (0, vitest_1.describe)('combinatorial-games — Surreal: STAR y fuzzy', () => {
145
+ (0, vitest_1.it)('STAR es fuzzy con 0', () => {
146
+ (0, vitest_1.expect)((0, combinatorial_games_1.isFuzzy)(combinatorial_games_1.STAR)).toBe(true);
147
+ });
148
+ (0, vitest_1.it)('ZERO no es fuzzy consigo mismo', () => {
149
+ (0, vitest_1.expect)((0, combinatorial_games_1.isFuzzy)(combinatorial_games_1.ZERO)).toBe(false);
150
+ });
151
+ (0, vitest_1.it)('ONE no es fuzzy con 0', () => {
152
+ (0, vitest_1.expect)((0, combinatorial_games_1.isFuzzy)(combinatorial_games_1.ONE)).toBe(false);
153
+ });
154
+ (0, vitest_1.it)('compare(STAR, ZERO) lanza (incomparables)', () => {
155
+ (0, vitest_1.expect)(() => (0, combinatorial_games_1.compare)(combinatorial_games_1.STAR, combinatorial_games_1.ZERO)).toThrow();
156
+ });
157
+ (0, vitest_1.it)('STAR + STAR ≡ 0 (auto-inverso bajo suma)', () => {
158
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)((0, combinatorial_games_1.add)(combinatorial_games_1.STAR, combinatorial_games_1.STAR), combinatorial_games_1.ZERO)).toBe(0);
159
+ });
160
+ });
161
+ (0, vitest_1.describe)('combinatorial-games — simplify (dominancia)', () => {
162
+ (0, vitest_1.it)('simplify elimina opciones Left dominadas', () => {
163
+ // { 0, 1 | } debería reducir a { 1 | } ≡ 2 ya que 1 ≥ 0.
164
+ const raw = { left: [combinatorial_games_1.ZERO, combinatorial_games_1.ONE], right: [] };
165
+ const s = (0, combinatorial_games_1.simplify)(raw);
166
+ (0, vitest_1.expect)(s.left).toHaveLength(1);
167
+ // El sobreviviente Left debe ser ONE (la mejor opción).
168
+ (0, vitest_1.expect)((0, combinatorial_games_1.compare)(s.left[0], combinatorial_games_1.ONE)).toBe(0);
169
+ });
170
+ (0, vitest_1.it)('simplify deja STAR intacto (opciones no dominables entre sí)', () => {
171
+ const s = (0, combinatorial_games_1.simplify)(combinatorial_games_1.STAR);
172
+ (0, vitest_1.expect)(s.left).toHaveLength(1);
173
+ (0, vitest_1.expect)(s.right).toHaveLength(1);
174
+ });
175
+ (0, vitest_1.it)('simplify es idempotente para ZERO', () => {
176
+ const s = (0, combinatorial_games_1.simplify)(combinatorial_games_1.ZERO);
177
+ (0, vitest_1.expect)(s.left).toEqual([]);
178
+ (0, vitest_1.expect)(s.right).toEqual([]);
179
+ });
180
+ });
181
+ (0, vitest_1.describe)('combinatorial-games — propiedades estructurales', () => {
182
+ (0, vitest_1.it)('grundyValue usa caché entre invocaciones', () => {
183
+ const cache = new Map();
184
+ const g = (0, combinatorial_games_1.nim)([2, 2]);
185
+ const v1 = (0, combinatorial_games_1.grundyValue)(g, g.initial, cache);
186
+ const size = cache.size;
187
+ const v2 = (0, combinatorial_games_1.grundyValue)(g, g.initial, cache);
188
+ (0, vitest_1.expect)(v1).toBe(v2);
189
+ // Tras la segunda llamada, el caché no crece (hit en raíz).
190
+ (0, vitest_1.expect)(cache.size).toBe(size);
191
+ });
192
+ (0, vitest_1.it)('nim rechaza pilas negativas', () => {
193
+ (0, vitest_1.expect)(() => (0, combinatorial_games_1.nim)([1, -1])).toThrow();
194
+ });
195
+ (0, vitest_1.it)('nim1d rechaza negativos', () => {
196
+ (0, vitest_1.expect)(() => (0, combinatorial_games_1.nim1d)(-1)).toThrow();
197
+ });
198
+ (0, vitest_1.it)('chompGame rechaza dims < 1', () => {
199
+ (0, vitest_1.expect)(() => (0, combinatorial_games_1.chompGame)(0, 1)).toThrow();
200
+ (0, vitest_1.expect)(() => (0, combinatorial_games_1.chompGame)(1, 0)).toThrow();
201
+ });
202
+ });
203
+ //# sourceMappingURL=combinatorial-games.test.js.map