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