@stevenvo780/st-lang 4.3.0 → 4.4.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/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -2
- package/dist/index.js.map +1 -1
- package/dist/lambda-calc/church.d.ts.map +1 -1
- package/dist/lambda-calc/church.js.map +1 -1
- package/dist/lambda-calc/combinators.d.ts.map +1 -1
- package/dist/lambda-calc/combinators.js.map +1 -1
- package/dist/lambda-calc/index.d.ts +1 -1
- package/dist/lambda-calc/index.d.ts.map +1 -1
- package/dist/lambda-calc/index.js.map +1 -1
- package/dist/mltt/equality.d.ts +9 -0
- package/dist/mltt/equality.d.ts.map +1 -0
- package/dist/mltt/equality.js +79 -0
- package/dist/mltt/equality.js.map +1 -0
- package/dist/mltt/index.d.ts +8 -0
- package/dist/mltt/index.d.ts.map +1 -0
- package/dist/mltt/index.js +49 -0
- package/dist/mltt/index.js.map +1 -0
- package/dist/mltt/infer.d.ts +17 -0
- package/dist/mltt/infer.d.ts.map +1 -0
- package/dist/mltt/infer.js +269 -0
- package/dist/mltt/infer.js.map +1 -0
- package/dist/mltt/normalize.d.ts +7 -0
- package/dist/mltt/normalize.d.ts.map +1 -0
- package/dist/mltt/normalize.js +131 -0
- package/dist/mltt/normalize.js.map +1 -0
- package/dist/mltt/substitute.d.ts +4 -0
- package/dist/mltt/substitute.d.ts.map +1 -0
- package/dist/mltt/substitute.js +94 -0
- package/dist/mltt/substitute.js.map +1 -0
- package/dist/mltt/types.d.ts +72 -0
- package/dist/mltt/types.d.ts.map +1 -0
- package/dist/mltt/types.js +211 -0
- package/dist/mltt/types.js.map +1 -0
- package/dist/profiles/many-valued/index.d.ts.map +1 -1
- package/dist/profiles/many-valued/index.js.map +1 -1
- package/dist/profiles/mu-calculus/check.d.ts +15 -0
- package/dist/profiles/mu-calculus/check.d.ts.map +1 -0
- package/dist/profiles/mu-calculus/check.js +172 -0
- package/dist/profiles/mu-calculus/check.js.map +1 -0
- package/dist/profiles/mu-calculus/ctl-translate.d.ts +61 -0
- package/dist/profiles/mu-calculus/ctl-translate.d.ts.map +1 -0
- package/dist/profiles/mu-calculus/ctl-translate.js +181 -0
- package/dist/profiles/mu-calculus/ctl-translate.js.map +1 -0
- package/dist/profiles/mu-calculus/index.d.ts +7 -0
- package/dist/profiles/mu-calculus/index.d.ts.map +1 -0
- package/dist/profiles/mu-calculus/index.js +33 -0
- package/dist/profiles/mu-calculus/index.js.map +1 -0
- package/dist/profiles/mu-calculus/types.d.ts +51 -0
- package/dist/profiles/mu-calculus/types.d.ts.map +1 -0
- package/dist/profiles/mu-calculus/types.js +42 -0
- package/dist/profiles/mu-calculus/types.js.map +1 -0
- package/dist/profiles/mu-calculus/wellformed.d.ts +40 -0
- package/dist/profiles/mu-calculus/wellformed.d.ts.map +1 -0
- package/dist/profiles/mu-calculus/wellformed.js +160 -0
- package/dist/profiles/mu-calculus/wellformed.js.map +1 -0
- package/dist/profiles/sequent-lk/cut-elimination.d.ts +11 -0
- package/dist/profiles/sequent-lk/cut-elimination.d.ts.map +1 -0
- package/dist/profiles/sequent-lk/cut-elimination.js +216 -0
- package/dist/profiles/sequent-lk/cut-elimination.js.map +1 -0
- package/dist/profiles/sequent-lk/index.d.ts +5 -0
- package/dist/profiles/sequent-lk/index.d.ts.map +1 -0
- package/dist/profiles/sequent-lk/index.js +24 -0
- package/dist/profiles/sequent-lk/index.js.map +1 -0
- package/dist/profiles/sequent-lk/prover.d.ts +25 -0
- package/dist/profiles/sequent-lk/prover.d.ts.map +1 -0
- package/dist/profiles/sequent-lk/prover.js +532 -0
- package/dist/profiles/sequent-lk/prover.js.map +1 -0
- package/dist/profiles/sequent-lk/types.d.ts +55 -0
- package/dist/profiles/sequent-lk/types.d.ts.map +1 -0
- package/dist/profiles/sequent-lk/types.js +18 -0
- package/dist/profiles/sequent-lk/types.js.map +1 -0
- package/dist/profiles/sequent-lk/util.d.ts +18 -0
- package/dist/profiles/sequent-lk/util.d.ts.map +1 -0
- package/dist/profiles/sequent-lk/util.js +71 -0
- package/dist/profiles/sequent-lk/util.js.map +1 -0
- package/dist/refinement-types/checker.d.ts +19 -0
- package/dist/refinement-types/checker.d.ts.map +1 -0
- package/dist/refinement-types/checker.js +248 -0
- package/dist/refinement-types/checker.js.map +1 -0
- package/dist/refinement-types/index.d.ts +11 -0
- package/dist/refinement-types/index.d.ts.map +1 -0
- package/dist/refinement-types/index.js +51 -0
- package/dist/refinement-types/index.js.map +1 -0
- package/dist/refinement-types/predicate.d.ts +31 -0
- package/dist/refinement-types/predicate.d.ts.map +1 -0
- package/dist/refinement-types/predicate.js +369 -0
- package/dist/refinement-types/predicate.js.map +1 -0
- package/dist/refinement-types/solver.d.ts +24 -0
- package/dist/refinement-types/solver.d.ts.map +1 -0
- package/dist/refinement-types/solver.js +207 -0
- package/dist/refinement-types/solver.js.map +1 -0
- package/dist/refinement-types/subtype.d.ts +14 -0
- package/dist/refinement-types/subtype.d.ts.map +1 -0
- package/dist/refinement-types/subtype.js +39 -0
- package/dist/refinement-types/subtype.js.map +1 -0
- package/dist/refinement-types/types.d.ts +64 -0
- package/dist/refinement-types/types.d.ts.map +1 -0
- package/dist/refinement-types/types.js +130 -0
- package/dist/refinement-types/types.js.map +1 -0
- package/dist/runtime/anti-unification/anti-unify.d.ts +22 -0
- package/dist/runtime/anti-unification/anti-unify.d.ts.map +1 -0
- package/dist/runtime/anti-unification/anti-unify.js +154 -0
- package/dist/runtime/anti-unification/anti-unify.js.map +1 -0
- package/dist/runtime/anti-unification/index.d.ts +6 -0
- package/dist/runtime/anti-unification/index.d.ts.map +1 -0
- package/dist/runtime/anti-unification/index.js +23 -0
- package/dist/runtime/anti-unification/index.js.map +1 -0
- package/dist/runtime/anti-unification/many.d.ts +49 -0
- package/dist/runtime/anti-unification/many.d.ts.map +1 -0
- package/dist/runtime/anti-unification/many.js +185 -0
- package/dist/runtime/anti-unification/many.js.map +1 -0
- package/dist/runtime/anti-unification/term-utils.d.ts +40 -0
- package/dist/runtime/anti-unification/term-utils.d.ts.map +1 -0
- package/dist/runtime/anti-unification/term-utils.js +173 -0
- package/dist/runtime/anti-unification/term-utils.js.map +1 -0
- package/dist/runtime/anti-unification/types.d.ts +41 -0
- package/dist/runtime/anti-unification/types.d.ts.map +1 -0
- package/dist/runtime/anti-unification/types.js +26 -0
- package/dist/runtime/anti-unification/types.js.map +1 -0
- package/dist/runtime/csp/ac3.d.ts +20 -0
- package/dist/runtime/csp/ac3.d.ts.map +1 -0
- package/dist/runtime/csp/ac3.js +165 -0
- package/dist/runtime/csp/ac3.js.map +1 -0
- package/dist/runtime/csp/backtrack.d.ts +15 -0
- package/dist/runtime/csp/backtrack.d.ts.map +1 -0
- package/dist/runtime/csp/backtrack.js +233 -0
- package/dist/runtime/csp/backtrack.js.map +1 -0
- package/dist/runtime/csp/builtins.d.ts +27 -0
- package/dist/runtime/csp/builtins.d.ts.map +1 -0
- package/dist/runtime/csp/builtins.js +109 -0
- package/dist/runtime/csp/builtins.js.map +1 -0
- package/dist/runtime/csp/index.d.ts +5 -0
- package/dist/runtime/csp/index.d.ts.map +1 -0
- package/dist/runtime/csp/index.js +23 -0
- package/dist/runtime/csp/index.js.map +1 -0
- package/dist/runtime/csp/types.d.ts +54 -0
- package/dist/runtime/csp/types.d.ts.map +1 -0
- package/dist/runtime/csp/types.js +14 -0
- package/dist/runtime/csp/types.js.map +1 -0
- package/dist/runtime/markov-logic/grounding.d.ts +19 -0
- package/dist/runtime/markov-logic/grounding.d.ts.map +1 -0
- package/dist/runtime/markov-logic/grounding.js +252 -0
- package/dist/runtime/markov-logic/grounding.js.map +1 -0
- package/dist/runtime/markov-logic/index.d.ts +6 -0
- package/dist/runtime/markov-logic/index.d.ts.map +1 -0
- package/dist/runtime/markov-logic/index.js +47 -0
- package/dist/runtime/markov-logic/index.js.map +1 -0
- package/dist/runtime/markov-logic/inference.d.ts +77 -0
- package/dist/runtime/markov-logic/inference.d.ts.map +1 -0
- package/dist/runtime/markov-logic/inference.js +382 -0
- package/dist/runtime/markov-logic/inference.js.map +1 -0
- package/dist/runtime/markov-logic/parser.d.ts +25 -0
- package/dist/runtime/markov-logic/parser.d.ts.map +1 -0
- package/dist/runtime/markov-logic/parser.js +264 -0
- package/dist/runtime/markov-logic/parser.js.map +1 -0
- package/dist/runtime/markov-logic/types.d.ts +64 -0
- package/dist/runtime/markov-logic/types.d.ts.map +1 -0
- package/dist/runtime/markov-logic/types.js +17 -0
- package/dist/runtime/markov-logic/types.js.map +1 -0
- package/dist/runtime/pi-calculus/congruence.d.ts +15 -0
- package/dist/runtime/pi-calculus/congruence.d.ts.map +1 -0
- package/dist/runtime/pi-calculus/congruence.js +271 -0
- package/dist/runtime/pi-calculus/congruence.js.map +1 -0
- package/dist/runtime/pi-calculus/index.d.ts +6 -0
- package/dist/runtime/pi-calculus/index.d.ts.map +1 -0
- package/dist/runtime/pi-calculus/index.js +30 -0
- package/dist/runtime/pi-calculus/index.js.map +1 -0
- package/dist/runtime/pi-calculus/names.d.ts +28 -0
- package/dist/runtime/pi-calculus/names.d.ts.map +1 -0
- package/dist/runtime/pi-calculus/names.js +182 -0
- package/dist/runtime/pi-calculus/names.js.map +1 -0
- package/dist/runtime/pi-calculus/reduction.d.ts +25 -0
- package/dist/runtime/pi-calculus/reduction.d.ts.map +1 -0
- package/dist/runtime/pi-calculus/reduction.js +338 -0
- package/dist/runtime/pi-calculus/reduction.js.map +1 -0
- package/dist/runtime/pi-calculus/substitution.d.ts +11 -0
- package/dist/runtime/pi-calculus/substitution.d.ts.map +1 -0
- package/dist/runtime/pi-calculus/substitution.js +109 -0
- package/dist/runtime/pi-calculus/substitution.js.map +1 -0
- package/dist/runtime/pi-calculus/types.d.ts +38 -0
- package/dist/runtime/pi-calculus/types.d.ts.map +1 -0
- package/dist/runtime/pi-calculus/types.js +22 -0
- package/dist/runtime/pi-calculus/types.js.map +1 -0
- package/dist/runtime/planning/astar.d.ts +10 -0
- package/dist/runtime/planning/astar.d.ts.map +1 -0
- package/dist/runtime/planning/astar.js +155 -0
- package/dist/runtime/planning/astar.js.map +1 -0
- package/dist/runtime/planning/bfs.d.ts +17 -0
- package/dist/runtime/planning/bfs.d.ts.map +1 -0
- package/dist/runtime/planning/bfs.js +87 -0
- package/dist/runtime/planning/bfs.js.map +1 -0
- package/dist/runtime/planning/ground.d.ts +55 -0
- package/dist/runtime/planning/ground.d.ts.map +1 -0
- package/dist/runtime/planning/ground.js +154 -0
- package/dist/runtime/planning/ground.js.map +1 -0
- package/dist/runtime/planning/heuristic.d.ts +29 -0
- package/dist/runtime/planning/heuristic.d.ts.map +1 -0
- package/dist/runtime/planning/heuristic.js +172 -0
- package/dist/runtime/planning/heuristic.js.map +1 -0
- package/dist/runtime/planning/index.d.ts +6 -0
- package/dist/runtime/planning/index.d.ts.map +1 -0
- package/dist/runtime/planning/index.js +38 -0
- package/dist/runtime/planning/index.js.map +1 -0
- package/dist/runtime/planning/types.d.ts +100 -0
- package/dist/runtime/planning/types.d.ts.map +1 -0
- package/dist/runtime/planning/types.js +22 -0
- package/dist/runtime/planning/types.js.map +1 -0
- package/dist/runtime/symbolic-diff/differentiate.d.ts.map +1 -1
- package/dist/runtime/symbolic-diff/differentiate.js.map +1 -1
- package/dist/runtime/symbolic-diff/index.d.ts +1 -1
- package/dist/runtime/symbolic-diff/index.d.ts.map +1 -1
- package/dist/runtime/symbolic-diff/index.js.map +1 -1
- package/dist/runtime/symbolic-diff/parse.d.ts.map +1 -1
- package/dist/runtime/symbolic-diff/parse.js +7 -1
- package/dist/runtime/symbolic-diff/parse.js.map +1 -1
- package/dist/runtime/theorem-cache/cache.d.ts +100 -0
- package/dist/runtime/theorem-cache/cache.d.ts.map +1 -0
- package/dist/runtime/theorem-cache/cache.js +213 -0
- package/dist/runtime/theorem-cache/cache.js.map +1 -0
- package/dist/runtime/theorem-cache/canonical.d.ts +59 -0
- package/dist/runtime/theorem-cache/canonical.d.ts.map +1 -0
- package/dist/runtime/theorem-cache/canonical.js +105 -0
- package/dist/runtime/theorem-cache/canonical.js.map +1 -0
- package/dist/runtime/theorem-cache/index.d.ts +6 -0
- package/dist/runtime/theorem-cache/index.d.ts.map +1 -0
- package/dist/runtime/theorem-cache/index.js +16 -0
- package/dist/runtime/theorem-cache/index.js.map +1 -0
- package/dist/runtime/theorem-cache/pattern.d.ts +24 -0
- package/dist/runtime/theorem-cache/pattern.d.ts.map +1 -0
- package/dist/runtime/theorem-cache/pattern.js +80 -0
- package/dist/runtime/theorem-cache/pattern.js.map +1 -0
- package/dist/system-f/index.d.ts +7 -0
- package/dist/system-f/index.d.ts.map +1 -0
- package/dist/system-f/index.js +48 -0
- package/dist/system-f/index.js.map +1 -0
- package/dist/system-f/infer.d.ts +9 -0
- package/dist/system-f/infer.d.ts.map +1 -0
- package/dist/system-f/infer.js +94 -0
- package/dist/system-f/infer.js.map +1 -0
- package/dist/system-f/reduce.d.ts +15 -0
- package/dist/system-f/reduce.d.ts.map +1 -0
- package/dist/system-f/reduce.js +259 -0
- package/dist/system-f/reduce.js.map +1 -0
- package/dist/system-f/types.d.ts +53 -0
- package/dist/system-f/types.d.ts.map +1 -0
- package/dist/system-f/types.js +157 -0
- package/dist/system-f/types.js.map +1 -0
- package/dist/tests/anti-unification/anti-unify.test.d.ts +2 -0
- package/dist/tests/anti-unification/anti-unify.test.d.ts.map +1 -0
- package/dist/tests/anti-unification/anti-unify.test.js +219 -0
- package/dist/tests/anti-unification/anti-unify.test.js.map +1 -0
- package/dist/tests/coverage-fill-aristotelian.test.js +1 -1
- package/dist/tests/coverage-fill-aristotelian.test.js.map +1 -1
- package/dist/tests/coverage-fill-fallacies.test.js +1 -1
- package/dist/tests/coverage-fill-fallacies.test.js.map +1 -1
- package/dist/tests/coverage-fill-format.test.js +1 -1
- package/dist/tests/coverage-fill-format.test.js.map +1 -1
- package/dist/tests/coverage-fill-intuitionistic.test.js +1 -1
- package/dist/tests/coverage-fill-intuitionistic.test.js.map +1 -1
- package/dist/tests/coverage-fill-probabilistic.test.js +1 -1
- package/dist/tests/coverage-fill-probabilistic.test.js.map +1 -1
- package/dist/tests/csp/csp.test.d.ts +2 -0
- package/dist/tests/csp/csp.test.d.ts.map +1 -0
- package/dist/tests/csp/csp.test.js +292 -0
- package/dist/tests/csp/csp.test.js.map +1 -0
- package/dist/tests/lambda-calc/lambda-calc.test.js.map +1 -1
- package/dist/tests/many-valued/many-valued.test.js.map +1 -1
- package/dist/tests/markov-logic/markov-logic.test.d.ts +2 -0
- package/dist/tests/markov-logic/markov-logic.test.d.ts.map +1 -0
- package/dist/tests/markov-logic/markov-logic.test.js +349 -0
- package/dist/tests/markov-logic/markov-logic.test.js.map +1 -0
- package/dist/tests/mltt/mltt.test.d.ts +2 -0
- package/dist/tests/mltt/mltt.test.d.ts.map +1 -0
- package/dist/tests/mltt/mltt.test.js +181 -0
- package/dist/tests/mltt/mltt.test.js.map +1 -0
- package/dist/tests/mu-calculus/check.test.d.ts +2 -0
- package/dist/tests/mu-calculus/check.test.d.ts.map +1 -0
- package/dist/tests/mu-calculus/check.test.js +234 -0
- package/dist/tests/mu-calculus/check.test.js.map +1 -0
- package/dist/tests/pi-calculus/pi-calculus.test.d.ts +2 -0
- package/dist/tests/pi-calculus/pi-calculus.test.d.ts.map +1 -0
- package/dist/tests/pi-calculus/pi-calculus.test.js +273 -0
- package/dist/tests/pi-calculus/pi-calculus.test.js.map +1 -0
- package/dist/tests/planning/planning.test.d.ts +2 -0
- package/dist/tests/planning/planning.test.d.ts.map +1 -0
- package/dist/tests/planning/planning.test.js +397 -0
- package/dist/tests/planning/planning.test.js.map +1 -0
- package/dist/tests/refinement-types/refinement-types.test.d.ts +2 -0
- package/dist/tests/refinement-types/refinement-types.test.d.ts.map +1 -0
- package/dist/tests/refinement-types/refinement-types.test.js +174 -0
- package/dist/tests/refinement-types/refinement-types.test.js.map +1 -0
- package/dist/tests/sequent-lk/prover.test.d.ts +2 -0
- package/dist/tests/sequent-lk/prover.test.d.ts.map +1 -0
- package/dist/tests/sequent-lk/prover.test.js +317 -0
- package/dist/tests/sequent-lk/prover.test.js.map +1 -0
- package/dist/tests/symbolic-diff/symbolic-diff.test.js.map +1 -1
- package/dist/tests/system-f/system-f.test.d.ts +2 -0
- package/dist/tests/system-f/system-f.test.d.ts.map +1 -0
- package/dist/tests/system-f/system-f.test.js +217 -0
- package/dist/tests/system-f/system-f.test.js.map +1 -0
- package/dist/tests/theorem-cache/cache.test.d.ts +2 -0
- package/dist/tests/theorem-cache/cache.test.d.ts.map +1 -0
- package/dist/tests/theorem-cache/cache.test.js +510 -0
- package/dist/tests/theorem-cache/cache.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// AC-3 — Arc Consistency #3 (Mackworth, 1977).
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Mantiene la consistencia de arco binaria: para cada arco (Xi, Xj)
|
|
6
|
+
// y para cada valor v ∈ D(Xi), debe existir al menos un valor
|
|
7
|
+
// w ∈ D(Xj) tal que la restricción binaria entre Xi y Xj acepte
|
|
8
|
+
// la tupla (v, w). Si no existe, v se elimina de D(Xi).
|
|
9
|
+
//
|
|
10
|
+
// Complejidad: O(e · d³) donde e = # de restricciones binarias y
|
|
11
|
+
// d = tamaño máximo de dominio. Suficientemente rápido para CSPs
|
|
12
|
+
// de tamaño moderado (sudoku, n-queens, coloreo de grafos).
|
|
13
|
+
//
|
|
14
|
+
// Las restricciones n-arias (n > 2) NO participan en AC-3: sólo
|
|
15
|
+
// se contraen las binarias. Las n-arias se chequean en backtracking.
|
|
16
|
+
// ============================================================
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.ac3 = ac3;
|
|
19
|
+
exports.ac3InPlace = ac3InPlace;
|
|
20
|
+
/**
|
|
21
|
+
* Devuelve `true` si el predicado de la restricción binaria acepta la
|
|
22
|
+
* tupla (a, b) según el orden de `c.vars`. Si los var indices están
|
|
23
|
+
* cruzados, alinea automáticamente.
|
|
24
|
+
*/
|
|
25
|
+
function binaryAccepts(c, xi, xj, a, b) {
|
|
26
|
+
if (c.vars.length !== 2) {
|
|
27
|
+
throw new Error('binaryAccepts: la restricción no es binaria');
|
|
28
|
+
}
|
|
29
|
+
const [v0, v1] = c.vars;
|
|
30
|
+
if (v0 === xi && v1 === xj)
|
|
31
|
+
return c.predicate([a, b]);
|
|
32
|
+
if (v0 === xj && v1 === xi)
|
|
33
|
+
return c.predicate([b, a]);
|
|
34
|
+
throw new Error('binaryAccepts: la restricción no involucra (xi, xj)');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Construye el índice "vecinos binarios" del CSP.
|
|
38
|
+
* vecinos[xi] = lista de pares { xj, constraint } tales que existe una
|
|
39
|
+
* restricción binaria entre xi y xj.
|
|
40
|
+
*/
|
|
41
|
+
function buildBinaryNeighbors(csp) {
|
|
42
|
+
const neighbors = new Map();
|
|
43
|
+
for (const v of csp.variables)
|
|
44
|
+
neighbors.set(v, []);
|
|
45
|
+
for (const c of csp.constraints) {
|
|
46
|
+
if (c.vars.length !== 2)
|
|
47
|
+
continue;
|
|
48
|
+
const [a, b] = c.vars;
|
|
49
|
+
if (a === undefined || b === undefined)
|
|
50
|
+
continue;
|
|
51
|
+
neighbors.get(a)?.push({ other: b, constraint: c });
|
|
52
|
+
neighbors.get(b)?.push({ other: a, constraint: c });
|
|
53
|
+
}
|
|
54
|
+
return neighbors;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Revisa el arco (xi → xj): elimina de D(xi) todo valor sin soporte
|
|
58
|
+
* en D(xj). Retorna `true` si el dominio cambió.
|
|
59
|
+
*/
|
|
60
|
+
function revise(domains, xi, xj, constraint) {
|
|
61
|
+
const dxi = domains.get(xi);
|
|
62
|
+
const dxj = domains.get(xj);
|
|
63
|
+
if (!dxi || !dxj)
|
|
64
|
+
return false;
|
|
65
|
+
let revised = false;
|
|
66
|
+
const keep = [];
|
|
67
|
+
for (const a of dxi) {
|
|
68
|
+
let hasSupport = false;
|
|
69
|
+
for (const b of dxj) {
|
|
70
|
+
if (binaryAccepts(constraint, xi, xj, a, b)) {
|
|
71
|
+
hasSupport = true;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (hasSupport)
|
|
76
|
+
keep.push(a);
|
|
77
|
+
else
|
|
78
|
+
revised = true;
|
|
79
|
+
}
|
|
80
|
+
if (revised)
|
|
81
|
+
domains.set(xi, keep);
|
|
82
|
+
return revised;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Aplica AC-3 sobre una copia de los dominios del CSP.
|
|
86
|
+
* Devuelve { consistent, reducedDomains }: si `consistent` es false,
|
|
87
|
+
* el CSP es UNSAT por consistencia de arco (algún dominio quedó vacío).
|
|
88
|
+
*
|
|
89
|
+
* La firma deja los dominios originales intactos: el caller decide si
|
|
90
|
+
* adoptar `reducedDomains` o conservar los originales.
|
|
91
|
+
*/
|
|
92
|
+
function ac3(csp) {
|
|
93
|
+
// Copia profunda de dominios para no mutar el input.
|
|
94
|
+
const reduced = new Map();
|
|
95
|
+
for (const [k, vals] of csp.domains)
|
|
96
|
+
reduced.set(k, [...vals]);
|
|
97
|
+
const neighbors = buildBinaryNeighbors(csp);
|
|
98
|
+
const queue = [];
|
|
99
|
+
for (const c of csp.constraints) {
|
|
100
|
+
if (c.vars.length !== 2)
|
|
101
|
+
continue;
|
|
102
|
+
const [a, b] = c.vars;
|
|
103
|
+
if (a === undefined || b === undefined)
|
|
104
|
+
continue;
|
|
105
|
+
queue.push({ xi: a, xj: b, constraint: c });
|
|
106
|
+
queue.push({ xi: b, xj: a, constraint: c });
|
|
107
|
+
}
|
|
108
|
+
while (queue.length > 0) {
|
|
109
|
+
const arc = queue.shift();
|
|
110
|
+
if (!arc)
|
|
111
|
+
continue;
|
|
112
|
+
const { xi, xj, constraint } = arc;
|
|
113
|
+
if (revise(reduced, xi, xj, constraint)) {
|
|
114
|
+
const di = reduced.get(xi);
|
|
115
|
+
if (!di || di.length === 0) {
|
|
116
|
+
return { consistent: false, reducedDomains: reduced };
|
|
117
|
+
}
|
|
118
|
+
// Re-encolar (xk, xi) para cada vecino xk ≠ xj.
|
|
119
|
+
const nbrs = neighbors.get(xi) ?? [];
|
|
120
|
+
for (const { other: xk, constraint: ck } of nbrs) {
|
|
121
|
+
if (xk === xj)
|
|
122
|
+
continue;
|
|
123
|
+
queue.push({ xi: xk, xj: xi, constraint: ck });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return { consistent: true, reducedDomains: reduced };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Helper público para uso en backtracking incremental: aplica AC-3
|
|
131
|
+
* sobre un set de dominios ya provisto (mutación in-place permitida)
|
|
132
|
+
* y devuelve `true` si los dominios siguen consistentes.
|
|
133
|
+
*/
|
|
134
|
+
function ac3InPlace(csp, domains) {
|
|
135
|
+
const neighbors = buildBinaryNeighbors(csp);
|
|
136
|
+
const queue = [];
|
|
137
|
+
for (const c of csp.constraints) {
|
|
138
|
+
if (c.vars.length !== 2)
|
|
139
|
+
continue;
|
|
140
|
+
const [a, b] = c.vars;
|
|
141
|
+
if (a === undefined || b === undefined)
|
|
142
|
+
continue;
|
|
143
|
+
queue.push({ xi: a, xj: b, constraint: c });
|
|
144
|
+
queue.push({ xi: b, xj: a, constraint: c });
|
|
145
|
+
}
|
|
146
|
+
while (queue.length > 0) {
|
|
147
|
+
const arc = queue.shift();
|
|
148
|
+
if (!arc)
|
|
149
|
+
continue;
|
|
150
|
+
const { xi, xj, constraint } = arc;
|
|
151
|
+
if (revise(domains, xi, xj, constraint)) {
|
|
152
|
+
const di = domains.get(xi);
|
|
153
|
+
if (!di || di.length === 0)
|
|
154
|
+
return false;
|
|
155
|
+
const nbrs = neighbors.get(xi) ?? [];
|
|
156
|
+
for (const { other: xk, constraint: ck } of nbrs) {
|
|
157
|
+
if (xk === xj)
|
|
158
|
+
continue;
|
|
159
|
+
queue.push({ xi: xk, xj: xi, constraint: ck });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=ac3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ac3.js","sourceRoot":"","sources":["../../../src/runtime/csp/ac3.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CSP, CSPResult, BacktrackOptions } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Backtracking search. Si `useAC3` está activo, también aplica AC-3
|
|
4
|
+
* tras cada asignación (Maintaining Arc Consistency, MAC).
|
|
5
|
+
*
|
|
6
|
+
* Devuelve la primera solución encontrada o `null` si UNSAT. Para
|
|
7
|
+
* enumerar todas las soluciones, ver `allSolutions`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function backtrack<V, D>(csp: CSP<V, D>, opts?: BacktrackOptions): CSPResult<V, D>;
|
|
10
|
+
/**
|
|
11
|
+
* Enumera hasta `maxSolutions` soluciones del CSP. Útil para contar
|
|
12
|
+
* soluciones simétricas (e.g. n-queens completo, sudoku no-único).
|
|
13
|
+
*/
|
|
14
|
+
export declare function allSolutions<V, D>(csp: CSP<V, D>, maxSolutions?: number, opts?: BacktrackOptions): Array<Map<V, D>>;
|
|
15
|
+
//# sourceMappingURL=backtrack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backtrack.d.ts","sourceRoot":"","sources":["../../../src/runtime/csp/backtrack.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAc,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA8F5E;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,GAAE,gBAAqB,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CA4D5F;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAC/B,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EACd,YAAY,SAAM,EAClB,IAAI,GAAE,gBAAqB,GAC1B,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CA4ClB"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Backtracking search con heurísticas MRV + LCV + AC-3.
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Algoritmo clásico: asigna variables una a una, propaga restricciones
|
|
6
|
+
// y retrocede en cuanto detecta inconsistencia.
|
|
7
|
+
//
|
|
8
|
+
// Heurísticas:
|
|
9
|
+
// - MRV (Minimum Remaining Values): elige la variable cuyo dominio
|
|
10
|
+
// reducido sea menor. Tie-break: orden canónico.
|
|
11
|
+
// - LCV (Least Constraining Value): ordena los valores candidatos
|
|
12
|
+
// priorizando el que MENOS reduzca los dominios de los vecinos.
|
|
13
|
+
// - AC-3 inicial: contrae dominios antes de empezar y, si está activo,
|
|
14
|
+
// re-aplica AC-3 tras cada asignación (maintaining arc consistency).
|
|
15
|
+
//
|
|
16
|
+
// La búsqueda usa un único árbol con copias incrementales de dominios.
|
|
17
|
+
// Para problemas pequeños/medianos (sudoku, n-queens hasta ~20) es
|
|
18
|
+
// suficiente; para escalar, sustituir copias por trailing.
|
|
19
|
+
// ============================================================
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.backtrack = backtrack;
|
|
22
|
+
exports.allSolutions = allSolutions;
|
|
23
|
+
const ac3_1 = require("./ac3");
|
|
24
|
+
/**
|
|
25
|
+
* Comprueba si una asignación parcial respeta todas las restricciones
|
|
26
|
+
* cuyas variables ya están todas asignadas. Las restricciones con
|
|
27
|
+
* variables aún sin asignar se posponen.
|
|
28
|
+
*/
|
|
29
|
+
function consistent(csp, assignment) {
|
|
30
|
+
for (const c of csp.constraints) {
|
|
31
|
+
let allAssigned = true;
|
|
32
|
+
const vals = [];
|
|
33
|
+
for (const v of c.vars) {
|
|
34
|
+
const a = assignment.get(v);
|
|
35
|
+
if (a === undefined) {
|
|
36
|
+
allAssigned = false;
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
vals.push(a);
|
|
40
|
+
}
|
|
41
|
+
if (!allAssigned)
|
|
42
|
+
continue;
|
|
43
|
+
if (!c.predicate(vals))
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Selecciona la próxima variable a asignar.
|
|
50
|
+
* Con MRV: la de dominio reducido más pequeño (rompiendo empates por
|
|
51
|
+
* orden canónico de `csp.variables`). Sin MRV: la primera no asignada
|
|
52
|
+
* en orden canónico.
|
|
53
|
+
*/
|
|
54
|
+
function selectUnassigned(csp, domains, assignment, mrv) {
|
|
55
|
+
if (!mrv) {
|
|
56
|
+
for (const v of csp.variables) {
|
|
57
|
+
if (!assignment.has(v))
|
|
58
|
+
return v;
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
let best = null;
|
|
63
|
+
let bestSize = Infinity;
|
|
64
|
+
for (const v of csp.variables) {
|
|
65
|
+
if (assignment.has(v))
|
|
66
|
+
continue;
|
|
67
|
+
const d = domains.get(v);
|
|
68
|
+
const size = d ? d.length : Infinity;
|
|
69
|
+
if (size < bestSize) {
|
|
70
|
+
bestSize = size;
|
|
71
|
+
best = v;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return best;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Ordena los valores del dominio actual de `variable` según LCV:
|
|
78
|
+
* el valor que "menos restringe" a los vecinos va primero. La
|
|
79
|
+
* métrica usada es la suma de # de eliminaciones que provocaría
|
|
80
|
+
* en los dominios de los vecinos binarios.
|
|
81
|
+
*/
|
|
82
|
+
function orderValues(csp, domains, variable, lcv) {
|
|
83
|
+
const dom = domains.get(variable) ?? [];
|
|
84
|
+
if (!lcv)
|
|
85
|
+
return [...dom];
|
|
86
|
+
// Para cada valor, calcular cuánto restringiría a los vecinos
|
|
87
|
+
// binarios. Menos restricción → menor "cost".
|
|
88
|
+
const binNeighbors = [];
|
|
89
|
+
for (const c of csp.constraints) {
|
|
90
|
+
if (c.vars.length !== 2)
|
|
91
|
+
continue;
|
|
92
|
+
const [a, b] = c.vars;
|
|
93
|
+
if (a === variable && b !== undefined)
|
|
94
|
+
binNeighbors.push({ other: b, constraint: c });
|
|
95
|
+
else if (b === variable && a !== undefined)
|
|
96
|
+
binNeighbors.push({ other: a, constraint: c });
|
|
97
|
+
}
|
|
98
|
+
const scored = dom.map((val) => {
|
|
99
|
+
let cost = 0;
|
|
100
|
+
for (const { other, constraint } of binNeighbors) {
|
|
101
|
+
const otherDom = domains.get(other) ?? [];
|
|
102
|
+
for (const w of otherDom) {
|
|
103
|
+
// Alineación: el predicado espera tupla en orden de constraint.vars.
|
|
104
|
+
const [v0] = constraint.vars;
|
|
105
|
+
const tuple = v0 === variable ? [val, w] : [w, val];
|
|
106
|
+
if (!constraint.predicate(tuple))
|
|
107
|
+
cost++;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return { val, cost };
|
|
111
|
+
});
|
|
112
|
+
scored.sort((a, b) => a.cost - b.cost);
|
|
113
|
+
return scored.map((e) => e.val);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Backtracking search. Si `useAC3` está activo, también aplica AC-3
|
|
117
|
+
* tras cada asignación (Maintaining Arc Consistency, MAC).
|
|
118
|
+
*
|
|
119
|
+
* Devuelve la primera solución encontrada o `null` si UNSAT. Para
|
|
120
|
+
* enumerar todas las soluciones, ver `allSolutions`.
|
|
121
|
+
*/
|
|
122
|
+
function backtrack(csp, opts = {}) {
|
|
123
|
+
const useAC3 = opts.useAC3 ?? true;
|
|
124
|
+
const mrv = opts.mrv ?? true;
|
|
125
|
+
const lcv = opts.lcv ?? true;
|
|
126
|
+
const maxIter = opts.maxIterations ?? 1_000_000;
|
|
127
|
+
// Copia inicial de dominios.
|
|
128
|
+
const initialDomains = new Map();
|
|
129
|
+
for (const [k, v] of csp.domains)
|
|
130
|
+
initialDomains.set(k, [...v]);
|
|
131
|
+
// AC-3 inicial.
|
|
132
|
+
if (useAC3) {
|
|
133
|
+
if (!(0, ac3_1.ac3InPlace)(csp, initialDomains)) {
|
|
134
|
+
return { solution: null, iterations: 0, failures: 0 };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const stats = { iterations: 0, failures: 0 };
|
|
138
|
+
function recurse(assignment, domains) {
|
|
139
|
+
if (stats.iterations >= maxIter)
|
|
140
|
+
return null;
|
|
141
|
+
stats.iterations++;
|
|
142
|
+
if (assignment.size === csp.variables.length) {
|
|
143
|
+
// Todas asignadas, verificación final por seguridad.
|
|
144
|
+
if (consistent(csp, assignment))
|
|
145
|
+
return new Map(assignment);
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
const variable = selectUnassigned(csp, domains, assignment, mrv);
|
|
149
|
+
if (variable === null)
|
|
150
|
+
return null;
|
|
151
|
+
const orderedValues = orderValues(csp, domains, variable, lcv);
|
|
152
|
+
for (const value of orderedValues) {
|
|
153
|
+
assignment.set(variable, value);
|
|
154
|
+
if (consistent(csp, assignment)) {
|
|
155
|
+
// Domain snapshot para propagación.
|
|
156
|
+
const snapshot = new Map();
|
|
157
|
+
for (const [k, v] of domains)
|
|
158
|
+
snapshot.set(k, [...v]);
|
|
159
|
+
snapshot.set(variable, [value]);
|
|
160
|
+
let ok = true;
|
|
161
|
+
if (useAC3) {
|
|
162
|
+
ok = (0, ac3_1.ac3InPlace)(csp, snapshot);
|
|
163
|
+
}
|
|
164
|
+
if (ok) {
|
|
165
|
+
const result = recurse(assignment, snapshot);
|
|
166
|
+
if (result)
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
stats.failures++;
|
|
172
|
+
}
|
|
173
|
+
assignment.delete(variable);
|
|
174
|
+
}
|
|
175
|
+
stats.failures++;
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
const solution = recurse(new Map(), initialDomains);
|
|
179
|
+
return { solution, iterations: stats.iterations, failures: stats.failures };
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Enumera hasta `maxSolutions` soluciones del CSP. Útil para contar
|
|
183
|
+
* soluciones simétricas (e.g. n-queens completo, sudoku no-único).
|
|
184
|
+
*/
|
|
185
|
+
function allSolutions(csp, maxSolutions = 100, opts = {}) {
|
|
186
|
+
const useAC3 = opts.useAC3 ?? true;
|
|
187
|
+
const mrv = opts.mrv ?? true;
|
|
188
|
+
const lcv = opts.lcv ?? true;
|
|
189
|
+
const maxIter = opts.maxIterations ?? 5_000_000;
|
|
190
|
+
const solutions = [];
|
|
191
|
+
const initialDomains = new Map();
|
|
192
|
+
for (const [k, v] of csp.domains)
|
|
193
|
+
initialDomains.set(k, [...v]);
|
|
194
|
+
if (useAC3 && !(0, ac3_1.ac3InPlace)(csp, initialDomains))
|
|
195
|
+
return solutions;
|
|
196
|
+
let iterations = 0;
|
|
197
|
+
function recurse(assignment, domains) {
|
|
198
|
+
if (solutions.length >= maxSolutions)
|
|
199
|
+
return;
|
|
200
|
+
if (iterations >= maxIter)
|
|
201
|
+
return;
|
|
202
|
+
iterations++;
|
|
203
|
+
if (assignment.size === csp.variables.length) {
|
|
204
|
+
if (consistent(csp, assignment))
|
|
205
|
+
solutions.push(new Map(assignment));
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const variable = selectUnassigned(csp, domains, assignment, mrv);
|
|
209
|
+
if (variable === null)
|
|
210
|
+
return;
|
|
211
|
+
const orderedValues = orderValues(csp, domains, variable, lcv);
|
|
212
|
+
for (const value of orderedValues) {
|
|
213
|
+
if (solutions.length >= maxSolutions)
|
|
214
|
+
return;
|
|
215
|
+
assignment.set(variable, value);
|
|
216
|
+
if (consistent(csp, assignment)) {
|
|
217
|
+
const snapshot = new Map();
|
|
218
|
+
for (const [k, v] of domains)
|
|
219
|
+
snapshot.set(k, [...v]);
|
|
220
|
+
snapshot.set(variable, [value]);
|
|
221
|
+
let ok = true;
|
|
222
|
+
if (useAC3)
|
|
223
|
+
ok = (0, ac3_1.ac3InPlace)(csp, snapshot);
|
|
224
|
+
if (ok)
|
|
225
|
+
recurse(assignment, snapshot);
|
|
226
|
+
}
|
|
227
|
+
assignment.delete(variable);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
recurse(new Map(), initialDomains);
|
|
231
|
+
return solutions;
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=backtrack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backtrack.js","sourceRoot":"","sources":["../../../src/runtime/csp/backtrack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* k-coloreo de un grafo no dirigido.
|
|
3
|
+
*
|
|
4
|
+
* Variables: nodos del grafo.
|
|
5
|
+
* Dominios: {0, 1, ..., numColors-1}.
|
|
6
|
+
* Restricción binaria por arista (u, v): color(u) ≠ color(v).
|
|
7
|
+
*
|
|
8
|
+
* Devuelve un mapeo nodo → color o `null` si el grafo no es
|
|
9
|
+
* k-coloreable.
|
|
10
|
+
*/
|
|
11
|
+
export declare function graphColoring(graph: {
|
|
12
|
+
nodes: string[];
|
|
13
|
+
edges: Array<[string, string]>;
|
|
14
|
+
}, numColors: number): Map<string, number> | null;
|
|
15
|
+
/**
|
|
16
|
+
* N-queens. Modelo CSP estándar:
|
|
17
|
+
* Variables: row 0..n-1 (una reina por fila).
|
|
18
|
+
* Dominio: columna ∈ {0, ..., n-1}.
|
|
19
|
+
* Restricción binaria entre filas (i, j):
|
|
20
|
+
* col(i) ≠ col(j) (no misma columna)
|
|
21
|
+
* |col(i) - col(j)| ≠ |i-j| (no misma diagonal)
|
|
22
|
+
*
|
|
23
|
+
* Devuelve un array `cols` donde `cols[r]` es la columna de la
|
|
24
|
+
* reina en la fila r, o `null` si no hay solución (n=2, n=3).
|
|
25
|
+
*/
|
|
26
|
+
export declare function nQueens(n: number): number[] | null;
|
|
27
|
+
//# sourceMappingURL=builtins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtins.d.ts","sourceRoot":"","sources":["../../../src/runtime/csp/builtins.ts"],"names":[],"mappings":"AAUA;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,EAC1D,SAAS,EAAE,MAAM,GAChB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAgC5B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAmClD"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// CSPs predefinidos: graph coloring y N-queens.
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Ambos se modelan como CSPs binarios estándar para que AC-3 sea
|
|
6
|
+
// directamente aplicable.
|
|
7
|
+
// ============================================================
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.graphColoring = graphColoring;
|
|
10
|
+
exports.nQueens = nQueens;
|
|
11
|
+
const backtrack_1 = require("./backtrack");
|
|
12
|
+
/**
|
|
13
|
+
* k-coloreo de un grafo no dirigido.
|
|
14
|
+
*
|
|
15
|
+
* Variables: nodos del grafo.
|
|
16
|
+
* Dominios: {0, 1, ..., numColors-1}.
|
|
17
|
+
* Restricción binaria por arista (u, v): color(u) ≠ color(v).
|
|
18
|
+
*
|
|
19
|
+
* Devuelve un mapeo nodo → color o `null` si el grafo no es
|
|
20
|
+
* k-coloreable.
|
|
21
|
+
*/
|
|
22
|
+
function graphColoring(graph, numColors) {
|
|
23
|
+
if (numColors <= 0)
|
|
24
|
+
return null;
|
|
25
|
+
const colors = [];
|
|
26
|
+
for (let i = 0; i < numColors; i++)
|
|
27
|
+
colors.push(i);
|
|
28
|
+
const domains = new Map();
|
|
29
|
+
for (const n of graph.nodes)
|
|
30
|
+
domains.set(n, [...colors]);
|
|
31
|
+
const constraints = [];
|
|
32
|
+
// Deduplicar aristas (u,v) y (v,u).
|
|
33
|
+
const seen = new Set();
|
|
34
|
+
for (const [u, v] of graph.edges) {
|
|
35
|
+
if (u === v) {
|
|
36
|
+
// Self-loop ⇒ trivialmente UNSAT.
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const key = u < v ? `${u}|${v}` : `${v}|${u}`;
|
|
40
|
+
if (seen.has(key))
|
|
41
|
+
continue;
|
|
42
|
+
seen.add(key);
|
|
43
|
+
constraints.push({
|
|
44
|
+
vars: [u, v],
|
|
45
|
+
predicate: ([a, b]) => a !== b,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const csp = {
|
|
49
|
+
variables: [...graph.nodes],
|
|
50
|
+
domains,
|
|
51
|
+
constraints,
|
|
52
|
+
};
|
|
53
|
+
const result = (0, backtrack_1.backtrack)(csp);
|
|
54
|
+
return result.solution;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* N-queens. Modelo CSP estándar:
|
|
58
|
+
* Variables: row 0..n-1 (una reina por fila).
|
|
59
|
+
* Dominio: columna ∈ {0, ..., n-1}.
|
|
60
|
+
* Restricción binaria entre filas (i, j):
|
|
61
|
+
* col(i) ≠ col(j) (no misma columna)
|
|
62
|
+
* |col(i) - col(j)| ≠ |i-j| (no misma diagonal)
|
|
63
|
+
*
|
|
64
|
+
* Devuelve un array `cols` donde `cols[r]` es la columna de la
|
|
65
|
+
* reina en la fila r, o `null` si no hay solución (n=2, n=3).
|
|
66
|
+
*/
|
|
67
|
+
function nQueens(n) {
|
|
68
|
+
if (n <= 0)
|
|
69
|
+
return null;
|
|
70
|
+
if (n === 1)
|
|
71
|
+
return [0];
|
|
72
|
+
const variables = [];
|
|
73
|
+
for (let i = 0; i < n; i++)
|
|
74
|
+
variables.push(i);
|
|
75
|
+
const domains = new Map();
|
|
76
|
+
for (let i = 0; i < n; i++) {
|
|
77
|
+
const d = [];
|
|
78
|
+
for (let j = 0; j < n; j++)
|
|
79
|
+
d.push(j);
|
|
80
|
+
domains.set(i, d);
|
|
81
|
+
}
|
|
82
|
+
const constraints = [];
|
|
83
|
+
for (let i = 0; i < n; i++) {
|
|
84
|
+
for (let j = i + 1; j < n; j++) {
|
|
85
|
+
const rowDiff = j - i;
|
|
86
|
+
constraints.push({
|
|
87
|
+
vars: [i, j],
|
|
88
|
+
predicate: ([ci, cj]) => {
|
|
89
|
+
if (ci === undefined || cj === undefined)
|
|
90
|
+
return false;
|
|
91
|
+
if (ci === cj)
|
|
92
|
+
return false;
|
|
93
|
+
if (Math.abs(ci - cj) === rowDiff)
|
|
94
|
+
return false;
|
|
95
|
+
return true;
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const csp = { variables, domains, constraints };
|
|
101
|
+
const result = (0, backtrack_1.backtrack)(csp);
|
|
102
|
+
if (!result.solution)
|
|
103
|
+
return null;
|
|
104
|
+
const out = new Array(n).fill(-1);
|
|
105
|
+
for (const [row, col] of result.solution)
|
|
106
|
+
out[row] = col;
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=builtins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../../src/runtime/csp/builtins.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/csp/index.ts"],"names":[],"mappings":"AAWA,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ST CSP — barrel público.
|
|
4
|
+
// ============================================================
|
|
5
|
+
// API:
|
|
6
|
+
// ac3(csp) → { consistent, reducedDomains }
|
|
7
|
+
// backtrack(csp, opts?) → CSPResult (primera solución)
|
|
8
|
+
// allSolutions(csp, max?, opts?) → Map[] (enumeración)
|
|
9
|
+
// graphColoring(graph, k) → Map<nodo, color> | null
|
|
10
|
+
// nQueens(n) → number[] | null
|
|
11
|
+
// ============================================================
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.nQueens = exports.graphColoring = exports.allSolutions = exports.backtrack = exports.ac3InPlace = exports.ac3 = void 0;
|
|
14
|
+
var ac3_1 = require("./ac3");
|
|
15
|
+
Object.defineProperty(exports, "ac3", { enumerable: true, get: function () { return ac3_1.ac3; } });
|
|
16
|
+
Object.defineProperty(exports, "ac3InPlace", { enumerable: true, get: function () { return ac3_1.ac3InPlace; } });
|
|
17
|
+
var backtrack_1 = require("./backtrack");
|
|
18
|
+
Object.defineProperty(exports, "backtrack", { enumerable: true, get: function () { return backtrack_1.backtrack; } });
|
|
19
|
+
Object.defineProperty(exports, "allSolutions", { enumerable: true, get: function () { return backtrack_1.allSolutions; } });
|
|
20
|
+
var builtins_1 = require("./builtins");
|
|
21
|
+
Object.defineProperty(exports, "graphColoring", { enumerable: true, get: function () { return builtins_1.graphColoring; } });
|
|
22
|
+
Object.defineProperty(exports, "nQueens", { enumerable: true, get: function () { return builtins_1.nQueens; } });
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/csp/index.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,2BAA2B;AAC3B,+DAA+D;AAC/D,OAAO;AACP,mEAAmE;AACnE,kEAAkE;AAClE,6DAA6D;AAC7D,4DAA4D;AAC5D,oDAAoD;AACpD,+DAA+D;;;AAG/D,6BAAwC;AAA/B,0FAAA,GAAG,OAAA;AAAE,iGAAA,UAAU,OAAA;AACxB,yCAAsD;AAA7C,sGAAA,SAAS,OAAA;AAAE,yGAAA,YAAY,OAAA;AAChC,uCAAoD;AAA3C,yGAAA,aAAa,OAAA;AAAE,mGAAA,OAAO,OAAA"}
|