@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.
- package/dist/namespaces/reasoning.d.ts +2 -1
- package/dist/namespaces/reasoning.d.ts.map +1 -1
- package/dist/namespaces/reasoning.js +3 -1
- package/dist/namespaces/reasoning.js.map +1 -1
- package/dist/reasoning/combinatorial-games/index.d.ts +105 -0
- package/dist/reasoning/combinatorial-games/index.d.ts.map +1 -0
- package/dist/reasoning/combinatorial-games/index.js +377 -0
- package/dist/reasoning/combinatorial-games/index.js.map +1 -0
- package/dist/reasoning/mechanism-design/auctions.d.ts +49 -0
- package/dist/reasoning/mechanism-design/auctions.d.ts.map +1 -0
- package/dist/reasoning/mechanism-design/auctions.js +179 -0
- package/dist/reasoning/mechanism-design/auctions.js.map +1 -0
- package/dist/reasoning/mechanism-design/index.d.ts +5 -0
- package/dist/reasoning/mechanism-design/index.d.ts.map +1 -0
- package/dist/reasoning/mechanism-design/index.js +39 -0
- package/dist/reasoning/mechanism-design/index.js.map +1 -0
- package/dist/reasoning/mechanism-design/myerson.d.ts +64 -0
- package/dist/reasoning/mechanism-design/myerson.d.ts.map +1 -0
- package/dist/reasoning/mechanism-design/myerson.js +253 -0
- package/dist/reasoning/mechanism-design/myerson.js.map +1 -0
- package/dist/reasoning/mechanism-design/types.d.ts +44 -0
- package/dist/reasoning/mechanism-design/types.d.ts.map +1 -0
- package/dist/reasoning/mechanism-design/types.js +22 -0
- package/dist/reasoning/mechanism-design/types.js.map +1 -0
- package/dist/reasoning/mechanism-design/vcg.d.ts +29 -0
- package/dist/reasoning/mechanism-design/vcg.d.ts.map +1 -0
- package/dist/reasoning/mechanism-design/vcg.js +305 -0
- package/dist/reasoning/mechanism-design/vcg.js.map +1 -0
- package/dist/reasoning/probabilistic/distributions.d.ts +44 -0
- package/dist/reasoning/probabilistic/distributions.d.ts.map +1 -0
- package/dist/reasoning/probabilistic/distributions.js +207 -0
- package/dist/reasoning/probabilistic/distributions.js.map +1 -0
- package/dist/reasoning/probabilistic/examples.d.ts +31 -0
- package/dist/reasoning/probabilistic/examples.d.ts.map +1 -0
- package/dist/reasoning/probabilistic/examples.js +85 -0
- package/dist/reasoning/probabilistic/examples.js.map +1 -0
- package/dist/reasoning/probabilistic/index.d.ts +6 -0
- package/dist/reasoning/probabilistic/index.d.ts.map +1 -0
- package/dist/reasoning/probabilistic/index.js +42 -0
- package/dist/reasoning/probabilistic/index.js.map +1 -0
- package/dist/reasoning/probabilistic/inference.d.ts +45 -0
- package/dist/reasoning/probabilistic/inference.d.ts.map +1 -0
- package/dist/reasoning/probabilistic/inference.js +579 -0
- package/dist/reasoning/probabilistic/inference.js.map +1 -0
- package/dist/reasoning/probabilistic/types.d.ts +153 -0
- package/dist/reasoning/probabilistic/types.d.ts.map +1 -0
- package/dist/reasoning/probabilistic/types.js +37 -0
- package/dist/reasoning/probabilistic/types.js.map +1 -0
- package/dist/solver/smt-z3/index.d.ts +3 -0
- package/dist/solver/smt-z3/index.d.ts.map +1 -0
- package/dist/solver/smt-z3/index.js +11 -0
- package/dist/solver/smt-z3/index.js.map +1 -0
- package/dist/solver/smt-z3/types.d.ts +52 -0
- package/dist/solver/smt-z3/types.d.ts.map +1 -0
- package/dist/solver/smt-z3/types.js +6 -0
- package/dist/solver/smt-z3/types.js.map +1 -0
- package/dist/solver/smt-z3/z3-wasm-backend.d.ts +88 -0
- package/dist/solver/smt-z3/z3-wasm-backend.d.ts.map +1 -0
- package/dist/solver/smt-z3/z3-wasm-backend.js +437 -0
- package/dist/solver/smt-z3/z3-wasm-backend.js.map +1 -0
- package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.d.ts +2 -0
- package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.d.ts.map +1 -0
- package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.js +203 -0
- package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.js.map +1 -0
- package/dist/tests/reasoning/mechanism-design/mechanism-design.test.d.ts +2 -0
- package/dist/tests/reasoning/mechanism-design/mechanism-design.test.d.ts.map +1 -0
- package/dist/tests/reasoning/mechanism-design/mechanism-design.test.js +290 -0
- package/dist/tests/reasoning/mechanism-design/mechanism-design.test.js.map +1 -0
- package/dist/tests/reasoning/probabilistic/probabilistic.test.d.ts +2 -0
- package/dist/tests/reasoning/probabilistic/probabilistic.test.d.ts.map +1 -0
- package/dist/tests/reasoning/probabilistic/probabilistic.test.js +370 -0
- package/dist/tests/reasoning/probabilistic/probabilistic.test.js.map +1 -0
- package/dist/tests/solver/smt-z3/z3-wasm-backend.test.d.ts +2 -0
- package/dist/tests/solver/smt-z3/z3-wasm-backend.test.d.ts.map +1 -0
- package/dist/tests/solver/smt-z3/z3-wasm-backend.test.js +394 -0
- package/dist/tests/solver/smt-z3/z3-wasm-backend.test.js.map +1 -0
- package/dist/tests/tooling/proof-guidance/features.test.d.ts +2 -0
- package/dist/tests/tooling/proof-guidance/features.test.d.ts.map +1 -0
- package/dist/tests/tooling/proof-guidance/features.test.js +72 -0
- package/dist/tests/tooling/proof-guidance/features.test.js.map +1 -0
- package/dist/tests/tooling/proof-guidance/model.test.d.ts +2 -0
- package/dist/tests/tooling/proof-guidance/model.test.d.ts.map +1 -0
- package/dist/tests/tooling/proof-guidance/model.test.js +165 -0
- package/dist/tests/tooling/proof-guidance/model.test.js.map +1 -0
- package/dist/tests/tooling/proof-guidance/search.test.d.ts +2 -0
- package/dist/tests/tooling/proof-guidance/search.test.d.ts.map +1 -0
- package/dist/tests/tooling/proof-guidance/search.test.js +238 -0
- package/dist/tests/tooling/proof-guidance/search.test.js.map +1 -0
- package/dist/tests/type-theory/cubical/cubical.test.d.ts +2 -0
- package/dist/tests/type-theory/cubical/cubical.test.d.ts.map +1 -0
- package/dist/tests/type-theory/cubical/cubical.test.js +207 -0
- package/dist/tests/type-theory/cubical/cubical.test.js.map +1 -0
- package/dist/tooling/proof-guidance/features.d.ts +10 -0
- package/dist/tooling/proof-guidance/features.d.ts.map +1 -0
- package/dist/tooling/proof-guidance/features.js +97 -0
- package/dist/tooling/proof-guidance/features.js.map +1 -0
- package/dist/tooling/proof-guidance/index.d.ts +5 -0
- package/dist/tooling/proof-guidance/index.d.ts.map +1 -0
- package/dist/tooling/proof-guidance/index.js +25 -0
- package/dist/tooling/proof-guidance/index.js.map +1 -0
- package/dist/tooling/proof-guidance/model.d.ts +42 -0
- package/dist/tooling/proof-guidance/model.d.ts.map +1 -0
- package/dist/tooling/proof-guidance/model.js +149 -0
- package/dist/tooling/proof-guidance/model.js.map +1 -0
- package/dist/tooling/proof-guidance/search.d.ts +7 -0
- package/dist/tooling/proof-guidance/search.d.ts.map +1 -0
- package/dist/tooling/proof-guidance/search.js +102 -0
- package/dist/tooling/proof-guidance/search.js.map +1 -0
- package/dist/tooling/proof-guidance/types.d.ts +77 -0
- package/dist/tooling/proof-guidance/types.d.ts.map +1 -0
- package/dist/tooling/proof-guidance/types.js +8 -0
- package/dist/tooling/proof-guidance/types.js.map +1 -0
- package/dist/type-theory/cubical/equality.d.ts +4 -0
- package/dist/type-theory/cubical/equality.d.ts.map +1 -0
- package/dist/type-theory/cubical/equality.js +78 -0
- package/dist/type-theory/cubical/equality.js.map +1 -0
- package/dist/type-theory/cubical/index.d.ts +14 -0
- package/dist/type-theory/cubical/index.d.ts.map +1 -0
- package/dist/type-theory/cubical/index.js +71 -0
- package/dist/type-theory/cubical/index.js.map +1 -0
- package/dist/type-theory/cubical/infer.d.ts +18 -0
- package/dist/type-theory/cubical/infer.d.ts.map +1 -0
- package/dist/type-theory/cubical/infer.js +241 -0
- package/dist/type-theory/cubical/infer.js.map +1 -0
- package/dist/type-theory/cubical/interval.d.ts +12 -0
- package/dist/type-theory/cubical/interval.d.ts.map +1 -0
- package/dist/type-theory/cubical/interval.js +118 -0
- package/dist/type-theory/cubical/interval.js.map +1 -0
- package/dist/type-theory/cubical/normalize.d.ts +5 -0
- package/dist/type-theory/cubical/normalize.d.ts.map +1 -0
- package/dist/type-theory/cubical/normalize.js +191 -0
- package/dist/type-theory/cubical/normalize.js.map +1 -0
- package/dist/type-theory/cubical/path-algebra.d.ts +12 -0
- package/dist/type-theory/cubical/path-algebra.d.ts.map +1 -0
- package/dist/type-theory/cubical/path-algebra.js +109 -0
- package/dist/type-theory/cubical/path-algebra.js.map +1 -0
- package/dist/type-theory/cubical/substitute.d.ts +3 -0
- package/dist/type-theory/cubical/substitute.d.ts.map +1 -0
- package/dist/type-theory/cubical/substitute.js +109 -0
- package/dist/type-theory/cubical/substitute.js.map +1 -0
- package/dist/type-theory/cubical/types.d.ts +77 -0
- package/dist/type-theory/cubical/types.d.ts.map +1 -0
- package/dist/type-theory/cubical/types.js +258 -0
- package/dist/type-theory/cubical/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -16,11 +16,12 @@ import * as beliefRevision from '../reasoning/belief-revision';
|
|
|
16
16
|
import * as abduction from '../reasoning/abduction';
|
|
17
17
|
import * as markovLogic from '../reasoning/markov-logic';
|
|
18
18
|
import * as bayesian from '../reasoning/bayesian';
|
|
19
|
+
import * as probabilistic from '../reasoning/probabilistic';
|
|
19
20
|
import * as citationReasoning from '../reasoning/citation-reasoning';
|
|
20
21
|
import * as hyperreal from '../reasoning/hyperreal';
|
|
21
22
|
import * as antiUnification from '../runtime/anti-unification';
|
|
22
23
|
import * as termRewriting from '../runtime/term-rewriting';
|
|
23
|
-
export { argumentation, beliefRevision, abduction, markovLogic, bayesian, citationReasoning, hyperreal, antiUnification, termRewriting, };
|
|
24
|
+
export { argumentation, beliefRevision, abduction, markovLogic, bayesian, probabilistic, citationReasoning, hyperreal, antiUnification, termRewriting, };
|
|
24
25
|
export { TheoremCache, tryReuseProof } from '../runtime/theorem-cache';
|
|
25
26
|
export type { CachedTheorem, CacheOptions as TheoremCacheOptions, CacheStats as TheoremCacheStats, ReuseResult as TheoremReuseResult, } from '../runtime/theorem-cache';
|
|
26
27
|
//# sourceMappingURL=reasoning.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reasoning.d.ts","sourceRoot":"","sources":["../../src/namespaces/reasoning.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,cAAc,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,WAAW,MAAM,2BAA2B,CAAC;AACzD,OAAO,KAAK,QAAQ,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,iBAAiB,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,eAAe,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,aAAa,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EACL,aAAa,EACb,cAAc,EACd,SAAS,EACT,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,aAAa,GACd,CAAC;AAGF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACvE,YAAY,EACV,aAAa,EACb,YAAY,IAAI,mBAAmB,EACnC,UAAU,IAAI,iBAAiB,EAC/B,WAAW,IAAI,kBAAkB,GAClC,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"reasoning.d.ts","sourceRoot":"","sources":["../../src/namespaces/reasoning.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,cAAc,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,WAAW,MAAM,2BAA2B,CAAC;AACzD,OAAO,KAAK,QAAQ,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,aAAa,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,iBAAiB,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,eAAe,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,aAAa,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EACL,aAAa,EACb,cAAc,EACd,SAAS,EACT,WAAW,EACX,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,aAAa,GACd,CAAC;AAGF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACvE,YAAY,EACV,aAAa,EACb,YAAY,IAAI,mBAAmB,EACnC,UAAU,IAAI,iBAAiB,EAC/B,WAAW,IAAI,kBAAkB,GAClC,MAAM,0BAA0B,CAAC"}
|
|
@@ -46,7 +46,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
46
46
|
};
|
|
47
47
|
})();
|
|
48
48
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
-
exports.tryReuseProof = exports.TheoremCache = exports.termRewriting = exports.antiUnification = exports.hyperreal = exports.citationReasoning = exports.bayesian = exports.markovLogic = exports.abduction = exports.beliefRevision = exports.argumentation = void 0;
|
|
49
|
+
exports.tryReuseProof = exports.TheoremCache = exports.termRewriting = exports.antiUnification = exports.hyperreal = exports.citationReasoning = exports.probabilistic = exports.bayesian = exports.markovLogic = exports.abduction = exports.beliefRevision = exports.argumentation = void 0;
|
|
50
50
|
const argumentation = __importStar(require("../reasoning/argumentation"));
|
|
51
51
|
exports.argumentation = argumentation;
|
|
52
52
|
const beliefRevision = __importStar(require("../reasoning/belief-revision"));
|
|
@@ -57,6 +57,8 @@ const markovLogic = __importStar(require("../reasoning/markov-logic"));
|
|
|
57
57
|
exports.markovLogic = markovLogic;
|
|
58
58
|
const bayesian = __importStar(require("../reasoning/bayesian"));
|
|
59
59
|
exports.bayesian = bayesian;
|
|
60
|
+
const probabilistic = __importStar(require("../reasoning/probabilistic"));
|
|
61
|
+
exports.probabilistic = probabilistic;
|
|
60
62
|
const citationReasoning = __importStar(require("../reasoning/citation-reasoning"));
|
|
61
63
|
exports.citationReasoning = citationReasoning;
|
|
62
64
|
const hyperreal = __importStar(require("../reasoning/hyperreal"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reasoning.js","sourceRoot":"","sources":["../../src/namespaces/reasoning.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,0EAA4D;
|
|
1
|
+
{"version":3,"file":"reasoning.js","sourceRoot":"","sources":["../../src/namespaces/reasoning.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,0EAA4D;AAY1D,sCAAa;AAXf,6EAA+D;AAY7D,wCAAc;AAXhB,kEAAoD;AAYlD,8BAAS;AAXX,uEAAyD;AAYvD,kCAAW;AAXb,gEAAkD;AAYhD,4BAAQ;AAXV,0EAA4D;AAY1D,sCAAa;AAXf,mFAAqE;AAYnE,8CAAiB;AAXnB,kEAAoD;AAYlD,8BAAS;AAXX,6EAA+D;AAY7D,0CAAe;AAXjB,yEAA2D;AAYzD,sCAAa;AAGf,+EAA+E;AAC/E,0DAAuE;AAA9D,6GAAA,YAAY,OAAA;AAAE,8GAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
export interface ImpartialGame<S> {
|
|
2
|
+
readonly initial: S;
|
|
3
|
+
readonly moves: (state: S) => S[];
|
|
4
|
+
readonly isTerminal: (state: S) => boolean;
|
|
5
|
+
readonly key?: (state: S) => string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Minimum Excludant: menor entero ≥ 0 que no está en el conjunto.
|
|
9
|
+
* mex(∅) = 0, mex({0,1,3}) = 2, mex({1,2}) = 0.
|
|
10
|
+
*/
|
|
11
|
+
export declare function mex(set: Set<number>): number;
|
|
12
|
+
/**
|
|
13
|
+
* Valor de Grundy del estado dado bajo el juego imparcial.
|
|
14
|
+
* Define: G(terminal) = 0; G(s) = mex { G(s') : s' ∈ moves(s) }.
|
|
15
|
+
* Usa caché (compartido entre llamadas) keyed por la clave canónica del estado.
|
|
16
|
+
*/
|
|
17
|
+
export declare function grundyValue<S>(game: ImpartialGame<S>, state: S, cache?: Map<string, number>): number;
|
|
18
|
+
/**
|
|
19
|
+
* El jugador a mover gana sii grundy ≠ 0 (juego imparcial con convención
|
|
20
|
+
* normal: el que no puede mover, pierde).
|
|
21
|
+
*/
|
|
22
|
+
export declare function isWinning<S>(game: ImpartialGame<S>, state: S): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Nim-sum: XOR bit a bit de los valores. Identidad del monoide de Grundy
|
|
25
|
+
* bajo suma disjunta de juegos imparciales.
|
|
26
|
+
*/
|
|
27
|
+
export declare function nimSum(values: number[]): number;
|
|
28
|
+
/**
|
|
29
|
+
* Grundy de la suma disjunta de juegos imparciales independientes:
|
|
30
|
+
* G(G1 + G2 + ... + Gn)(s1,...,sn) = G1(s1) ⊕ G2(s2) ⊕ ... ⊕ Gn(sn).
|
|
31
|
+
* Requiere games.length === states.length.
|
|
32
|
+
*/
|
|
33
|
+
export declare function multiGameGrundy<S>(games: Array<ImpartialGame<S>>, states: S[]): number;
|
|
34
|
+
/**
|
|
35
|
+
* Nim clásico: varios montones de piedras, un movimiento = sacar ≥1
|
|
36
|
+
* piedras de un único montón. Pierde quien no puede mover (todos los
|
|
37
|
+
* montones a 0). Estado: vector de tamaños (normalizado, sin ceros y
|
|
38
|
+
* ordenado descendente para que el caché sea efectivo entre simetrías).
|
|
39
|
+
*/
|
|
40
|
+
export declare function nim(piles: number[]): ImpartialGame<number[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Nim 1D: una sola pila de `stones` piedras; sacar 1..stones. Equivale
|
|
43
|
+
* a `nim([stones])` pero con estado más compacto (un número).
|
|
44
|
+
*/
|
|
45
|
+
export declare function nim1d(stones: number): ImpartialGame<number>;
|
|
46
|
+
/**
|
|
47
|
+
* Chomp: tablero rows×cols de "chocolate". Cada movida elige una casilla
|
|
48
|
+
* viva (true) y "muerde" todo el rectángulo abajo-derecha desde ella. La
|
|
49
|
+
* casilla (0,0) es veneno: quien la come pierde (convención misère
|
|
50
|
+
* implementada como: estado terminal cuando solo queda (0,0)).
|
|
51
|
+
*
|
|
52
|
+
* Estado: matriz booleana rows×cols con true = casilla viva.
|
|
53
|
+
*
|
|
54
|
+
* Nota: Chomp tiene posición ganadora conocida para el primer jugador
|
|
55
|
+
* en todo tablero ≥ 2×2 (argumento de robo de estrategia), pero la
|
|
56
|
+
* estrategia explícita es desconocida en general. Para 1×1 (sólo el
|
|
57
|
+
* veneno) el jugador a mover pierde, así que grundy = 0.
|
|
58
|
+
*/
|
|
59
|
+
export declare function chompGame(rows: number, cols: number): ImpartialGame<boolean[][]>;
|
|
60
|
+
export interface SurrealNumber {
|
|
61
|
+
readonly left: SurrealNumber[];
|
|
62
|
+
readonly right: SurrealNumber[];
|
|
63
|
+
}
|
|
64
|
+
/** 0 = { | } — sin opciones para ninguno; "second player wins". */
|
|
65
|
+
export declare const ZERO: SurrealNumber;
|
|
66
|
+
/** 1 = { 0 | }. */
|
|
67
|
+
export declare const ONE: SurrealNumber;
|
|
68
|
+
/** -1 = { | 0 }. */
|
|
69
|
+
export declare const MINUS_ONE: SurrealNumber;
|
|
70
|
+
/** * (star) = { 0 | 0 } — primer jugador gana, no comparable a 0 (fuzzy). */
|
|
71
|
+
export declare const STAR: SurrealNumber;
|
|
72
|
+
/**
|
|
73
|
+
* Construye el surreal correspondiente al entero `n`.
|
|
74
|
+
* 0 = { | }
|
|
75
|
+
* n = { n-1 | } (n > 0)
|
|
76
|
+
* -n = { | -(n-1) } (n < 0)
|
|
77
|
+
*/
|
|
78
|
+
export declare function fromInt(n: number): SurrealNumber;
|
|
79
|
+
/**
|
|
80
|
+
* Negación: -G = { -GR | -GL }.
|
|
81
|
+
*/
|
|
82
|
+
export declare function negate(s: SurrealNumber): SurrealNumber;
|
|
83
|
+
/**
|
|
84
|
+
* Suma de juegos: G + H = { GL+H, G+HL | GR+H, G+HR }.
|
|
85
|
+
*/
|
|
86
|
+
export declare function add(a: SurrealNumber, b: SurrealNumber): SurrealNumber;
|
|
87
|
+
export declare function compare(a: SurrealNumber, b: SurrealNumber): -1 | 0 | 1;
|
|
88
|
+
/**
|
|
89
|
+
* G es fuzzy con 0 sii no satisface G ≤ 0 ni 0 ≤ G — es decir, el
|
|
90
|
+
* primer jugador gana. * es el ejemplo canónico.
|
|
91
|
+
*/
|
|
92
|
+
export declare function isFuzzy(s: SurrealNumber): boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Simplificación parcial: elimina opciones dominadas en cada lado.
|
|
95
|
+
*
|
|
96
|
+
* En la lista Left, una opción L1 domina a L2 si L1 ≥ L2 (entonces
|
|
97
|
+
* L2 puede borrarse: el jugador Left preferirá L1).
|
|
98
|
+
* En la lista Right, una opción R1 domina a R2 si R1 ≤ R2.
|
|
99
|
+
*
|
|
100
|
+
* No hace eliminación reversible ("bypass") — eso podría requerirse
|
|
101
|
+
* para canonicalización completa Conway. Para nuestros tests es
|
|
102
|
+
* suficiente.
|
|
103
|
+
*/
|
|
104
|
+
export declare function simplify(s: SurrealNumber): SurrealNumber;
|
|
105
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/reasoning/combinatorial-games/index.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC;IAE3C,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;CACrC;AAMD;;;GAGG;AACH,wBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAI5C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EACtB,KAAK,EAAE,CAAC,EACR,KAAK,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAA6B,GACrD,MAAM,CAgBR;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAEtE;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAI/C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,CAYtF;AAID;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,CAuB5D;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAc3D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAsDhF;AAID,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC;CACjC;AAMD,mEAAmE;AACnE,eAAO,MAAM,IAAI,EAAE,aAAmC,CAAC;AAEvD,mBAAmB;AACnB,eAAO,MAAM,GAAG,EAAE,aAAuC,CAAC;AAE1D,oBAAoB;AACpB,eAAO,MAAM,SAAS,EAAE,aAAuC,CAAC;AAEhE,6EAA6E;AAC7E,eAAO,MAAM,IAAI,EAAE,aAA2C,CAAC;AAE/D;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa,CAKhD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,aAAa,GAAG,aAAa,CAKtD;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,aAAa,CAQrE;AAwBD,wBAAgB,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAOtE;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAEjD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,aAAa,GAAG,aAAa,CAqCxD"}
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ST Combinatorial Games — Sprague-Grundy + Surreal numbers
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Dos puntas complementarias del análisis de juegos combinatorios:
|
|
6
|
+
//
|
|
7
|
+
// 1. Juegos imparciales (mismas movidas para ambos jugadores) →
|
|
8
|
+
// Sprague-Grundy theorem: cada estado tiene un único valor
|
|
9
|
+
// grundy ∈ ℕ. Una posición es perdedora para el jugador a mover
|
|
10
|
+
// sii grundy = 0. Para juegos compuestos (suma disjunta), el
|
|
11
|
+
// valor se obtiene como XOR (nim-sum) de los componentes.
|
|
12
|
+
//
|
|
13
|
+
// 2. Juegos partisanos (movidas asimétricas Left/Right) → números
|
|
14
|
+
// surreales de Conway. Cada juego es un par { L | R } donde L y R
|
|
15
|
+
// son conjuntos de juegos (sus opciones). De aquí emergen los
|
|
16
|
+
// enteros, fracciones diádicas, ω, ε, *, ↑, etc.
|
|
17
|
+
//
|
|
18
|
+
// Convenciones:
|
|
19
|
+
// • Los juegos imparciales se modelan como una interfaz genérica
|
|
20
|
+
// `ImpartialGame<S>` con función de movidas y predicado terminal.
|
|
21
|
+
// • Los estados deben ser serializables a string (clave del caché);
|
|
22
|
+
// se exige una función `key` opcional; default = JSON.stringify.
|
|
23
|
+
// • Los surreales son recursivos. Sólo soportamos comparación y
|
|
24
|
+
// aritmética básica (add, negate, compare). Suficiente para
|
|
25
|
+
// verificar identidades como 1 + 1 = 2, *‖0, etc.
|
|
26
|
+
// • La simplificación de surreales aquí elimina opciones dominadas
|
|
27
|
+
// (Left domina a otra Left si es ≥; Right domina si es ≤). No
|
|
28
|
+
// hacemos "número simplicity" completo — sí suficiente para que
|
|
29
|
+
// los tests de identidad pasen sin explosión de tamaño.
|
|
30
|
+
// ============================================================
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.STAR = exports.MINUS_ONE = exports.ONE = exports.ZERO = void 0;
|
|
33
|
+
exports.mex = mex;
|
|
34
|
+
exports.grundyValue = grundyValue;
|
|
35
|
+
exports.isWinning = isWinning;
|
|
36
|
+
exports.nimSum = nimSum;
|
|
37
|
+
exports.multiGameGrundy = multiGameGrundy;
|
|
38
|
+
exports.nim = nim;
|
|
39
|
+
exports.nim1d = nim1d;
|
|
40
|
+
exports.chompGame = chompGame;
|
|
41
|
+
exports.fromInt = fromInt;
|
|
42
|
+
exports.negate = negate;
|
|
43
|
+
exports.add = add;
|
|
44
|
+
exports.compare = compare;
|
|
45
|
+
exports.isFuzzy = isFuzzy;
|
|
46
|
+
exports.simplify = simplify;
|
|
47
|
+
function stateKey(game, state) {
|
|
48
|
+
return game.key ? game.key(state) : JSON.stringify(state);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Minimum Excludant: menor entero ≥ 0 que no está en el conjunto.
|
|
52
|
+
* mex(∅) = 0, mex({0,1,3}) = 2, mex({1,2}) = 0.
|
|
53
|
+
*/
|
|
54
|
+
function mex(set) {
|
|
55
|
+
let n = 0;
|
|
56
|
+
while (set.has(n))
|
|
57
|
+
n += 1;
|
|
58
|
+
return n;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Valor de Grundy del estado dado bajo el juego imparcial.
|
|
62
|
+
* Define: G(terminal) = 0; G(s) = mex { G(s') : s' ∈ moves(s) }.
|
|
63
|
+
* Usa caché (compartido entre llamadas) keyed por la clave canónica del estado.
|
|
64
|
+
*/
|
|
65
|
+
function grundyValue(game, state, cache = new Map()) {
|
|
66
|
+
const k = stateKey(game, state);
|
|
67
|
+
const cached = cache.get(k);
|
|
68
|
+
if (cached !== undefined)
|
|
69
|
+
return cached;
|
|
70
|
+
if (game.isTerminal(state)) {
|
|
71
|
+
cache.set(k, 0);
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
const successors = game.moves(state);
|
|
75
|
+
const values = new Set();
|
|
76
|
+
for (const next of successors) {
|
|
77
|
+
values.add(grundyValue(game, next, cache));
|
|
78
|
+
}
|
|
79
|
+
const g = mex(values);
|
|
80
|
+
cache.set(k, g);
|
|
81
|
+
return g;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* El jugador a mover gana sii grundy ≠ 0 (juego imparcial con convención
|
|
85
|
+
* normal: el que no puede mover, pierde).
|
|
86
|
+
*/
|
|
87
|
+
function isWinning(game, state) {
|
|
88
|
+
return grundyValue(game, state) !== 0;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Nim-sum: XOR bit a bit de los valores. Identidad del monoide de Grundy
|
|
92
|
+
* bajo suma disjunta de juegos imparciales.
|
|
93
|
+
*/
|
|
94
|
+
function nimSum(values) {
|
|
95
|
+
let acc = 0;
|
|
96
|
+
for (const v of values)
|
|
97
|
+
acc ^= v;
|
|
98
|
+
return acc;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Grundy de la suma disjunta de juegos imparciales independientes:
|
|
102
|
+
* G(G1 + G2 + ... + Gn)(s1,...,sn) = G1(s1) ⊕ G2(s2) ⊕ ... ⊕ Gn(sn).
|
|
103
|
+
* Requiere games.length === states.length.
|
|
104
|
+
*/
|
|
105
|
+
function multiGameGrundy(games, states) {
|
|
106
|
+
if (games.length !== states.length) {
|
|
107
|
+
throw new Error(`multiGameGrundy: games (${games.length}) y states (${states.length}) deben tener igual longitud`);
|
|
108
|
+
}
|
|
109
|
+
const xs = [];
|
|
110
|
+
for (let i = 0; i < games.length; i += 1) {
|
|
111
|
+
// Cada juego tiene su propio caché.
|
|
112
|
+
xs.push(grundyValue(games[i], states[i]));
|
|
113
|
+
}
|
|
114
|
+
return nimSum(xs);
|
|
115
|
+
}
|
|
116
|
+
// ── Juegos pre-construidos ──────────────────────────────────
|
|
117
|
+
/**
|
|
118
|
+
* Nim clásico: varios montones de piedras, un movimiento = sacar ≥1
|
|
119
|
+
* piedras de un único montón. Pierde quien no puede mover (todos los
|
|
120
|
+
* montones a 0). Estado: vector de tamaños (normalizado, sin ceros y
|
|
121
|
+
* ordenado descendente para que el caché sea efectivo entre simetrías).
|
|
122
|
+
*/
|
|
123
|
+
function nim(piles) {
|
|
124
|
+
if (piles.some((p) => p < 0 || !Number.isInteger(p))) {
|
|
125
|
+
throw new Error('nim: cada pila debe ser entero ≥ 0');
|
|
126
|
+
}
|
|
127
|
+
const canon = (s) => s.filter((x) => x > 0).sort((a, b) => b - a);
|
|
128
|
+
const initial = canon(piles);
|
|
129
|
+
return {
|
|
130
|
+
initial,
|
|
131
|
+
isTerminal: (s) => s.length === 0,
|
|
132
|
+
moves: (s) => {
|
|
133
|
+
const out = [];
|
|
134
|
+
for (let i = 0; i < s.length; i += 1) {
|
|
135
|
+
const v = s[i];
|
|
136
|
+
for (let take = 1; take <= v; take += 1) {
|
|
137
|
+
const next = s.slice();
|
|
138
|
+
next[i] = v - take;
|
|
139
|
+
out.push(canon(next));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return out;
|
|
143
|
+
},
|
|
144
|
+
key: (s) => s.join(','),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Nim 1D: una sola pila de `stones` piedras; sacar 1..stones. Equivale
|
|
149
|
+
* a `nim([stones])` pero con estado más compacto (un número).
|
|
150
|
+
*/
|
|
151
|
+
function nim1d(stones) {
|
|
152
|
+
if (!Number.isInteger(stones) || stones < 0) {
|
|
153
|
+
throw new Error('nim1d: stones debe ser entero ≥ 0');
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
initial: stones,
|
|
157
|
+
isTerminal: (s) => s === 0,
|
|
158
|
+
moves: (s) => {
|
|
159
|
+
const out = [];
|
|
160
|
+
for (let take = 1; take <= s; take += 1)
|
|
161
|
+
out.push(s - take);
|
|
162
|
+
return out;
|
|
163
|
+
},
|
|
164
|
+
key: (s) => String(s),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Chomp: tablero rows×cols de "chocolate". Cada movida elige una casilla
|
|
169
|
+
* viva (true) y "muerde" todo el rectángulo abajo-derecha desde ella. La
|
|
170
|
+
* casilla (0,0) es veneno: quien la come pierde (convención misère
|
|
171
|
+
* implementada como: estado terminal cuando solo queda (0,0)).
|
|
172
|
+
*
|
|
173
|
+
* Estado: matriz booleana rows×cols con true = casilla viva.
|
|
174
|
+
*
|
|
175
|
+
* Nota: Chomp tiene posición ganadora conocida para el primer jugador
|
|
176
|
+
* en todo tablero ≥ 2×2 (argumento de robo de estrategia), pero la
|
|
177
|
+
* estrategia explícita es desconocida en general. Para 1×1 (sólo el
|
|
178
|
+
* veneno) el jugador a mover pierde, así que grundy = 0.
|
|
179
|
+
*/
|
|
180
|
+
function chompGame(rows, cols) {
|
|
181
|
+
if (!Number.isInteger(rows) || !Number.isInteger(cols) || rows < 1 || cols < 1) {
|
|
182
|
+
throw new Error('chompGame: rows y cols deben ser enteros ≥ 1');
|
|
183
|
+
}
|
|
184
|
+
const buildInitial = () => {
|
|
185
|
+
const m = [];
|
|
186
|
+
for (let r = 0; r < rows; r += 1) {
|
|
187
|
+
const row = [];
|
|
188
|
+
for (let c = 0; c < cols; c += 1)
|
|
189
|
+
row.push(true);
|
|
190
|
+
m.push(row);
|
|
191
|
+
}
|
|
192
|
+
return m;
|
|
193
|
+
};
|
|
194
|
+
const isTerminal = (s) => {
|
|
195
|
+
// Terminal: sólo queda la casilla (0,0) viva (el veneno). El jugador
|
|
196
|
+
// a mover está obligado a comerla y pierde.
|
|
197
|
+
if (!s[0][0])
|
|
198
|
+
return true; // ya consumida (degenerate)
|
|
199
|
+
for (let r = 0; r < s.length; r += 1) {
|
|
200
|
+
const row = s[r];
|
|
201
|
+
for (let c = 0; c < row.length; c += 1) {
|
|
202
|
+
if (row[c] && !(r === 0 && c === 0))
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return true;
|
|
207
|
+
};
|
|
208
|
+
return {
|
|
209
|
+
initial: buildInitial(),
|
|
210
|
+
isTerminal,
|
|
211
|
+
moves: (s) => {
|
|
212
|
+
const out = [];
|
|
213
|
+
const R = s.length;
|
|
214
|
+
const C = s[0].length;
|
|
215
|
+
for (let r = 0; r < R; r += 1) {
|
|
216
|
+
for (let c = 0; c < C; c += 1) {
|
|
217
|
+
if (!s[r][c])
|
|
218
|
+
continue;
|
|
219
|
+
if (r === 0 && c === 0 && !isTerminal(s)) {
|
|
220
|
+
// Comer el veneno es legal sólo si es la única opción (terminal).
|
|
221
|
+
// No lo ofrecemos como movida si hay otras casillas.
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
// Comer (r,c) elimina toda casilla (r', c') con r' ≥ r y c' ≥ c.
|
|
225
|
+
const next = s.map((row) => row.slice());
|
|
226
|
+
for (let r2 = r; r2 < R; r2 += 1) {
|
|
227
|
+
for (let c2 = c; c2 < C; c2 += 1) {
|
|
228
|
+
next[r2][c2] = false;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
out.push(next);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return out;
|
|
235
|
+
},
|
|
236
|
+
key: (s) => s.map((row) => row.map((b) => (b ? '1' : '0')).join('')).join('/'),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
function makeSurreal(left, right) {
|
|
240
|
+
return { left, right };
|
|
241
|
+
}
|
|
242
|
+
/** 0 = { | } — sin opciones para ninguno; "second player wins". */
|
|
243
|
+
exports.ZERO = makeSurreal([], []);
|
|
244
|
+
/** 1 = { 0 | }. */
|
|
245
|
+
exports.ONE = makeSurreal([exports.ZERO], []);
|
|
246
|
+
/** -1 = { | 0 }. */
|
|
247
|
+
exports.MINUS_ONE = makeSurreal([], [exports.ZERO]);
|
|
248
|
+
/** * (star) = { 0 | 0 } — primer jugador gana, no comparable a 0 (fuzzy). */
|
|
249
|
+
exports.STAR = makeSurreal([exports.ZERO], [exports.ZERO]);
|
|
250
|
+
/**
|
|
251
|
+
* Construye el surreal correspondiente al entero `n`.
|
|
252
|
+
* 0 = { | }
|
|
253
|
+
* n = { n-1 | } (n > 0)
|
|
254
|
+
* -n = { | -(n-1) } (n < 0)
|
|
255
|
+
*/
|
|
256
|
+
function fromInt(n) {
|
|
257
|
+
if (!Number.isInteger(n))
|
|
258
|
+
throw new Error('fromInt: requiere entero');
|
|
259
|
+
if (n === 0)
|
|
260
|
+
return exports.ZERO;
|
|
261
|
+
if (n > 0)
|
|
262
|
+
return makeSurreal([fromInt(n - 1)], []);
|
|
263
|
+
return makeSurreal([], [fromInt(n + 1)]);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Negación: -G = { -GR | -GL }.
|
|
267
|
+
*/
|
|
268
|
+
function negate(s) {
|
|
269
|
+
return makeSurreal(s.right.map((r) => negate(r)), s.left.map((l) => negate(l)));
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Suma de juegos: G + H = { GL+H, G+HL | GR+H, G+HR }.
|
|
273
|
+
*/
|
|
274
|
+
function add(a, b) {
|
|
275
|
+
const left = [];
|
|
276
|
+
for (const al of a.left)
|
|
277
|
+
left.push(add(al, b));
|
|
278
|
+
for (const bl of b.left)
|
|
279
|
+
left.push(add(a, bl));
|
|
280
|
+
const right = [];
|
|
281
|
+
for (const ar of a.right)
|
|
282
|
+
right.push(add(ar, b));
|
|
283
|
+
for (const br of b.right)
|
|
284
|
+
right.push(add(a, br));
|
|
285
|
+
return makeSurreal(left, right);
|
|
286
|
+
}
|
|
287
|
+
// ── Comparación de surreales ────────────────────────────────
|
|
288
|
+
//
|
|
289
|
+
// Definición Conway:
|
|
290
|
+
// G ≤ H ⇔ ∀ GL. ¬(H ≤ GL) ∧ ∀ HR. ¬(HR ≤ G)
|
|
291
|
+
// Equivalentemente:
|
|
292
|
+
// G ≥ H ⇔ H ≤ G
|
|
293
|
+
// G || H (fuzzy/incomparable) ⇔ ¬(G ≤ H) ∧ ¬(H ≤ G)
|
|
294
|
+
//
|
|
295
|
+
// `compare(a, b)` devuelve -1 si a<b, 1 si a>b, 0 si a==b. Si son
|
|
296
|
+
// incomparables (fuzzy) lanza error explicito — usá `isFuzzy` antes o
|
|
297
|
+
// `leq`/`geq` directamente.
|
|
298
|
+
function leq(a, b) {
|
|
299
|
+
for (const al of a.left) {
|
|
300
|
+
if (leq(b, al))
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
for (const br of b.right) {
|
|
304
|
+
if (leq(br, a))
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
return true;
|
|
308
|
+
}
|
|
309
|
+
function compare(a, b) {
|
|
310
|
+
const ab = leq(a, b);
|
|
311
|
+
const ba = leq(b, a);
|
|
312
|
+
if (ab && ba)
|
|
313
|
+
return 0;
|
|
314
|
+
if (ab && !ba)
|
|
315
|
+
return -1;
|
|
316
|
+
if (!ab && ba)
|
|
317
|
+
return 1;
|
|
318
|
+
throw new Error('compare: surreales incomparables (fuzzy). Usá isFuzzy / leq / geq.');
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* G es fuzzy con 0 sii no satisface G ≤ 0 ni 0 ≤ G — es decir, el
|
|
322
|
+
* primer jugador gana. * es el ejemplo canónico.
|
|
323
|
+
*/
|
|
324
|
+
function isFuzzy(s) {
|
|
325
|
+
return !leq(s, exports.ZERO) && !leq(exports.ZERO, s);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Simplificación parcial: elimina opciones dominadas en cada lado.
|
|
329
|
+
*
|
|
330
|
+
* En la lista Left, una opción L1 domina a L2 si L1 ≥ L2 (entonces
|
|
331
|
+
* L2 puede borrarse: el jugador Left preferirá L1).
|
|
332
|
+
* En la lista Right, una opción R1 domina a R2 si R1 ≤ R2.
|
|
333
|
+
*
|
|
334
|
+
* No hace eliminación reversible ("bypass") — eso podría requerirse
|
|
335
|
+
* para canonicalización completa Conway. Para nuestros tests es
|
|
336
|
+
* suficiente.
|
|
337
|
+
*/
|
|
338
|
+
function simplify(s) {
|
|
339
|
+
const simplifiedLeft = s.left.map((l) => simplify(l));
|
|
340
|
+
const simplifiedRight = s.right.map((r) => simplify(r));
|
|
341
|
+
// Dominancia Left: descartar L2 si existe L1 con L1 ≥ L2 (L1 ≠ L2).
|
|
342
|
+
const keptLeft = [];
|
|
343
|
+
for (let i = 0; i < simplifiedLeft.length; i += 1) {
|
|
344
|
+
const li = simplifiedLeft[i];
|
|
345
|
+
let dominated = false;
|
|
346
|
+
for (let j = 0; j < simplifiedLeft.length; j += 1) {
|
|
347
|
+
if (i === j)
|
|
348
|
+
continue;
|
|
349
|
+
const lj = simplifiedLeft[j];
|
|
350
|
+
if (leq(li, lj) && !leq(lj, li)) {
|
|
351
|
+
dominated = true;
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (!dominated)
|
|
356
|
+
keptLeft.push(li);
|
|
357
|
+
}
|
|
358
|
+
// Dominancia Right: descartar R2 si existe R1 con R1 ≤ R2 (R1 ≠ R2).
|
|
359
|
+
const keptRight = [];
|
|
360
|
+
for (let i = 0; i < simplifiedRight.length; i += 1) {
|
|
361
|
+
const ri = simplifiedRight[i];
|
|
362
|
+
let dominated = false;
|
|
363
|
+
for (let j = 0; j < simplifiedRight.length; j += 1) {
|
|
364
|
+
if (i === j)
|
|
365
|
+
continue;
|
|
366
|
+
const rj = simplifiedRight[j];
|
|
367
|
+
if (leq(rj, ri) && !leq(ri, rj)) {
|
|
368
|
+
dominated = true;
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
if (!dominated)
|
|
373
|
+
keptRight.push(ri);
|
|
374
|
+
}
|
|
375
|
+
return makeSurreal(keptLeft, keptRight);
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/reasoning/combinatorial-games/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { AuctionResult } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* First-price sealed-bid: el ganador paga su propio bid.
|
|
4
|
+
*
|
|
5
|
+
* No es strategy-proof — el bidder racional shadea su bid bajo su
|
|
6
|
+
* valuation. Pero la regla es lo más simple del mundo.
|
|
7
|
+
*/
|
|
8
|
+
export declare function firstPriceSealed(bids: Map<string, number>): AuctionResult;
|
|
9
|
+
/**
|
|
10
|
+
* Second-price sealed-bid (Vickrey): el ganador paga el segundo bid más
|
|
11
|
+
* alto. Es DSIC: bidding truthful es dominante.
|
|
12
|
+
*
|
|
13
|
+
* Si solo hay un bidder válido, paga 0 (no hay segundo precio). Esa es
|
|
14
|
+
* la convención estándar; en variantes con reserve, el reserve actúa
|
|
15
|
+
* como segundo precio si no hay otro bidder por encima.
|
|
16
|
+
*/
|
|
17
|
+
export declare function secondPriceSealed(bids: Map<string, number>): AuctionResult;
|
|
18
|
+
/**
|
|
19
|
+
* English ascending auction: simulamos un reloj que sube en pasos de
|
|
20
|
+
* `increment`. Cada bidder sigue activo mientras el precio no supere
|
|
21
|
+
* su valuation. Cuando solo queda 1 activo, termina y paga el precio
|
|
22
|
+
* actual.
|
|
23
|
+
*
|
|
24
|
+
* Bajo bidders racionales (cada uno dropea exactamente en su valuation),
|
|
25
|
+
* el resultado es equivalente a second-price (el ganador paga ~ segundo
|
|
26
|
+
* valor más alto, módulo `increment`).
|
|
27
|
+
*
|
|
28
|
+
* Implementación: en vez de simular reloj, calculamos directo:
|
|
29
|
+
* winner = bidder con max valuation
|
|
30
|
+
* payment = ceil(secondHighest / increment) * increment ≈ second + un step
|
|
31
|
+
*
|
|
32
|
+
* Para los tests usamos increment=1, lo que da payment ≈ second.
|
|
33
|
+
*/
|
|
34
|
+
export declare function englishAuction(bids: Map<string, number>, increment: number): AuctionResult;
|
|
35
|
+
/**
|
|
36
|
+
* Dutch descending auction: reloj baja desde `initialPrice` con pasos
|
|
37
|
+
* `decrement`. El primer bidder en aceptar (precio ≤ su valuation)
|
|
38
|
+
* gana y paga ese precio.
|
|
39
|
+
*
|
|
40
|
+
* Estratégicamente, Dutch ≡ first-price sealed: cada bidder elige a qué
|
|
41
|
+
* precio aceptar, equivalente a elegir su bid. Implementamos via
|
|
42
|
+
* simulación discreta.
|
|
43
|
+
*
|
|
44
|
+
* `bidders.get(id)` = valor máximo que el bidder está dispuesto a pagar
|
|
45
|
+
* (su bid efectivo en el equivalente sealed). El primero en alcanzar
|
|
46
|
+
* un precio ≤ a su bid gana.
|
|
47
|
+
*/
|
|
48
|
+
export declare function dutchAuction(initialPrice: number, bidders: Map<string, number>, decrement: number): AuctionResult;
|
|
49
|
+
//# sourceMappingURL=auctions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auctions.d.ts","sourceRoot":"","sources":["../../../src/reasoning/mechanism-design/auctions.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAmB7C;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa,CAIzE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa,CAsB1E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,CAkC1F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,SAAS,EAAE,MAAM,GAChB,aAAa,CA6Bf"}
|