@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,33 @@
|
|
|
1
|
+
import type { Process } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Máquina expendedora simple: acepta una moneda y luego ofrece al
|
|
4
|
+
* entorno elegir entre té y café.
|
|
5
|
+
*
|
|
6
|
+
* VM = coin → ((tea → STOP) □ (coffee → STOP))
|
|
7
|
+
*
|
|
8
|
+
* Para uso en bucle infinito, ver `vendingMachineLoop`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function vendingMachine(): Process;
|
|
11
|
+
/** Versión recursiva: tras servir, vuelve al estado inicial. */
|
|
12
|
+
export declare function vendingMachineLoop(): Process;
|
|
13
|
+
/**
|
|
14
|
+
* Filósofo `i` (dining philosophers a la Hoare): toma su tenedor
|
|
15
|
+
* izquierdo (`L`), luego el derecho (`R`), come, los suelta y repite.
|
|
16
|
+
*
|
|
17
|
+
* PHIL_i = picks_up.L → picks_up.R → eats → puts_down.R → puts_down.L → STOP
|
|
18
|
+
*
|
|
19
|
+
* El bloqueo clásico aparece cuando todos los filósofos toman primero
|
|
20
|
+
* el izquierdo y luego intentan tomar el derecho: ya nadie lo tendrá
|
|
21
|
+
* libre. Lo detectamos con `isDeadlocked` sobre la composición paralela.
|
|
22
|
+
*/
|
|
23
|
+
export declare function philosopher(name: string): Process;
|
|
24
|
+
/**
|
|
25
|
+
* Composición paralela de `n` filósofos circulares con sus tenedores
|
|
26
|
+
* compartidos. El alfabeto de sincronización es exactamente el conjunto
|
|
27
|
+
* de eventos `pick.*` y `put.*` que comparten filósofo y fork.
|
|
28
|
+
*
|
|
29
|
+
* Con `n ≥ 2` y la estrategia ingenua (todos toman primero el izquierdo)
|
|
30
|
+
* llegamos a deadlock estructural una vez todos hicieron `pick.L`.
|
|
31
|
+
*/
|
|
32
|
+
export declare function diningPhilosophers(n: number): Process;
|
|
33
|
+
//# sourceMappingURL=examples.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../../src/csp-hoare/examples.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAS,MAAM,SAAS,CAAC;AAG9C;;;;;;;GAOG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,IAAI,OAAO,CAK5C;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOjD;AA0BD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CA+BrD"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// CSP Hoare — Ejemplos estándar del libro de Hoare (1985)
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Construcciones canónicas que también sirven como tests integradores
|
|
6
|
+
// de la semántica.
|
|
7
|
+
// ============================================================
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.vendingMachine = vendingMachine;
|
|
10
|
+
exports.vendingMachineLoop = vendingMachineLoop;
|
|
11
|
+
exports.philosopher = philosopher;
|
|
12
|
+
exports.diningPhilosophers = diningPhilosophers;
|
|
13
|
+
const semantics_1 = require("./semantics");
|
|
14
|
+
/**
|
|
15
|
+
* Máquina expendedora simple: acepta una moneda y luego ofrece al
|
|
16
|
+
* entorno elegir entre té y café.
|
|
17
|
+
*
|
|
18
|
+
* VM = coin → ((tea → STOP) □ (coffee → STOP))
|
|
19
|
+
*
|
|
20
|
+
* Para uso en bucle infinito, ver `vendingMachineLoop`.
|
|
21
|
+
*/
|
|
22
|
+
function vendingMachine() {
|
|
23
|
+
return (0, semantics_1.prefix)('coin', (0, semantics_1.choice)((0, semantics_1.prefix)('tea', semantics_1.STOP), (0, semantics_1.prefix)('coffee', semantics_1.STOP)));
|
|
24
|
+
}
|
|
25
|
+
/** Versión recursiva: tras servir, vuelve al estado inicial. */
|
|
26
|
+
function vendingMachineLoop() {
|
|
27
|
+
return (0, semantics_1.recursion)('VM', (0, semantics_1.prefix)('coin', (0, semantics_1.choice)((0, semantics_1.prefix)('tea', (0, semantics_1.processVar)('VM')), (0, semantics_1.prefix)('coffee', (0, semantics_1.processVar)('VM')))));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Filósofo `i` (dining philosophers a la Hoare): toma su tenedor
|
|
31
|
+
* izquierdo (`L`), luego el derecho (`R`), come, los suelta y repite.
|
|
32
|
+
*
|
|
33
|
+
* PHIL_i = picks_up.L → picks_up.R → eats → puts_down.R → puts_down.L → STOP
|
|
34
|
+
*
|
|
35
|
+
* El bloqueo clásico aparece cuando todos los filósofos toman primero
|
|
36
|
+
* el izquierdo y luego intentan tomar el derecho: ya nadie lo tendrá
|
|
37
|
+
* libre. Lo detectamos con `isDeadlocked` sobre la composición paralela.
|
|
38
|
+
*/
|
|
39
|
+
function philosopher(name) {
|
|
40
|
+
const pickL = `pick.${name}.L`;
|
|
41
|
+
const pickR = `pick.${name}.R`;
|
|
42
|
+
const eats = `eat.${name}`;
|
|
43
|
+
const putR = `put.${name}.R`;
|
|
44
|
+
const putL = `put.${name}.L`;
|
|
45
|
+
return (0, semantics_1.prefix)(pickL, (0, semantics_1.prefix)(pickR, (0, semantics_1.prefix)(eats, (0, semantics_1.prefix)(putR, (0, semantics_1.prefix)(putL, semantics_1.STOP)))));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Tenedor `i`: oscila entre "libre" y "tomado". Solo puede ser tomado o
|
|
49
|
+
* soltado, alternativamente.
|
|
50
|
+
*
|
|
51
|
+
* FORK_i = pick → put → FORK_i
|
|
52
|
+
*
|
|
53
|
+
* En el modelo de Hoare, los nombres de evento son compartidos entre
|
|
54
|
+
* filósofo y tenedor: `pick.phi.X` debe coincidir con el evento
|
|
55
|
+
* correspondiente del fork.
|
|
56
|
+
*
|
|
57
|
+
* Aquí codificamos el deadlock estructuralmente: la composición paralela
|
|
58
|
+
* de N filósofos sin recursión queda en STOP global cuando todos se
|
|
59
|
+
* bloquean.
|
|
60
|
+
*/
|
|
61
|
+
function fork(_forkId, philLeft, philRight) {
|
|
62
|
+
// El tenedor es L para `philLeft` y R para `philRight`.
|
|
63
|
+
const pickL = `pick.${philLeft}.L`;
|
|
64
|
+
const putL = `put.${philLeft}.L`;
|
|
65
|
+
const pickR = `pick.${philRight}.R`;
|
|
66
|
+
const putR = `put.${philRight}.R`;
|
|
67
|
+
// Solo aceptamos cada movimiento UNA vez (modelado finito → deadlock visible).
|
|
68
|
+
return (0, semantics_1.choice)((0, semantics_1.prefix)(pickL, (0, semantics_1.prefix)(putL, semantics_1.STOP)), (0, semantics_1.prefix)(pickR, (0, semantics_1.prefix)(putR, semantics_1.STOP)));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Composición paralela de `n` filósofos circulares con sus tenedores
|
|
72
|
+
* compartidos. El alfabeto de sincronización es exactamente el conjunto
|
|
73
|
+
* de eventos `pick.*` y `put.*` que comparten filósofo y fork.
|
|
74
|
+
*
|
|
75
|
+
* Con `n ≥ 2` y la estrategia ingenua (todos toman primero el izquierdo)
|
|
76
|
+
* llegamos a deadlock estructural una vez todos hicieron `pick.L`.
|
|
77
|
+
*/
|
|
78
|
+
function diningPhilosophers(n) {
|
|
79
|
+
if (n < 2)
|
|
80
|
+
throw new Error('diningPhilosophers requiere n ≥ 2');
|
|
81
|
+
// Construimos `n` filósofos y `n` tenedores en una mesa circular.
|
|
82
|
+
// Fork `i` está entre Phil `i` y Phil `(i+1) mod n`.
|
|
83
|
+
const phils = [];
|
|
84
|
+
const forks = [];
|
|
85
|
+
for (let i = 0; i < n; i++) {
|
|
86
|
+
phils.push(philosopher(`P${i}`));
|
|
87
|
+
}
|
|
88
|
+
for (let i = 0; i < n; i++) {
|
|
89
|
+
const left = `P${i}`;
|
|
90
|
+
const right = `P${(i + 1) % n}`;
|
|
91
|
+
forks.push(fork(i, left, right));
|
|
92
|
+
}
|
|
93
|
+
// Alfabeto: todos los `pick.*` y `put.*`.
|
|
94
|
+
const sync = [];
|
|
95
|
+
for (let i = 0; i < n; i++) {
|
|
96
|
+
sync.push(`pick.P${i}.L`, `pick.P${i}.R`, `put.P${i}.L`, `put.P${i}.R`);
|
|
97
|
+
}
|
|
98
|
+
// Componemos en cascada: ((Phil0 |[A]| Fork0) |[A]| Phil1) |[A]| ...
|
|
99
|
+
let acc = phils[0];
|
|
100
|
+
for (let i = 0; i < n; i++) {
|
|
101
|
+
acc = (0, semantics_1.parallel)(acc, forks[i], sync);
|
|
102
|
+
if (i + 1 < n) {
|
|
103
|
+
acc = (0, semantics_1.parallel)(acc, phils[i + 1], sync);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return acc;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=examples.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"examples.js","sourceRoot":"","sources":["../../src/csp-hoare/examples.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { Event, Process, Trace, FailurePair } from './types';
|
|
2
|
+
export { TICK } from './types';
|
|
3
|
+
export { STOP, SKIP, prefix, choice, internal, parallel, interleave, sequence, hide, rename, recursion, processVar, alphabet, nextEvents, step, internalResolutions, } from './semantics';
|
|
4
|
+
export { traces, failures, isDeadlocked, isLiveLocked, refinesTraces, refinesFailures, } from './analysis';
|
|
5
|
+
export { vendingMachine, vendingMachineLoop, philosopher, diningPhilosophers } from './examples';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/csp-hoare/index.ts"],"names":[],"mappings":"AAgBA,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,SAAS,EACT,UAAU,EACV,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// CSP Hoare — Comunicating Sequential Processes (Hoare 1978/1985)
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Cálculo de procesos basado en eventos atómicos sincronizados.
|
|
6
|
+
// A diferencia del π-cálculo (centrado en pasar nombres), CSP modela
|
|
7
|
+
// concurrencia mediante la ocurrencia coordinada de nombres de evento
|
|
8
|
+
// compartidos en el alfabeto del paralelo.
|
|
9
|
+
//
|
|
10
|
+
// Semánticas implementadas:
|
|
11
|
+
// • Traces — qué secuencias de eventos visibles pueden ocurrir.
|
|
12
|
+
// • Failures — pares (traza, refusal) que capturan no-determinismo.
|
|
13
|
+
// • Refinement — P ⊑_T Q y P ⊑_F Q según las semánticas anteriores.
|
|
14
|
+
//
|
|
15
|
+
// Ejemplos canónicos: máquina expendedora, filósofos cenando.
|
|
16
|
+
// ============================================================
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.diningPhilosophers = exports.philosopher = exports.vendingMachineLoop = exports.vendingMachine = exports.refinesFailures = exports.refinesTraces = exports.isLiveLocked = exports.isDeadlocked = exports.failures = exports.traces = exports.internalResolutions = exports.step = exports.nextEvents = exports.alphabet = exports.processVar = exports.recursion = exports.rename = exports.hide = exports.sequence = exports.interleave = exports.parallel = exports.internal = exports.choice = exports.prefix = exports.SKIP = exports.STOP = exports.TICK = void 0;
|
|
19
|
+
var types_1 = require("./types");
|
|
20
|
+
Object.defineProperty(exports, "TICK", { enumerable: true, get: function () { return types_1.TICK; } });
|
|
21
|
+
var semantics_1 = require("./semantics");
|
|
22
|
+
Object.defineProperty(exports, "STOP", { enumerable: true, get: function () { return semantics_1.STOP; } });
|
|
23
|
+
Object.defineProperty(exports, "SKIP", { enumerable: true, get: function () { return semantics_1.SKIP; } });
|
|
24
|
+
Object.defineProperty(exports, "prefix", { enumerable: true, get: function () { return semantics_1.prefix; } });
|
|
25
|
+
Object.defineProperty(exports, "choice", { enumerable: true, get: function () { return semantics_1.choice; } });
|
|
26
|
+
Object.defineProperty(exports, "internal", { enumerable: true, get: function () { return semantics_1.internal; } });
|
|
27
|
+
Object.defineProperty(exports, "parallel", { enumerable: true, get: function () { return semantics_1.parallel; } });
|
|
28
|
+
Object.defineProperty(exports, "interleave", { enumerable: true, get: function () { return semantics_1.interleave; } });
|
|
29
|
+
Object.defineProperty(exports, "sequence", { enumerable: true, get: function () { return semantics_1.sequence; } });
|
|
30
|
+
Object.defineProperty(exports, "hide", { enumerable: true, get: function () { return semantics_1.hide; } });
|
|
31
|
+
Object.defineProperty(exports, "rename", { enumerable: true, get: function () { return semantics_1.rename; } });
|
|
32
|
+
Object.defineProperty(exports, "recursion", { enumerable: true, get: function () { return semantics_1.recursion; } });
|
|
33
|
+
Object.defineProperty(exports, "processVar", { enumerable: true, get: function () { return semantics_1.processVar; } });
|
|
34
|
+
Object.defineProperty(exports, "alphabet", { enumerable: true, get: function () { return semantics_1.alphabet; } });
|
|
35
|
+
Object.defineProperty(exports, "nextEvents", { enumerable: true, get: function () { return semantics_1.nextEvents; } });
|
|
36
|
+
Object.defineProperty(exports, "step", { enumerable: true, get: function () { return semantics_1.step; } });
|
|
37
|
+
Object.defineProperty(exports, "internalResolutions", { enumerable: true, get: function () { return semantics_1.internalResolutions; } });
|
|
38
|
+
var analysis_1 = require("./analysis");
|
|
39
|
+
Object.defineProperty(exports, "traces", { enumerable: true, get: function () { return analysis_1.traces; } });
|
|
40
|
+
Object.defineProperty(exports, "failures", { enumerable: true, get: function () { return analysis_1.failures; } });
|
|
41
|
+
Object.defineProperty(exports, "isDeadlocked", { enumerable: true, get: function () { return analysis_1.isDeadlocked; } });
|
|
42
|
+
Object.defineProperty(exports, "isLiveLocked", { enumerable: true, get: function () { return analysis_1.isLiveLocked; } });
|
|
43
|
+
Object.defineProperty(exports, "refinesTraces", { enumerable: true, get: function () { return analysis_1.refinesTraces; } });
|
|
44
|
+
Object.defineProperty(exports, "refinesFailures", { enumerable: true, get: function () { return analysis_1.refinesFailures; } });
|
|
45
|
+
var examples_1 = require("./examples");
|
|
46
|
+
Object.defineProperty(exports, "vendingMachine", { enumerable: true, get: function () { return examples_1.vendingMachine; } });
|
|
47
|
+
Object.defineProperty(exports, "vendingMachineLoop", { enumerable: true, get: function () { return examples_1.vendingMachineLoop; } });
|
|
48
|
+
Object.defineProperty(exports, "philosopher", { enumerable: true, get: function () { return examples_1.philosopher; } });
|
|
49
|
+
Object.defineProperty(exports, "diningPhilosophers", { enumerable: true, get: function () { return examples_1.diningPhilosophers; } });
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/csp-hoare/index.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,kEAAkE;AAClE,+DAA+D;AAC/D,gEAAgE;AAChE,qEAAqE;AACrE,sEAAsE;AACtE,2CAA2C;AAC3C,EAAE;AACF,4BAA4B;AAC5B,kEAAkE;AAClE,sEAAsE;AACtE,sEAAsE;AACtE,EAAE;AACF,8DAA8D;AAC9D,+DAA+D;;;AAG/D,iCAA+B;AAAtB,6FAAA,IAAI,OAAA;AAEb,yCAiBqB;AAhBnB,iGAAA,IAAI,OAAA;AACJ,iGAAA,IAAI,OAAA;AACJ,mGAAA,MAAM,OAAA;AACN,mGAAA,MAAM,OAAA;AACN,qGAAA,QAAQ,OAAA;AACR,qGAAA,QAAQ,OAAA;AACR,uGAAA,UAAU,OAAA;AACV,qGAAA,QAAQ,OAAA;AACR,iGAAA,IAAI,OAAA;AACJ,mGAAA,MAAM,OAAA;AACN,sGAAA,SAAS,OAAA;AACT,uGAAA,UAAU,OAAA;AACV,qGAAA,QAAQ,OAAA;AACR,uGAAA,UAAU,OAAA;AACV,iGAAA,IAAI,OAAA;AACJ,gHAAA,mBAAmB,OAAA;AAGrB,uCAOoB;AANlB,kGAAA,MAAM,OAAA;AACN,oGAAA,QAAQ,OAAA;AACR,wGAAA,YAAY,OAAA;AACZ,wGAAA,YAAY,OAAA;AACZ,yGAAA,aAAa,OAAA;AACb,2GAAA,eAAe,OAAA;AAGjB,uCAAiG;AAAxF,0GAAA,cAAc,OAAA;AAAE,8GAAA,kBAAkB,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,8GAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Event, Process } from './types';
|
|
2
|
+
export declare const STOP: Process;
|
|
3
|
+
export declare const SKIP: Process;
|
|
4
|
+
export declare function prefix(event: Event, cont: Process): Process;
|
|
5
|
+
export declare function choice(left: Process, right: Process): Process;
|
|
6
|
+
export declare function internal(left: Process, right: Process): Process;
|
|
7
|
+
export declare function parallel(left: Process, right: Process, alphabet: Event[]): Process;
|
|
8
|
+
export declare function interleave(left: Process, right: Process): Process;
|
|
9
|
+
export declare function sequence(left: Process, right: Process): Process;
|
|
10
|
+
export declare function hide(process: Process, events: Event[]): Process;
|
|
11
|
+
export declare function rename(process: Process, mapping: Map<Event, Event>): Process;
|
|
12
|
+
export declare function recursion(name: string, body: Process): Process;
|
|
13
|
+
export declare function processVar(name: string): Process;
|
|
14
|
+
/**
|
|
15
|
+
* Conjunto de eventos visibles mencionados sintácticamente en `p`.
|
|
16
|
+
* Los eventos renombrados aportan tanto la fuente como el destino
|
|
17
|
+
* (la fuente puede aparecer en una rama no recorrida, y el destino
|
|
18
|
+
* es lo que el entorno observa).
|
|
19
|
+
*/
|
|
20
|
+
export declare function alphabet(p: Process): Set<Event>;
|
|
21
|
+
/**
|
|
22
|
+
* Eventos visibles que `p` puede ofrecer inmediatamente como su primer
|
|
23
|
+
* evento (tomando todas las resoluciones internas). No incluye τ (los
|
|
24
|
+
* eventos ocultos son silenciosos por construcción).
|
|
25
|
+
*
|
|
26
|
+
* Para `SKIP` reportamos el tick `✓` — termina exitosamente.
|
|
27
|
+
*/
|
|
28
|
+
export declare function nextEvents(p: Process): Set<Event>;
|
|
29
|
+
/**
|
|
30
|
+
* `step(P, a)` aplica una transición visible etiquetada con `a` y devuelve
|
|
31
|
+
* el continuante, o `null` si `a` no está habilitado. Para procesos no-
|
|
32
|
+
* deterministas elegimos arbitrariamente cualquier rama que habilite `a`
|
|
33
|
+
* (eso es válido para análisis de trazas; para failures inspeccionamos
|
|
34
|
+
* todas las resoluciones aparte).
|
|
35
|
+
*/
|
|
36
|
+
export declare function step(p: Process, event: Event): Process | null;
|
|
37
|
+
/**
|
|
38
|
+
* Enumera todos los estados "estables" alcanzables desde `p` resolviendo
|
|
39
|
+
* elecciones internas (`⊓`) y desplegando recursiones inmediatas, sin
|
|
40
|
+
* consumir eventos visibles. Útil para la semántica de failures, donde
|
|
41
|
+
* el conjunto de refusal depende de QUÉ rama interna se eligió.
|
|
42
|
+
*
|
|
43
|
+
* Devuelve procesos sin un `internal` en la raíz (después de empujarlo
|
|
44
|
+
* hacia adentro de operadores asociativos cuando aplica). El número de
|
|
45
|
+
* resoluciones es 2^(# de internals encadenados), así que limitamos a un
|
|
46
|
+
* número razonable para no explotar.
|
|
47
|
+
*/
|
|
48
|
+
export declare function internalResolutions(p: Process, limit?: number): Process[];
|
|
49
|
+
//# sourceMappingURL=semantics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantics.d.ts","sourceRoot":"","sources":["../../src/csp-hoare/semantics.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAK9C,eAAO,MAAM,IAAI,EAAE,OAA0B,CAAC;AAC9C,eAAO,MAAM,IAAI,EAAE,OAA0B,CAAC;AAE9C,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAE3D;AACD,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAE7D;AACD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAE/D;AACD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,OAAO,CAElF;AACD,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAEjE;AACD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAE/D;AACD,wBAAgB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAE/D;AACD,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,OAAO,CAE5E;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAE9D;AACD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAID;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAI/C;AAiHD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAIjD;AA8GD;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,GAAG,IAAI,CAE7D;AA0HD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,SAAK,GAAG,OAAO,EAAE,CAIrE"}
|