@stevenvo780/st-lang 4.2.0 → 4.3.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 -1
- package/dist/index.js.map +1 -1
- package/dist/lambda-calc/church.d.ts +8 -0
- package/dist/lambda-calc/church.d.ts.map +1 -0
- package/dist/lambda-calc/church.js +67 -0
- package/dist/lambda-calc/church.js.map +1 -0
- package/dist/lambda-calc/combinators.d.ts +8 -0
- package/dist/lambda-calc/combinators.d.ts.map +1 -0
- package/dist/lambda-calc/combinators.js +24 -0
- package/dist/lambda-calc/combinators.js.map +1 -0
- package/dist/lambda-calc/index.d.ts +8 -0
- package/dist/lambda-calc/index.d.ts.map +1 -0
- package/dist/lambda-calc/index.js +48 -0
- package/dist/lambda-calc/index.js.map +1 -0
- package/dist/lambda-calc/reduce.d.ts +18 -0
- package/dist/lambda-calc/reduce.d.ts.map +1 -0
- package/dist/lambda-calc/reduce.js +174 -0
- package/dist/lambda-calc/reduce.js.map +1 -0
- package/dist/lambda-calc/substitution.d.ts +6 -0
- package/dist/lambda-calc/substitution.d.ts.map +1 -0
- package/dist/lambda-calc/substitution.js +120 -0
- package/dist/lambda-calc/substitution.js.map +1 -0
- package/dist/lambda-calc/types.d.ts +19 -0
- package/dist/lambda-calc/types.d.ts.map +1 -0
- package/dist/lambda-calc/types.js +72 -0
- package/dist/lambda-calc/types.js.map +1 -0
- package/dist/profiles/intuitionistic-nj/formula.d.ts +19 -0
- package/dist/profiles/intuitionistic-nj/formula.d.ts.map +1 -0
- package/dist/profiles/intuitionistic-nj/formula.js +99 -0
- package/dist/profiles/intuitionistic-nj/formula.js.map +1 -0
- package/dist/profiles/intuitionistic-nj/index.d.ts +5 -0
- package/dist/profiles/intuitionistic-nj/index.d.ts.map +1 -0
- package/dist/profiles/intuitionistic-nj/index.js +24 -0
- package/dist/profiles/intuitionistic-nj/index.js.map +1 -0
- package/dist/profiles/intuitionistic-nj/kripke.d.ts +17 -0
- package/dist/profiles/intuitionistic-nj/kripke.d.ts.map +1 -0
- package/dist/profiles/intuitionistic-nj/kripke.js +206 -0
- package/dist/profiles/intuitionistic-nj/kripke.js.map +1 -0
- package/dist/profiles/intuitionistic-nj/prover.d.ts +13 -0
- package/dist/profiles/intuitionistic-nj/prover.d.ts.map +1 -0
- package/dist/profiles/intuitionistic-nj/prover.js +418 -0
- package/dist/profiles/intuitionistic-nj/prover.js.map +1 -0
- package/dist/profiles/intuitionistic-nj/types.d.ts +55 -0
- package/dist/profiles/intuitionistic-nj/types.d.ts.map +1 -0
- package/dist/profiles/intuitionistic-nj/types.js +21 -0
- package/dist/profiles/intuitionistic-nj/types.js.map +1 -0
- package/dist/profiles/many-valued/index.d.ts +39 -0
- package/dist/profiles/many-valued/index.d.ts.map +1 -0
- package/dist/profiles/many-valued/index.js +250 -0
- package/dist/profiles/many-valued/index.js.map +1 -0
- package/dist/profiles/modal-frame-axioms/formula.d.ts +23 -0
- package/dist/profiles/modal-frame-axioms/formula.d.ts.map +1 -0
- package/dist/profiles/modal-frame-axioms/formula.js +158 -0
- package/dist/profiles/modal-frame-axioms/formula.js.map +1 -0
- package/dist/profiles/modal-frame-axioms/index.d.ts +6 -0
- package/dist/profiles/modal-frame-axioms/index.d.ts.map +1 -0
- package/dist/profiles/modal-frame-axioms/index.js +41 -0
- package/dist/profiles/modal-frame-axioms/index.js.map +1 -0
- package/dist/profiles/modal-frame-axioms/systems.d.ts +29 -0
- package/dist/profiles/modal-frame-axioms/systems.d.ts.map +1 -0
- package/dist/profiles/modal-frame-axioms/systems.js +96 -0
- package/dist/profiles/modal-frame-axioms/systems.js.map +1 -0
- package/dist/profiles/modal-frame-axioms/tableau.d.ts +12 -0
- package/dist/profiles/modal-frame-axioms/tableau.d.ts.map +1 -0
- package/dist/profiles/modal-frame-axioms/tableau.js +299 -0
- package/dist/profiles/modal-frame-axioms/tableau.js.map +1 -0
- package/dist/profiles/modal-frame-axioms/types.d.ts +61 -0
- package/dist/profiles/modal-frame-axioms/types.d.ts.map +1 -0
- package/dist/profiles/modal-frame-axioms/types.js +27 -0
- package/dist/profiles/modal-frame-axioms/types.js.map +1 -0
- package/dist/profiles/substructural/index.d.ts +4 -0
- package/dist/profiles/substructural/index.d.ts.map +1 -0
- package/dist/profiles/substructural/index.js +22 -0
- package/dist/profiles/substructural/index.js.map +1 -0
- package/dist/profiles/substructural/prover.d.ts +13 -0
- package/dist/profiles/substructural/prover.d.ts.map +1 -0
- package/dist/profiles/substructural/prover.js +481 -0
- package/dist/profiles/substructural/prover.js.map +1 -0
- package/dist/profiles/substructural/types.d.ts +72 -0
- package/dist/profiles/substructural/types.d.ts.map +1 -0
- package/dist/profiles/substructural/types.js +27 -0
- package/dist/profiles/substructural/types.js.map +1 -0
- package/dist/runtime/abduction/entails.d.ts +21 -0
- package/dist/runtime/abduction/entails.d.ts.map +1 -0
- package/dist/runtime/abduction/entails.js +308 -0
- package/dist/runtime/abduction/entails.js.map +1 -0
- package/dist/runtime/abduction/find.d.ts +18 -0
- package/dist/runtime/abduction/find.d.ts.map +1 -0
- package/dist/runtime/abduction/find.js +202 -0
- package/dist/runtime/abduction/find.js.map +1 -0
- package/dist/runtime/abduction/index.d.ts +4 -0
- package/dist/runtime/abduction/index.d.ts.map +1 -0
- package/dist/runtime/abduction/index.js +26 -0
- package/dist/runtime/abduction/index.js.map +1 -0
- package/dist/runtime/abduction/types.d.ts +78 -0
- package/dist/runtime/abduction/types.d.ts.map +1 -0
- package/dist/runtime/abduction/types.js +23 -0
- package/dist/runtime/abduction/types.js.map +1 -0
- package/dist/runtime/bayesian/factor.d.ts +22 -0
- package/dist/runtime/bayesian/factor.d.ts.map +1 -0
- package/dist/runtime/bayesian/factor.js +249 -0
- package/dist/runtime/bayesian/factor.js.map +1 -0
- package/dist/runtime/bayesian/index.d.ts +3 -0
- package/dist/runtime/bayesian/index.d.ts.map +1 -0
- package/dist/runtime/bayesian/index.js +25 -0
- package/dist/runtime/bayesian/index.js.map +1 -0
- package/dist/runtime/bayesian/inference.d.ts +6 -0
- package/dist/runtime/bayesian/inference.d.ts.map +1 -0
- package/dist/runtime/bayesian/inference.js +260 -0
- package/dist/runtime/bayesian/inference.js.map +1 -0
- package/dist/runtime/bayesian/types.d.ts +19 -0
- package/dist/runtime/bayesian/types.d.ts.map +1 -0
- package/dist/runtime/bayesian/types.js +9 -0
- package/dist/runtime/bayesian/types.js.map +1 -0
- package/dist/runtime/bisimulation/index.d.ts +4 -0
- package/dist/runtime/bisimulation/index.d.ts.map +1 -0
- package/dist/runtime/bisimulation/index.js +21 -0
- package/dist/runtime/bisimulation/index.js.map +1 -0
- package/dist/runtime/bisimulation/operations.d.ts +40 -0
- package/dist/runtime/bisimulation/operations.d.ts.map +1 -0
- package/dist/runtime/bisimulation/operations.js +219 -0
- package/dist/runtime/bisimulation/operations.js.map +1 -0
- package/dist/runtime/bisimulation/paige-tarjan.d.ts +8 -0
- package/dist/runtime/bisimulation/paige-tarjan.d.ts.map +1 -0
- package/dist/runtime/bisimulation/paige-tarjan.js +199 -0
- package/dist/runtime/bisimulation/paige-tarjan.js.map +1 -0
- package/dist/runtime/bisimulation/types.d.ts +26 -0
- package/dist/runtime/bisimulation/types.d.ts.map +1 -0
- package/dist/runtime/bisimulation/types.js +22 -0
- package/dist/runtime/bisimulation/types.js.map +1 -0
- package/dist/runtime/fca/context.d.ts +46 -0
- package/dist/runtime/fca/context.d.ts.map +1 -0
- package/dist/runtime/fca/context.js +155 -0
- package/dist/runtime/fca/context.js.map +1 -0
- package/dist/runtime/fca/implications.d.ts +10 -0
- package/dist/runtime/fca/implications.d.ts.map +1 -0
- package/dist/runtime/fca/implications.js +33 -0
- package/dist/runtime/fca/implications.js.map +1 -0
- package/dist/runtime/fca/index.d.ts +6 -0
- package/dist/runtime/fca/index.d.ts.map +1 -0
- package/dist/runtime/fca/index.js +39 -0
- package/dist/runtime/fca/index.js.map +1 -0
- package/dist/runtime/fca/lattice.d.ts +10 -0
- package/dist/runtime/fca/lattice.d.ts.map +1 -0
- package/dist/runtime/fca/lattice.js +86 -0
- package/dist/runtime/fca/lattice.js.map +1 -0
- package/dist/runtime/fca/next-closure.d.ts +12 -0
- package/dist/runtime/fca/next-closure.d.ts.map +1 -0
- package/dist/runtime/fca/next-closure.js +99 -0
- package/dist/runtime/fca/next-closure.js.map +1 -0
- package/dist/runtime/fca/types.d.ts +31 -0
- package/dist/runtime/fca/types.d.ts.map +1 -0
- package/dist/runtime/fca/types.js +30 -0
- package/dist/runtime/fca/types.js.map +1 -0
- package/dist/runtime/proof-minify/index.d.ts +3 -0
- package/dist/runtime/proof-minify/index.d.ts.map +1 -0
- package/dist/runtime/proof-minify/index.js +13 -0
- package/dist/runtime/proof-minify/index.js.map +1 -0
- package/dist/runtime/proof-minify/minify.d.ts +13 -0
- package/dist/runtime/proof-minify/minify.d.ts.map +1 -0
- package/dist/runtime/proof-minify/minify.js +540 -0
- package/dist/runtime/proof-minify/minify.js.map +1 -0
- package/dist/runtime/proof-minify/types.d.ts +89 -0
- package/dist/runtime/proof-minify/types.d.ts.map +1 -0
- package/dist/runtime/proof-minify/types.js +16 -0
- package/dist/runtime/proof-minify/types.js.map +1 -0
- package/dist/runtime/symbolic-diff/constructors.d.ts +16 -0
- package/dist/runtime/symbolic-diff/constructors.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/constructors.js +75 -0
- package/dist/runtime/symbolic-diff/constructors.js.map +1 -0
- package/dist/runtime/symbolic-diff/differentiate.d.ts +22 -0
- package/dist/runtime/symbolic-diff/differentiate.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/differentiate.js +107 -0
- package/dist/runtime/symbolic-diff/differentiate.js.map +1 -0
- package/dist/runtime/symbolic-diff/evaluate.d.ts +3 -0
- package/dist/runtime/symbolic-diff/evaluate.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/evaluate.js +47 -0
- package/dist/runtime/symbolic-diff/evaluate.js.map +1 -0
- package/dist/runtime/symbolic-diff/index.d.ts +9 -0
- package/dist/runtime/symbolic-diff/index.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/index.js +34 -0
- package/dist/runtime/symbolic-diff/index.js.map +1 -0
- package/dist/runtime/symbolic-diff/parse.d.ts +16 -0
- package/dist/runtime/symbolic-diff/parse.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/parse.js +206 -0
- package/dist/runtime/symbolic-diff/parse.js.map +1 -0
- package/dist/runtime/symbolic-diff/simplify.d.ts +11 -0
- package/dist/runtime/symbolic-diff/simplify.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/simplify.js +214 -0
- package/dist/runtime/symbolic-diff/simplify.js.map +1 -0
- package/dist/runtime/symbolic-diff/stringify.d.ts +3 -0
- package/dist/runtime/symbolic-diff/stringify.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/stringify.js +69 -0
- package/dist/runtime/symbolic-diff/stringify.js.map +1 -0
- package/dist/runtime/symbolic-diff/types.d.ts +35 -0
- package/dist/runtime/symbolic-diff/types.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/types.js +9 -0
- package/dist/runtime/symbolic-diff/types.js.map +1 -0
- package/dist/runtime/term-rewriting/critical-pairs.d.ts +38 -0
- package/dist/runtime/term-rewriting/critical-pairs.d.ts.map +1 -0
- package/dist/runtime/term-rewriting/critical-pairs.js +109 -0
- package/dist/runtime/term-rewriting/critical-pairs.js.map +1 -0
- package/dist/runtime/term-rewriting/index.d.ts +9 -0
- package/dist/runtime/term-rewriting/index.d.ts.map +1 -0
- package/dist/runtime/term-rewriting/index.js +38 -0
- package/dist/runtime/term-rewriting/index.js.map +1 -0
- package/dist/runtime/term-rewriting/knuth-bendix.d.ts +29 -0
- package/dist/runtime/term-rewriting/knuth-bendix.d.ts.map +1 -0
- package/dist/runtime/term-rewriting/knuth-bendix.js +196 -0
- package/dist/runtime/term-rewriting/knuth-bendix.js.map +1 -0
- package/dist/runtime/term-rewriting/lpo.d.ts +17 -0
- package/dist/runtime/term-rewriting/lpo.d.ts.map +1 -0
- package/dist/runtime/term-rewriting/lpo.js +158 -0
- package/dist/runtime/term-rewriting/lpo.js.map +1 -0
- package/dist/runtime/term-rewriting/rewrite.d.ts +44 -0
- package/dist/runtime/term-rewriting/rewrite.d.ts.map +1 -0
- package/dist/runtime/term-rewriting/rewrite.js +189 -0
- package/dist/runtime/term-rewriting/rewrite.js.map +1 -0
- package/dist/runtime/term-rewriting/term-utils.d.ts +64 -0
- package/dist/runtime/term-rewriting/term-utils.d.ts.map +1 -0
- package/dist/runtime/term-rewriting/term-utils.js +360 -0
- package/dist/runtime/term-rewriting/term-utils.js.map +1 -0
- package/dist/runtime/term-rewriting/types.d.ts +66 -0
- package/dist/runtime/term-rewriting/types.d.ts.map +1 -0
- package/dist/runtime/term-rewriting/types.js +21 -0
- package/dist/runtime/term-rewriting/types.js.map +1 -0
- package/dist/tests/abduction/abduction.test.d.ts +2 -0
- package/dist/tests/abduction/abduction.test.d.ts.map +1 -0
- package/dist/tests/abduction/abduction.test.js +380 -0
- package/dist/tests/abduction/abduction.test.js.map +1 -0
- package/dist/tests/bayesian/bayesian.test.d.ts +2 -0
- package/dist/tests/bayesian/bayesian.test.d.ts.map +1 -0
- package/dist/tests/bayesian/bayesian.test.js +328 -0
- package/dist/tests/bayesian/bayesian.test.js.map +1 -0
- package/dist/tests/bisimulation/paige-tarjan.test.d.ts +2 -0
- package/dist/tests/bisimulation/paige-tarjan.test.d.ts.map +1 -0
- package/dist/tests/bisimulation/paige-tarjan.test.js +254 -0
- package/dist/tests/bisimulation/paige-tarjan.test.js.map +1 -0
- package/dist/tests/fca/fca.test.d.ts +2 -0
- package/dist/tests/fca/fca.test.d.ts.map +1 -0
- package/dist/tests/fca/fca.test.js +317 -0
- package/dist/tests/fca/fca.test.js.map +1 -0
- package/dist/tests/intuitionistic-nj/nj.test.d.ts +2 -0
- package/dist/tests/intuitionistic-nj/nj.test.d.ts.map +1 -0
- package/dist/tests/intuitionistic-nj/nj.test.js +216 -0
- package/dist/tests/intuitionistic-nj/nj.test.js.map +1 -0
- package/dist/tests/lambda-calc/lambda-calc.test.d.ts +2 -0
- package/dist/tests/lambda-calc/lambda-calc.test.d.ts.map +1 -0
- package/dist/tests/lambda-calc/lambda-calc.test.js +164 -0
- package/dist/tests/lambda-calc/lambda-calc.test.js.map +1 -0
- package/dist/tests/many-valued/many-valued.test.d.ts +2 -0
- package/dist/tests/many-valued/many-valued.test.d.ts.map +1 -0
- package/dist/tests/many-valued/many-valued.test.js +150 -0
- package/dist/tests/many-valued/many-valued.test.js.map +1 -0
- package/dist/tests/modal-frame-axioms/frame-axioms.test.d.ts +2 -0
- package/dist/tests/modal-frame-axioms/frame-axioms.test.d.ts.map +1 -0
- package/dist/tests/modal-frame-axioms/frame-axioms.test.js +236 -0
- package/dist/tests/modal-frame-axioms/frame-axioms.test.js.map +1 -0
- package/dist/tests/proof-minify/minify.test.d.ts +2 -0
- package/dist/tests/proof-minify/minify.test.d.ts.map +1 -0
- package/dist/tests/proof-minify/minify.test.js +281 -0
- package/dist/tests/proof-minify/minify.test.js.map +1 -0
- package/dist/tests/substructural/prover.test.d.ts +2 -0
- package/dist/tests/substructural/prover.test.d.ts.map +1 -0
- package/dist/tests/substructural/prover.test.js +271 -0
- package/dist/tests/substructural/prover.test.js.map +1 -0
- package/dist/tests/symbolic-diff/symbolic-diff.test.d.ts +2 -0
- package/dist/tests/symbolic-diff/symbolic-diff.test.d.ts.map +1 -0
- package/dist/tests/symbolic-diff/symbolic-diff.test.js +278 -0
- package/dist/tests/symbolic-diff/symbolic-diff.test.js.map +1 -0
- package/dist/tests/term-rewriting/critical-pairs.test.d.ts +2 -0
- package/dist/tests/term-rewriting/critical-pairs.test.d.ts.map +1 -0
- package/dist/tests/term-rewriting/critical-pairs.test.js +34 -0
- package/dist/tests/term-rewriting/critical-pairs.test.js.map +1 -0
- package/dist/tests/term-rewriting/knuth-bendix.test.d.ts +2 -0
- package/dist/tests/term-rewriting/knuth-bendix.test.d.ts.map +1 -0
- package/dist/tests/term-rewriting/knuth-bendix.test.js +94 -0
- package/dist/tests/term-rewriting/knuth-bendix.test.js.map +1 -0
- package/dist/tests/term-rewriting/lpo.test.d.ts +2 -0
- package/dist/tests/term-rewriting/lpo.test.d.ts.map +1 -0
- package/dist/tests/term-rewriting/lpo.test.js +57 -0
- package/dist/tests/term-rewriting/lpo.test.js.map +1 -0
- package/dist/tests/term-rewriting/rewrite.test.d.ts +2 -0
- package/dist/tests/term-rewriting/rewrite.test.d.ts.map +1 -0
- package/dist/tests/term-rewriting/rewrite.test.js +56 -0
- package/dist/tests/term-rewriting/rewrite.test.js.map +1 -0
- package/dist/tests/term-rewriting/term-utils.test.d.ts +2 -0
- package/dist/tests/term-rewriting/term-utils.test.d.ts.map +1 -0
- package/dist/tests/term-rewriting/term-utils.test.js +58 -0
- package/dist/tests/term-rewriting/term-utils.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ST Term Rewriting — Knuth-Bendix Completion
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// KB completion transforma un conjunto de ecuaciones E en un TRS
|
|
7
|
+
// terminante y confluente (cuando existe). Procedimiento clásico:
|
|
8
|
+
//
|
|
9
|
+
// 1. Orientar cada ecuación s = t en regla l → r usando una
|
|
10
|
+
// reducción ordering > (LPO acá).
|
|
11
|
+
// 2. Inter-reducir las reglas (simplify) para mantener minimalidad.
|
|
12
|
+
// 3. Calcular critical pairs.
|
|
13
|
+
// 4. Por cada CP (a, b):
|
|
14
|
+
// a' = normalize(a)
|
|
15
|
+
// b' = normalize(b)
|
|
16
|
+
// si a' ≡ b' → joinable, descartar.
|
|
17
|
+
// si no → agregar como nueva regla orientada.
|
|
18
|
+
// 5. Volver al paso 2 hasta que no haya nuevos CPs ⇒ completed.
|
|
19
|
+
//
|
|
20
|
+
// KB es **semi-decidible**: puede no terminar (orientar nuevas
|
|
21
|
+
// ecuaciones puede no ser posible, o el espacio crecer sin cota).
|
|
22
|
+
// Por eso exigimos `maxSteps`.
|
|
23
|
+
//
|
|
24
|
+
// Implementación: estrategia simple "outer loop", no la versión
|
|
25
|
+
// optimizada de Huet con prioridades. Suficiente para teorías
|
|
26
|
+
// pequeñas de testing (grupos, conmutatividad-a-medias, etc.).
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.orient = orient;
|
|
29
|
+
exports.knuthBendixCompletion = knuthBendixCompletion;
|
|
30
|
+
exports.makeTRS = makeTRS;
|
|
31
|
+
const term_utils_1 = require("./term-utils");
|
|
32
|
+
const rewrite_1 = require("./rewrite");
|
|
33
|
+
const critical_pairs_1 = require("./critical-pairs");
|
|
34
|
+
const lpo_1 = require("./lpo");
|
|
35
|
+
/**
|
|
36
|
+
* Orienta una ecuación s = t a regla l → r usando LPO.
|
|
37
|
+
*
|
|
38
|
+
* - Si s >LPO t: devuelve s → t.
|
|
39
|
+
* - Si t >LPO s: devuelve t → s.
|
|
40
|
+
* - Si son incomparables: null (KB falla aquí, el caller debe abortar
|
|
41
|
+
* o pedir al user una precedencia distinta).
|
|
42
|
+
* - Si son iguales: ecuación trivial, devuelve null sin error.
|
|
43
|
+
*/
|
|
44
|
+
function orient(s, t, precedence) {
|
|
45
|
+
const cmp = (0, lpo_1.lpoCompare)(s, t, precedence);
|
|
46
|
+
if (cmp === 'eq')
|
|
47
|
+
return null;
|
|
48
|
+
if (cmp === 'gt')
|
|
49
|
+
return { lhs: s, rhs: t };
|
|
50
|
+
if (cmp === 'lt')
|
|
51
|
+
return { lhs: t, rhs: s };
|
|
52
|
+
// incomparable
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* ¿La regla `r` es subsumida (redundante) dada la lista `rules`?
|
|
57
|
+
*
|
|
58
|
+
* Una regla l → r es redundante si normalize(l, rules \ {r}) ya
|
|
59
|
+
* llega a r. En particular, si su LHS es reducible por otra regla,
|
|
60
|
+
* la regla nunca dispara y puede eliminarse.
|
|
61
|
+
*/
|
|
62
|
+
function isRedundant(rule, rules) {
|
|
63
|
+
const others = rules.filter((x) => x !== rule);
|
|
64
|
+
const reducedLhs = (0, rewrite_1.normalize)(rule.lhs, others, 1000);
|
|
65
|
+
if (!(0, term_utils_1.termEquals)(reducedLhs, rule.lhs))
|
|
66
|
+
return true;
|
|
67
|
+
const reducedRhs = (0, rewrite_1.normalize)(rule.rhs, rules, 1000);
|
|
68
|
+
if ((0, term_utils_1.termEquals)(reducedLhs, reducedRhs)) {
|
|
69
|
+
// ambos lados convergen sin la regla
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Inter-reduce: simplifica los RHS y elimina reglas redundantes.
|
|
76
|
+
*/
|
|
77
|
+
function interReduce(rules) {
|
|
78
|
+
let current = rules.slice();
|
|
79
|
+
let changed = true;
|
|
80
|
+
let guard = 0;
|
|
81
|
+
while (changed && guard++ < 50) {
|
|
82
|
+
changed = false;
|
|
83
|
+
// Normalizar RHS de cada regla con las demás
|
|
84
|
+
const nextRules = [];
|
|
85
|
+
for (const r of current) {
|
|
86
|
+
const others = current.filter((x) => x !== r);
|
|
87
|
+
const newRhs = (0, rewrite_1.normalize)(r.rhs, others, 1000);
|
|
88
|
+
if (!(0, term_utils_1.termEquals)(newRhs, r.rhs)) {
|
|
89
|
+
changed = true;
|
|
90
|
+
nextRules.push({ lhs: r.lhs, rhs: newRhs });
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
nextRules.push(r);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Quitar reglas redundantes
|
|
97
|
+
const filtered = nextRules.filter((r) => !isRedundant(r, nextRules));
|
|
98
|
+
if (filtered.length !== nextRules.length)
|
|
99
|
+
changed = true;
|
|
100
|
+
current = filtered;
|
|
101
|
+
}
|
|
102
|
+
return current;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Detecta duplicados sintácticos.
|
|
106
|
+
*/
|
|
107
|
+
function ruleAlreadyPresent(rule, rules) {
|
|
108
|
+
return rules.some((r) => (0, term_utils_1.termEquals)(r.lhs, rule.lhs) && (0, term_utils_1.termEquals)(r.rhs, rule.rhs));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Knuth-Bendix completion.
|
|
112
|
+
*
|
|
113
|
+
* `initialRules` se interpretan como ecuaciones orientadas. La
|
|
114
|
+
* orientación inicial se respeta si ya está bien dirigida según
|
|
115
|
+
* la precedencia; si no, se re-orienta.
|
|
116
|
+
*
|
|
117
|
+
* Devuelve un `KBResult` con:
|
|
118
|
+
* - `completed: true` si convergió.
|
|
119
|
+
* - `completed: false` si se excedió `maxSteps` o un CP no-joinable
|
|
120
|
+
* no pudo orientarse (LPO incomparable).
|
|
121
|
+
*/
|
|
122
|
+
function knuthBendixCompletion(initialRules, opts = {}) {
|
|
123
|
+
const precedence = opts.precedence ?? new Map();
|
|
124
|
+
const maxSteps = opts.maxSteps ?? 100;
|
|
125
|
+
// Re-orientar las reglas iniciales con LPO. Si una ecuación no
|
|
126
|
+
// es trivial (lhs ≠ rhs) y LPO no la decide, KB falla de
|
|
127
|
+
// inmediato: la orientabilidad de las ecuaciones iniciales es un
|
|
128
|
+
// pre-requisito.
|
|
129
|
+
let rules = [];
|
|
130
|
+
for (const r of initialRules) {
|
|
131
|
+
if ((0, term_utils_1.termEquals)(r.lhs, r.rhs))
|
|
132
|
+
continue; // ecuación trivial
|
|
133
|
+
const oriented = orient(r.lhs, r.rhs, precedence);
|
|
134
|
+
if (oriented === null) {
|
|
135
|
+
return {
|
|
136
|
+
trs: { rules },
|
|
137
|
+
completed: false,
|
|
138
|
+
criticalPairs: 0,
|
|
139
|
+
steps: 0,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
if (!ruleAlreadyPresent(oriented, rules)) {
|
|
143
|
+
rules.push(oriented);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
let cpCount = 0;
|
|
147
|
+
let step;
|
|
148
|
+
for (step = 0; step < maxSteps; step++) {
|
|
149
|
+
rules = interReduce(rules);
|
|
150
|
+
const cps = (0, critical_pairs_1.allCriticalPairs)(rules);
|
|
151
|
+
cpCount += cps.length;
|
|
152
|
+
let addedAny = false;
|
|
153
|
+
for (const cp of cps) {
|
|
154
|
+
const a = (0, rewrite_1.normalize)(cp.lhs, rules);
|
|
155
|
+
const b = (0, rewrite_1.normalize)(cp.rhs, rules);
|
|
156
|
+
if ((0, term_utils_1.termEquals)(a, b))
|
|
157
|
+
continue; // joinable
|
|
158
|
+
const oriented = orient(a, b, precedence);
|
|
159
|
+
if (oriented === null) {
|
|
160
|
+
// CP no joinable y no orientable ⇒ KB falla.
|
|
161
|
+
return {
|
|
162
|
+
trs: { rules },
|
|
163
|
+
completed: false,
|
|
164
|
+
criticalPairs: cpCount,
|
|
165
|
+
steps: step + 1,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
if (!ruleAlreadyPresent(oriented, rules)) {
|
|
169
|
+
rules.push(oriented);
|
|
170
|
+
addedAny = true;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (!addedAny) {
|
|
174
|
+
// No se añadió ninguna regla nueva ⇒ converged.
|
|
175
|
+
return {
|
|
176
|
+
trs: { rules },
|
|
177
|
+
completed: true,
|
|
178
|
+
criticalPairs: cpCount,
|
|
179
|
+
steps: step + 1,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
trs: { rules },
|
|
185
|
+
completed: false,
|
|
186
|
+
criticalPairs: cpCount,
|
|
187
|
+
steps: step,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Sugar: construye un TRS plano.
|
|
192
|
+
*/
|
|
193
|
+
function makeTRS(rules) {
|
|
194
|
+
return { rules };
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=knuth-bendix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knuth-bendix.js","sourceRoot":"","sources":["../../../src/runtime/term-rewriting/knuth-bendix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Term } from './types';
|
|
2
|
+
export type LPOComparison = 'gt' | 'lt' | 'eq' | 'inc';
|
|
3
|
+
/**
|
|
4
|
+
* LPO comparison "rica": incluye 'inc' (incomparable).
|
|
5
|
+
*/
|
|
6
|
+
export declare function lpoCompare(t1: Term, t2: Term, precedence: Map<string, number>): LPOComparison;
|
|
7
|
+
/**
|
|
8
|
+
* API pública compacta: devuelve -1 | 0 | 1.
|
|
9
|
+
*
|
|
10
|
+
* -1 si t1 <LPO t2
|
|
11
|
+
* 0 si iguales o incomparables
|
|
12
|
+
* +1 si t1 >LPO t2
|
|
13
|
+
*
|
|
14
|
+
* Para distinguir incomparable vs igual, usar `lpoCompare`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function lpo(t1: Term, t2: Term, precedence: Map<string, number>): -1 | 0 | 1;
|
|
17
|
+
//# sourceMappingURL=lpo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lpo.d.ts","sourceRoot":"","sources":["../../../src/runtime/term-rewriting/lpo.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAGpC,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AAsBvD;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa,CA4D7F;AAwBD;;;;;;;;GAQG;AACH,wBAAgB,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAKnF"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ST Term Rewriting — Lexicographic Path Order (LPO)
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// LPO es una de las técnicas estándar para probar terminación de
|
|
7
|
+
// TRSs. Dada una precedencia >F sobre símbolos de función,
|
|
8
|
+
// extiende a un orden bien-fundado >LPO sobre términos.
|
|
9
|
+
//
|
|
10
|
+
// Definición (Dershowitz, 1982):
|
|
11
|
+
//
|
|
12
|
+
// s = f(s₁..sₙ) >LPO t sii alguno de:
|
|
13
|
+
//
|
|
14
|
+
// (LPO1) algún sᵢ ≥LPO t
|
|
15
|
+
// (LPO2) t = g(t₁..tₘ), f >F g, y s >LPO tⱼ para todo j
|
|
16
|
+
// (LPO3) t = f(t₁..tₘ), s >LPO tⱼ para todo j, y
|
|
17
|
+
// (s₁..sₙ) >LPO,lex (t₁..tₘ)
|
|
18
|
+
//
|
|
19
|
+
// Variables: x >LPO t sii x = t y t es variable (caso trivial).
|
|
20
|
+
// En general, una variable no domina a nada que no sea ella misma.
|
|
21
|
+
//
|
|
22
|
+
// Devolvemos -1 / 0 / 1 estilo comparator:
|
|
23
|
+
// -1 si t1 <LPO t2
|
|
24
|
+
// 0 si t1 ≡LPO t2 (estructuralmente iguales)
|
|
25
|
+
// +1 si t1 >LPO t2
|
|
26
|
+
// NaN (sentinel = 0 acá) si incomparables — convención: 0 también.
|
|
27
|
+
//
|
|
28
|
+
// Para diferenciar "iguales" de "incomparables" exponemos `lpoCompare`
|
|
29
|
+
// que devuelve `'gt' | 'lt' | 'eq' | 'inc'`. `lpo` colapsa inc→0.
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.lpoCompare = lpoCompare;
|
|
32
|
+
exports.lpo = lpo;
|
|
33
|
+
const term_utils_1 = require("./term-utils");
|
|
34
|
+
function precOf(name, precedence) {
|
|
35
|
+
return precedence.get(name) ?? 0;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Comparación de precedencia de símbolos de función.
|
|
39
|
+
*
|
|
40
|
+
* Si ambos tienen la misma prioridad, compara por nombre para
|
|
41
|
+
* romper empates de forma determinista (necesario para que LPO
|
|
42
|
+
* sea total sobre términos cerrados).
|
|
43
|
+
*/
|
|
44
|
+
function compareSymbols(a, b, precedence) {
|
|
45
|
+
const pa = precOf(a, precedence);
|
|
46
|
+
const pb = precOf(b, precedence);
|
|
47
|
+
if (pa > pb)
|
|
48
|
+
return 1;
|
|
49
|
+
if (pa < pb)
|
|
50
|
+
return -1;
|
|
51
|
+
if (a === b)
|
|
52
|
+
return 0;
|
|
53
|
+
return a < b ? -1 : 1;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* LPO comparison "rica": incluye 'inc' (incomparable).
|
|
57
|
+
*/
|
|
58
|
+
function lpoCompare(t1, t2, precedence) {
|
|
59
|
+
if ((0, term_utils_1.termEquals)(t1, t2))
|
|
60
|
+
return 'eq';
|
|
61
|
+
// Caso variable
|
|
62
|
+
if (t1.kind === 'var' && t2.kind === 'var') {
|
|
63
|
+
return 'inc'; // variables distintas son incomparables
|
|
64
|
+
}
|
|
65
|
+
if (t1.kind === 'var') {
|
|
66
|
+
// x >LPO t solo si x ocurre en t (improper subterm). Estándar:
|
|
67
|
+
// x ≮LPO t para todo t excepto x. Devolvemos 'lt' si x aparece en t2.
|
|
68
|
+
return occursVar(t1.name, t2) ? 'lt' : 'inc';
|
|
69
|
+
}
|
|
70
|
+
if (t2.kind === 'var') {
|
|
71
|
+
return occursVar(t2.name, t1) ? 'gt' : 'inc';
|
|
72
|
+
}
|
|
73
|
+
// Ambos func: t1 = f(s₁..sₙ), t2 = g(t₁..tₘ)
|
|
74
|
+
const f = t1.name;
|
|
75
|
+
const g = t2.name;
|
|
76
|
+
const ss = t1.args;
|
|
77
|
+
const ts = t2.args;
|
|
78
|
+
// (LPO1): algún sᵢ ≥LPO t2 ⇒ t1 >LPO t2
|
|
79
|
+
for (const si of ss) {
|
|
80
|
+
const cmp = lpoCompare(si, t2, precedence);
|
|
81
|
+
if (cmp === 'gt' || cmp === 'eq')
|
|
82
|
+
return 'gt';
|
|
83
|
+
}
|
|
84
|
+
// Simétrico para t2: si algún tⱼ ≥LPO t1, entonces t2 >LPO t1
|
|
85
|
+
for (const tj of ts) {
|
|
86
|
+
const cmp = lpoCompare(tj, t1, precedence);
|
|
87
|
+
if (cmp === 'gt' || cmp === 'eq')
|
|
88
|
+
return 'lt';
|
|
89
|
+
}
|
|
90
|
+
const cmpFG = compareSymbols(f, g, precedence);
|
|
91
|
+
// (LPO2): f >F g y t1 >LPO tⱼ para todo j
|
|
92
|
+
if (cmpFG === 1) {
|
|
93
|
+
if (ts.every((tj) => lpoCompare(t1, tj, precedence) === 'gt'))
|
|
94
|
+
return 'gt';
|
|
95
|
+
return 'inc';
|
|
96
|
+
}
|
|
97
|
+
if (cmpFG === -1) {
|
|
98
|
+
if (ss.every((si) => lpoCompare(t2, si, precedence) === 'gt'))
|
|
99
|
+
return 'lt';
|
|
100
|
+
return 'inc';
|
|
101
|
+
}
|
|
102
|
+
// (LPO3): f = g (mismo símbolo y misma aridad, si no son incomparables)
|
|
103
|
+
if (ss.length !== ts.length)
|
|
104
|
+
return 'inc';
|
|
105
|
+
// s >LPO tⱼ para todo j
|
|
106
|
+
const allGt = ts.every((tj) => lpoCompare(t1, tj, precedence) === 'gt');
|
|
107
|
+
if (!allGt) {
|
|
108
|
+
// chequear simétrico para 'lt'
|
|
109
|
+
const allLt = ss.every((si) => lpoCompare(t2, si, precedence) === 'gt');
|
|
110
|
+
if (allLt)
|
|
111
|
+
return lexCompare(ts, ss, precedence) === 'gt' ? 'lt' : 'inc';
|
|
112
|
+
return 'inc';
|
|
113
|
+
}
|
|
114
|
+
// Comparación lexicográfica de argumentos
|
|
115
|
+
return lexCompare(ss, ts, precedence);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Comparación lexicográfica de tuplas de términos.
|
|
119
|
+
*/
|
|
120
|
+
function lexCompare(ss, ts, precedence) {
|
|
121
|
+
const n = Math.min(ss.length, ts.length);
|
|
122
|
+
for (let i = 0; i < n; i++) {
|
|
123
|
+
const si = ss[i];
|
|
124
|
+
const ti = ts[i];
|
|
125
|
+
if (si === undefined || ti === undefined)
|
|
126
|
+
continue;
|
|
127
|
+
const cmp = lpoCompare(si, ti, precedence);
|
|
128
|
+
if (cmp === 'eq')
|
|
129
|
+
continue;
|
|
130
|
+
return cmp;
|
|
131
|
+
}
|
|
132
|
+
if (ss.length === ts.length)
|
|
133
|
+
return 'eq';
|
|
134
|
+
return ss.length > ts.length ? 'gt' : 'lt';
|
|
135
|
+
}
|
|
136
|
+
function occursVar(name, t) {
|
|
137
|
+
if (t.kind === 'var')
|
|
138
|
+
return t.name === name;
|
|
139
|
+
return t.args.some((a) => occursVar(name, a));
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* API pública compacta: devuelve -1 | 0 | 1.
|
|
143
|
+
*
|
|
144
|
+
* -1 si t1 <LPO t2
|
|
145
|
+
* 0 si iguales o incomparables
|
|
146
|
+
* +1 si t1 >LPO t2
|
|
147
|
+
*
|
|
148
|
+
* Para distinguir incomparable vs igual, usar `lpoCompare`.
|
|
149
|
+
*/
|
|
150
|
+
function lpo(t1, t2, precedence) {
|
|
151
|
+
const r = lpoCompare(t1, t2, precedence);
|
|
152
|
+
if (r === 'gt')
|
|
153
|
+
return 1;
|
|
154
|
+
if (r === 'lt')
|
|
155
|
+
return -1;
|
|
156
|
+
return 0;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=lpo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lpo.js","sourceRoot":"","sources":["../../../src/runtime/term-rewriting/lpo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { RewriteRule, Term } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Intenta aplicar exactamente un paso de reescritura.
|
|
4
|
+
*
|
|
5
|
+
* Devuelve el término reducido o null si no hay redex.
|
|
6
|
+
*
|
|
7
|
+
* Política de selección:
|
|
8
|
+
* - Recorre t en pre-order (raíz primero, luego argumentos).
|
|
9
|
+
* - Para cada nodo prueba las reglas en orden.
|
|
10
|
+
* - El primer match aplica.
|
|
11
|
+
*/
|
|
12
|
+
export declare function rewriteStep(t: Term, rules: RewriteRule[]): Term | null;
|
|
13
|
+
/**
|
|
14
|
+
* Normaliza t aplicando reglas hasta punto fijo.
|
|
15
|
+
*
|
|
16
|
+
* @param maxSteps Cota de seguridad para sistemas no terminantes.
|
|
17
|
+
* Si se excede, devuelve el último estado alcanzado.
|
|
18
|
+
*
|
|
19
|
+
* Nota: la confluencia se asume responsabilidad del caller — si el
|
|
20
|
+
* TRS no es confluente, distintas estrategias pueden dar distintas
|
|
21
|
+
* FN. Acá fijamos leftmost-outermost.
|
|
22
|
+
*/
|
|
23
|
+
export declare function normalize(t: Term, rules: RewriteRule[], maxSteps?: number): Term;
|
|
24
|
+
/**
|
|
25
|
+
* Lista todas las posiciones (caminos) en t. Una posición es un
|
|
26
|
+
* array de índices: [] = raíz, [0] = primer argumento, [0, 1] =
|
|
27
|
+
* segundo argumento del primer argumento, etc.
|
|
28
|
+
*
|
|
29
|
+
* Útil para enumerar redexes y para calcular critical pairs.
|
|
30
|
+
*/
|
|
31
|
+
export declare function allPositions(t: Term, prefix?: number[]): number[][];
|
|
32
|
+
/**
|
|
33
|
+
* Obtiene el subtérmino en la posición indicada.
|
|
34
|
+
* Devuelve null si la posición no existe.
|
|
35
|
+
*/
|
|
36
|
+
export declare function subtermAt(t: Term, pos: readonly number[]): Term | null;
|
|
37
|
+
/**
|
|
38
|
+
* Reemplaza el subtérmino en la posición indicada por `replacement`.
|
|
39
|
+
*
|
|
40
|
+
* Devuelve un término nuevo (sin mutar t). Si la posición no existe,
|
|
41
|
+
* devuelve t sin cambios.
|
|
42
|
+
*/
|
|
43
|
+
export declare function replaceAt(t: Term, pos: readonly number[], replacement: Term): Term;
|
|
44
|
+
//# sourceMappingURL=rewrite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewrite.d.ts","sourceRoot":"","sources":["../../../src/runtime/term-rewriting/rewrite.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAcjD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,GAAG,IAAI,CAOtE;AAqCD;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,QAAQ,GAAE,MAAc,GAAG,IAAI,CAYvF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,EAAE,CAiBvE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAStE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,GAAG,IAAI,CAyBlF"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ST Term Rewriting — Reescritura y normalización
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Aplicación de reglas l → r sobre un término t.
|
|
7
|
+
//
|
|
8
|
+
// Estrategia: leftmost-outermost. Se recorre t en pre-order;
|
|
9
|
+
// para cada subtérmino se intenta match contra el LHS de alguna
|
|
10
|
+
// regla. El primer match gana. Esto es suficiente para sistemas
|
|
11
|
+
// confluentes (todas las estrategias llegan a la misma FN), y
|
|
12
|
+
// para los terminantes garantiza progreso.
|
|
13
|
+
//
|
|
14
|
+
// `normalize` itera `rewriteStep` hasta punto fijo o hasta
|
|
15
|
+
// `maxSteps` (default 10_000) — la cota evita ciclos cuando el
|
|
16
|
+
// sistema no es terminante.
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.rewriteStep = rewriteStep;
|
|
19
|
+
exports.normalize = normalize;
|
|
20
|
+
exports.allPositions = allPositions;
|
|
21
|
+
exports.subtermAt = subtermAt;
|
|
22
|
+
exports.replaceAt = replaceAt;
|
|
23
|
+
const term_utils_1 = require("./term-utils");
|
|
24
|
+
/**
|
|
25
|
+
* Cota de tamaño máximo del término durante normalización.
|
|
26
|
+
*
|
|
27
|
+
* Si el sistema no es terminante, el término puede crecer sin parar
|
|
28
|
+
* y aún antes de agotar `maxSteps` puede agotar la pila al recorrer.
|
|
29
|
+
* Esta cota corta el bucle cuando el término supera un tamaño "absurdo"
|
|
30
|
+
* (rara vez un término legítimo de KB supera ~10k nodos en teorías
|
|
31
|
+
* pequeñas).
|
|
32
|
+
*/
|
|
33
|
+
const MAX_TERM_SIZE = 5000;
|
|
34
|
+
/**
|
|
35
|
+
* Intenta aplicar exactamente un paso de reescritura.
|
|
36
|
+
*
|
|
37
|
+
* Devuelve el término reducido o null si no hay redex.
|
|
38
|
+
*
|
|
39
|
+
* Política de selección:
|
|
40
|
+
* - Recorre t en pre-order (raíz primero, luego argumentos).
|
|
41
|
+
* - Para cada nodo prueba las reglas en orden.
|
|
42
|
+
* - El primer match aplica.
|
|
43
|
+
*/
|
|
44
|
+
function rewriteStep(t, rules) {
|
|
45
|
+
// Iterativo: busca el redex outermost-leftmost recorriendo el
|
|
46
|
+
// árbol en pre-order con stack explícito. Cuando encuentra un
|
|
47
|
+
// redex, replaceAt reconstruye el árbol con la sustitución.
|
|
48
|
+
const found = findRedex(t, rules);
|
|
49
|
+
if (found === null)
|
|
50
|
+
return null;
|
|
51
|
+
return replaceAt(t, found.position, found.replacement);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Búsqueda del primer redex en pre-order (outermost-leftmost).
|
|
55
|
+
* Iterativo para soportar términos profundos.
|
|
56
|
+
*/
|
|
57
|
+
function findRedex(t, rules) {
|
|
58
|
+
// Stack de (node, position) en orden de DFS pre-order.
|
|
59
|
+
const stack = [{ node: t, pos: [] }];
|
|
60
|
+
while (stack.length > 0) {
|
|
61
|
+
const frame = stack.pop();
|
|
62
|
+
if (frame === undefined)
|
|
63
|
+
break;
|
|
64
|
+
const { node, pos } = frame;
|
|
65
|
+
// Intentar reglas en este nodo.
|
|
66
|
+
for (const rule of rules) {
|
|
67
|
+
const subst = (0, term_utils_1.match)(rule.lhs, node);
|
|
68
|
+
if (subst !== null) {
|
|
69
|
+
return { position: pos, replacement: (0, term_utils_1.applySubst)(rule.rhs, subst) };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Si no hay match, push children en orden inverso para que el
|
|
73
|
+
// leftmost (índice 0) se procese primero al pop.
|
|
74
|
+
if (node.kind === 'func') {
|
|
75
|
+
for (let i = node.args.length - 1; i >= 0; i--) {
|
|
76
|
+
const child = node.args[i];
|
|
77
|
+
if (child === undefined)
|
|
78
|
+
continue;
|
|
79
|
+
stack.push({ node: child, pos: [...pos, i] });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Normaliza t aplicando reglas hasta punto fijo.
|
|
87
|
+
*
|
|
88
|
+
* @param maxSteps Cota de seguridad para sistemas no terminantes.
|
|
89
|
+
* Si se excede, devuelve el último estado alcanzado.
|
|
90
|
+
*
|
|
91
|
+
* Nota: la confluencia se asume responsabilidad del caller — si el
|
|
92
|
+
* TRS no es confluente, distintas estrategias pueden dar distintas
|
|
93
|
+
* FN. Acá fijamos leftmost-outermost.
|
|
94
|
+
*/
|
|
95
|
+
function normalize(t, rules, maxSteps = 10000) {
|
|
96
|
+
let current = t;
|
|
97
|
+
for (let i = 0; i < maxSteps; i++) {
|
|
98
|
+
// Guard contra divergencia: si el término supera MAX_TERM_SIZE
|
|
99
|
+
// asumimos que el sistema no es terminante en esta dirección
|
|
100
|
+
// y devolvemos el último estado.
|
|
101
|
+
if ((0, term_utils_1.termSize)(current) > MAX_TERM_SIZE)
|
|
102
|
+
return current;
|
|
103
|
+
const next = rewriteStep(current, rules);
|
|
104
|
+
if (next === null)
|
|
105
|
+
return current;
|
|
106
|
+
current = next;
|
|
107
|
+
}
|
|
108
|
+
return current;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Lista todas las posiciones (caminos) en t. Una posición es un
|
|
112
|
+
* array de índices: [] = raíz, [0] = primer argumento, [0, 1] =
|
|
113
|
+
* segundo argumento del primer argumento, etc.
|
|
114
|
+
*
|
|
115
|
+
* Útil para enumerar redexes y para calcular critical pairs.
|
|
116
|
+
*/
|
|
117
|
+
function allPositions(t, prefix = []) {
|
|
118
|
+
// Iterativo, BFS por orden estable (raíz, luego hijos en orden 0..n).
|
|
119
|
+
const out = [];
|
|
120
|
+
const queue = [{ node: t, pos: prefix.slice() }];
|
|
121
|
+
while (queue.length > 0) {
|
|
122
|
+
const head = queue.shift();
|
|
123
|
+
if (head === undefined)
|
|
124
|
+
break;
|
|
125
|
+
out.push(head.pos);
|
|
126
|
+
if (head.node.kind === 'func') {
|
|
127
|
+
for (let i = 0; i < head.node.args.length; i++) {
|
|
128
|
+
const a = head.node.args[i];
|
|
129
|
+
if (a === undefined)
|
|
130
|
+
continue;
|
|
131
|
+
queue.push({ node: a, pos: [...head.pos, i] });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Obtiene el subtérmino en la posición indicada.
|
|
139
|
+
* Devuelve null si la posición no existe.
|
|
140
|
+
*/
|
|
141
|
+
function subtermAt(t, pos) {
|
|
142
|
+
let cur = t;
|
|
143
|
+
for (const idx of pos) {
|
|
144
|
+
if (cur.kind !== 'func')
|
|
145
|
+
return null;
|
|
146
|
+
const next = cur.args[idx];
|
|
147
|
+
if (next === undefined)
|
|
148
|
+
return null;
|
|
149
|
+
cur = next;
|
|
150
|
+
}
|
|
151
|
+
return cur;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Reemplaza el subtérmino en la posición indicada por `replacement`.
|
|
155
|
+
*
|
|
156
|
+
* Devuelve un término nuevo (sin mutar t). Si la posición no existe,
|
|
157
|
+
* devuelve t sin cambios.
|
|
158
|
+
*/
|
|
159
|
+
function replaceAt(t, pos, replacement) {
|
|
160
|
+
if (pos.length === 0)
|
|
161
|
+
return replacement;
|
|
162
|
+
// Caminamos hasta el nodo padre del target, luego reconstruimos
|
|
163
|
+
// de vuelta. Iterativo.
|
|
164
|
+
const path = [t];
|
|
165
|
+
let cur = t;
|
|
166
|
+
for (let i = 0; i < pos.length; i++) {
|
|
167
|
+
if (cur.kind !== 'func')
|
|
168
|
+
return t; // posición inválida
|
|
169
|
+
const idx = pos[i];
|
|
170
|
+
const child = cur.args[idx];
|
|
171
|
+
if (child === undefined)
|
|
172
|
+
return t;
|
|
173
|
+
cur = child;
|
|
174
|
+
path.push(cur);
|
|
175
|
+
}
|
|
176
|
+
// path[i] = nodo en profundidad i; path[len-1] = target a reemplazar.
|
|
177
|
+
// Reconstruimos desde la hoja.
|
|
178
|
+
let acc = replacement;
|
|
179
|
+
for (let i = pos.length - 1; i >= 0; i--) {
|
|
180
|
+
const parent = path[i];
|
|
181
|
+
if (parent === undefined || parent.kind !== 'func')
|
|
182
|
+
return t;
|
|
183
|
+
const newArgs = parent.args.slice();
|
|
184
|
+
newArgs[pos[i]] = acc;
|
|
185
|
+
acc = { kind: 'func', name: parent.name, args: newArgs };
|
|
186
|
+
}
|
|
187
|
+
return acc;
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=rewrite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewrite.js","sourceRoot":"","sources":["../../../src/runtime/term-rewriting/rewrite.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,kDAAkD;AAClD,+DAA+D;AAC/D,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,6DAA6D;AAC7D,gEAAgE;AAChE,gEAAgE;AAChE,8DAA8D;AAC9D,2CAA2C;AAC3C,EAAE;AACF,2DAA2D;AAC3D,+DAA+D;AAC/D,4BAA4B;;AA0B5B,kCAOC;AA+CD,8BAYC;AASD,oCAiBC;AAMD,8BASC;AAQD,8BAyBC;AAnKD,6CAA2D;AAE3D;;;;;;;;GAQG;AACH,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B;;;;;;;;;GASG;AACH,SAAgB,WAAW,CAAC,CAAO,EAAE,KAAoB;IACvD,8DAA8D;IAC9D,8DAA8D;IAC9D,4DAA4D;IAC5D,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAChB,CAAO,EACP,KAAoB;IAEpB,uDAAuD;IACvD,MAAM,KAAK,GAAoC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IACtE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QAC1B,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;QAE5B,gCAAgC;QAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAA,kBAAK,EAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,IAAA,uBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;YACrE,CAAC;QACH,CAAC;QACD,8DAA8D;QAC9D,iDAAiD;QACjD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,KAAK,KAAK,SAAS;oBAAE,SAAS;gBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,SAAS,CAAC,CAAO,EAAE,KAAoB,EAAE,WAAmB,KAAK;IAC/E,IAAI,OAAO,GAAS,CAAC,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,+DAA+D;QAC/D,6DAA6D;QAC7D,iCAAiC;QACjC,IAAI,IAAA,qBAAQ,EAAC,OAAO,CAAC,GAAG,aAAa;YAAE,OAAO,OAAO,CAAC;QACtD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC;QAClC,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,YAAY,CAAC,CAAO,EAAE,SAAmB,EAAE;IACzD,sEAAsE;IACtE,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAoC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAClF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM;QAC9B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,CAAC,KAAK,SAAS;oBAAE,SAAS;gBAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAgB,SAAS,CAAC,CAAO,EAAE,GAAsB;IACvD,IAAI,GAAG,GAAS,CAAC,CAAC;IAClB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QACrC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACpC,GAAG,GAAG,IAAI,CAAC;IACb,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,CAAO,EAAE,GAAsB,EAAE,WAAiB;IAC1E,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IACzC,gEAAgE;IAChE,wBAAwB;IACxB,MAAM,IAAI,GAAW,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,GAAG,GAAS,CAAC,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,CAAC,CAAC,CAAC,oBAAoB;QACvD,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACnB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;QAClC,GAAG,GAAG,KAAK,CAAC;QACZ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,sEAAsE;IACtE,+BAA+B;IAC/B,IAAI,GAAG,GAAS,WAAW,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACtB,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|