@stevenvo780/st-lang 4.4.0 → 4.5.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/coinduction/index.d.ts +136 -0
- package/dist/coinduction/index.d.ts.map +1 -0
- package/dist/coinduction/index.js +318 -0
- package/dist/coinduction/index.js.map +1 -0
- package/dist/combinators-ski/abstract.d.ts +5 -0
- package/dist/combinators-ski/abstract.d.ts.map +1 -0
- package/dist/combinators-ski/abstract.js +88 -0
- package/dist/combinators-ski/abstract.js.map +1 -0
- package/dist/combinators-ski/index.d.ts +6 -0
- package/dist/combinators-ski/index.d.ts.map +1 -0
- package/dist/combinators-ski/index.js +30 -0
- package/dist/combinators-ski/index.js.map +1 -0
- package/dist/combinators-ski/reduce.d.ts +10 -0
- package/dist/combinators-ski/reduce.d.ts.map +1 -0
- package/dist/combinators-ski/reduce.js +118 -0
- package/dist/combinators-ski/reduce.js.map +1 -0
- package/dist/combinators-ski/types.d.ts +23 -0
- package/dist/combinators-ski/types.d.ts.map +1 -0
- package/dist/combinators-ski/types.js +102 -0
- package/dist/combinators-ski/types.js.map +1 -0
- package/dist/constructive-reals/index.d.ts +132 -0
- package/dist/constructive-reals/index.d.ts.map +1 -0
- package/dist/constructive-reals/index.js +723 -0
- package/dist/constructive-reals/index.js.map +1 -0
- package/dist/game-semantics/convert.d.ts +4 -0
- package/dist/game-semantics/convert.d.ts.map +1 -0
- package/dist/game-semantics/convert.js +28 -0
- package/dist/game-semantics/convert.js.map +1 -0
- package/dist/game-semantics/index.d.ts +6 -0
- package/dist/game-semantics/index.d.ts.map +1 -0
- package/dist/game-semantics/index.js +28 -0
- package/dist/game-semantics/index.js.map +1 -0
- package/dist/game-semantics/strategy.d.ts +34 -0
- package/dist/game-semantics/strategy.d.ts.map +1 -0
- package/dist/game-semantics/strategy.js +336 -0
- package/dist/game-semantics/strategy.js.map +1 -0
- package/dist/game-semantics/types.d.ts +64 -0
- package/dist/game-semantics/types.d.ts.map +1 -0
- package/dist/game-semantics/types.js +78 -0
- package/dist/game-semantics/types.js.map +1 -0
- package/dist/higher-order-unify/index.d.ts +5 -0
- package/dist/higher-order-unify/index.d.ts.map +1 -0
- package/dist/higher-order-unify/index.js +27 -0
- package/dist/higher-order-unify/index.js.map +1 -0
- package/dist/higher-order-unify/normalize.d.ts +14 -0
- package/dist/higher-order-unify/normalize.d.ts.map +1 -0
- package/dist/higher-order-unify/normalize.js +191 -0
- package/dist/higher-order-unify/normalize.js.map +1 -0
- package/dist/higher-order-unify/pattern.d.ts +4 -0
- package/dist/higher-order-unify/pattern.d.ts.map +1 -0
- package/dist/higher-order-unify/pattern.js +70 -0
- package/dist/higher-order-unify/pattern.js.map +1 -0
- package/dist/higher-order-unify/types.d.ts +19 -0
- package/dist/higher-order-unify/types.d.ts.map +1 -0
- package/dist/higher-order-unify/types.js +14 -0
- package/dist/higher-order-unify/types.js.map +1 -0
- package/dist/higher-order-unify/unify.d.ts +5 -0
- package/dist/higher-order-unify/unify.d.ts.map +1 -0
- package/dist/higher-order-unify/unify.js +306 -0
- package/dist/higher-order-unify/unify.js.map +1 -0
- package/dist/nbe/index.d.ts +3 -0
- package/dist/nbe/index.d.ts.map +1 -0
- package/dist/nbe/index.js +25 -0
- package/dist/nbe/index.js.map +1 -0
- package/dist/nbe/nbe.d.ts +7 -0
- package/dist/nbe/nbe.d.ts.map +1 -0
- package/dist/nbe/nbe.js +118 -0
- package/dist/nbe/nbe.js.map +1 -0
- package/dist/nbe/types.d.ts +54 -0
- package/dist/nbe/types.d.ts.map +1 -0
- package/dist/nbe/types.js +117 -0
- package/dist/nbe/types.js.map +1 -0
- package/dist/profile-bridge/index.d.ts +64 -0
- package/dist/profile-bridge/index.d.ts.map +1 -0
- package/dist/profile-bridge/index.js +328 -0
- package/dist/profile-bridge/index.js.map +1 -0
- package/dist/proof-nets/construct.d.ts +3 -0
- package/dist/proof-nets/construct.d.ts.map +1 -0
- package/dist/proof-nets/construct.js +85 -0
- package/dist/proof-nets/construct.js.map +1 -0
- package/dist/proof-nets/correctness.d.ts +3 -0
- package/dist/proof-nets/correctness.d.ts.map +1 -0
- package/dist/proof-nets/correctness.js +213 -0
- package/dist/proof-nets/correctness.js.map +1 -0
- package/dist/proof-nets/cut-elim.d.ts +9 -0
- package/dist/proof-nets/cut-elim.d.ts.map +1 -0
- package/dist/proof-nets/cut-elim.js +149 -0
- package/dist/proof-nets/cut-elim.js.map +1 -0
- package/dist/proof-nets/index.d.ts +6 -0
- package/dist/proof-nets/index.d.ts.map +1 -0
- package/dist/proof-nets/index.js +33 -0
- package/dist/proof-nets/index.js.map +1 -0
- package/dist/proof-nets/types.d.ts +36 -0
- package/dist/proof-nets/types.d.ts.map +1 -0
- package/dist/proof-nets/types.js +89 -0
- package/dist/proof-nets/types.js.map +1 -0
- package/dist/tableau-framework/TableauProver.d.ts +10 -0
- package/dist/tableau-framework/TableauProver.d.ts.map +1 -0
- package/dist/tableau-framework/TableauProver.js +118 -0
- package/dist/tableau-framework/TableauProver.js.map +1 -0
- package/dist/tableau-framework/index.d.ts +5 -0
- package/dist/tableau-framework/index.d.ts.map +1 -0
- package/dist/tableau-framework/index.js +11 -0
- package/dist/tableau-framework/index.js.map +1 -0
- package/dist/tableau-framework/propositional.d.ts +11 -0
- package/dist/tableau-framework/propositional.d.ts.map +1 -0
- package/dist/tableau-framework/propositional.js +143 -0
- package/dist/tableau-framework/propositional.js.map +1 -0
- package/dist/tableau-framework/types.d.ts +32 -0
- package/dist/tableau-framework/types.d.ts.map +1 -0
- package/dist/tableau-framework/types.js +6 -0
- package/dist/tableau-framework/types.js.map +1 -0
- package/dist/tests/coinduction/coinduction.test.d.ts +2 -0
- package/dist/tests/coinduction/coinduction.test.d.ts.map +1 -0
- package/dist/tests/coinduction/coinduction.test.js +217 -0
- package/dist/tests/coinduction/coinduction.test.js.map +1 -0
- package/dist/tests/combinators-ski/combinators-ski.test.d.ts +2 -0
- package/dist/tests/combinators-ski/combinators-ski.test.d.ts.map +1 -0
- package/dist/tests/combinators-ski/combinators-ski.test.js +211 -0
- package/dist/tests/combinators-ski/combinators-ski.test.js.map +1 -0
- package/dist/tests/constructive-reals/constructive-reals.test.d.ts +2 -0
- package/dist/tests/constructive-reals/constructive-reals.test.d.ts.map +1 -0
- package/dist/tests/constructive-reals/constructive-reals.test.js +357 -0
- package/dist/tests/constructive-reals/constructive-reals.test.js.map +1 -0
- package/dist/tests/game-semantics/game-semantics.test.d.ts +2 -0
- package/dist/tests/game-semantics/game-semantics.test.d.ts.map +1 -0
- package/dist/tests/game-semantics/game-semantics.test.js +143 -0
- package/dist/tests/game-semantics/game-semantics.test.js.map +1 -0
- package/dist/tests/higher-order-unify/ho-unify.test.d.ts +2 -0
- package/dist/tests/higher-order-unify/ho-unify.test.d.ts.map +1 -0
- package/dist/tests/higher-order-unify/ho-unify.test.js +264 -0
- package/dist/tests/higher-order-unify/ho-unify.test.js.map +1 -0
- package/dist/tests/integration/cross-modules.test.d.ts +8 -0
- package/dist/tests/integration/cross-modules.test.d.ts.map +1 -0
- package/dist/tests/integration/cross-modules.test.js +668 -0
- package/dist/tests/integration/cross-modules.test.js.map +1 -0
- package/dist/tests/nbe/nbe.test.d.ts +2 -0
- package/dist/tests/nbe/nbe.test.d.ts.map +1 -0
- package/dist/tests/nbe/nbe.test.js +121 -0
- package/dist/tests/nbe/nbe.test.js.map +1 -0
- package/dist/tests/profile-bridge/translations.test.d.ts +2 -0
- package/dist/tests/profile-bridge/translations.test.d.ts.map +1 -0
- package/dist/tests/profile-bridge/translations.test.js +266 -0
- package/dist/tests/profile-bridge/translations.test.js.map +1 -0
- package/dist/tests/proof-nets/proof-nets.test.d.ts +2 -0
- package/dist/tests/proof-nets/proof-nets.test.d.ts.map +1 -0
- package/dist/tests/proof-nets/proof-nets.test.js +263 -0
- package/dist/tests/proof-nets/proof-nets.test.js.map +1 -0
- package/dist/tests/tableau-framework/tableau.test.d.ts +2 -0
- package/dist/tests/tableau-framework/tableau.test.d.ts.map +1 -0
- package/dist/tests/tableau-framework/tableau.test.js +196 -0
- package/dist/tests/tableau-framework/tableau.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// NbE para STLC — Tipos sintácticos y dominio semántico
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Términos del λ-cálculo simplemente tipado (STLC) y los valores
|
|
7
|
+
// semánticos sobre los que evaluamos. La separación entre sintaxis
|
|
8
|
+
// (Term, Type) y semántica (Value, Neutral) es lo que hace al
|
|
9
|
+
// algoritmo NbE limpio: evaluar produce valores; reificar los baja
|
|
10
|
+
// otra vez a términos en forma normal η-larga.
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.vClosure = exports.vNeutral = exports.vNeutralVar = exports.apN = exports.ap = exports.lam = exports.v = exports.tArr = exports.tBase = void 0;
|
|
13
|
+
exports.alphaEq = alphaEq;
|
|
14
|
+
exports.typeEq = typeEq;
|
|
15
|
+
exports.typeToString = typeToString;
|
|
16
|
+
exports.termToString = termToString;
|
|
17
|
+
// ---------- Constructores sintácticos ----------
|
|
18
|
+
const tBase = (name) => ({ kind: 'base', name });
|
|
19
|
+
exports.tBase = tBase;
|
|
20
|
+
const tArr = (from, to) => ({ kind: 'arrow', from, to });
|
|
21
|
+
exports.tArr = tArr;
|
|
22
|
+
const v = (name) => ({ kind: 'var', name });
|
|
23
|
+
exports.v = v;
|
|
24
|
+
const lam = (param, paramType, body) => ({
|
|
25
|
+
kind: 'abs',
|
|
26
|
+
param,
|
|
27
|
+
paramType,
|
|
28
|
+
body,
|
|
29
|
+
});
|
|
30
|
+
exports.lam = lam;
|
|
31
|
+
const ap = (fn, arg) => ({ kind: 'app', fn, arg });
|
|
32
|
+
exports.ap = ap;
|
|
33
|
+
const apN = (head, ...args) => args.reduce(exports.ap, head);
|
|
34
|
+
exports.apN = apN;
|
|
35
|
+
// ---------- Constructores semánticos ----------
|
|
36
|
+
const vNeutralVar = (name) => ({
|
|
37
|
+
kind: 'neutral',
|
|
38
|
+
head: { kind: 'var', name },
|
|
39
|
+
});
|
|
40
|
+
exports.vNeutralVar = vNeutralVar;
|
|
41
|
+
const vNeutral = (head) => ({ kind: 'neutral', head });
|
|
42
|
+
exports.vNeutral = vNeutral;
|
|
43
|
+
const vClosure = (env, param, paramType, body) => ({
|
|
44
|
+
kind: 'closure',
|
|
45
|
+
env,
|
|
46
|
+
param,
|
|
47
|
+
paramType,
|
|
48
|
+
body,
|
|
49
|
+
});
|
|
50
|
+
exports.vClosure = vClosure;
|
|
51
|
+
// ---------- Igualdad estructural módulo α ----------
|
|
52
|
+
// Renombra binders a posiciones canónicas para comparar.
|
|
53
|
+
function alphaEq(a, b) {
|
|
54
|
+
return alphaEqEnv(a, b, new Map(), new Map(), { n: 0 });
|
|
55
|
+
}
|
|
56
|
+
function alphaEqEnv(a, b, envA, envB, counter) {
|
|
57
|
+
if (a.kind !== b.kind)
|
|
58
|
+
return false;
|
|
59
|
+
switch (a.kind) {
|
|
60
|
+
case 'var': {
|
|
61
|
+
const bb = b;
|
|
62
|
+
const ia = envA.get(a.name);
|
|
63
|
+
const ib = envB.get(bb.name);
|
|
64
|
+
if (ia === undefined && ib === undefined)
|
|
65
|
+
return a.name === bb.name; // free vars
|
|
66
|
+
return ia === ib;
|
|
67
|
+
}
|
|
68
|
+
case 'abs': {
|
|
69
|
+
const bb = b;
|
|
70
|
+
if (!typeEq(a.paramType, bb.paramType))
|
|
71
|
+
return false;
|
|
72
|
+
const idx = counter.n++;
|
|
73
|
+
const newA = new Map(envA);
|
|
74
|
+
newA.set(a.param, idx);
|
|
75
|
+
const newB = new Map(envB);
|
|
76
|
+
newB.set(bb.param, idx);
|
|
77
|
+
return alphaEqEnv(a.body, bb.body, newA, newB, counter);
|
|
78
|
+
}
|
|
79
|
+
case 'app': {
|
|
80
|
+
const bb = b;
|
|
81
|
+
return (alphaEqEnv(a.fn, bb.fn, envA, envB, counter) &&
|
|
82
|
+
alphaEqEnv(a.arg, bb.arg, envA, envB, counter));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function typeEq(a, b) {
|
|
87
|
+
if (a.kind !== b.kind)
|
|
88
|
+
return false;
|
|
89
|
+
if (a.kind === 'base' && b.kind === 'base')
|
|
90
|
+
return a.name === b.name;
|
|
91
|
+
if (a.kind === 'arrow' && b.kind === 'arrow') {
|
|
92
|
+
return typeEq(a.from, b.from) && typeEq(a.to, b.to);
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
// Pretty-printer mínimo para términos y tipos (útil en tests/debug).
|
|
97
|
+
function typeToString(t) {
|
|
98
|
+
if (t.kind === 'base')
|
|
99
|
+
return t.name;
|
|
100
|
+
// arrow es asociativo a la derecha: A → B → C ≡ A → (B → C)
|
|
101
|
+
const from = t.from.kind === 'arrow' ? `(${typeToString(t.from)})` : typeToString(t.from);
|
|
102
|
+
return `${from} → ${typeToString(t.to)}`;
|
|
103
|
+
}
|
|
104
|
+
function termToString(t) {
|
|
105
|
+
switch (t.kind) {
|
|
106
|
+
case 'var':
|
|
107
|
+
return t.name;
|
|
108
|
+
case 'abs':
|
|
109
|
+
return `(λ${t.param}:${typeToString(t.paramType)}.${termToString(t.body)})`;
|
|
110
|
+
case 'app': {
|
|
111
|
+
const fn = termToString(t.fn);
|
|
112
|
+
const arg = t.arg.kind === 'app' ? `(${termToString(t.arg)})` : termToString(t.arg);
|
|
113
|
+
return `(${fn} ${arg})`;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/nbe/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Formula } from '../types';
|
|
2
|
+
import type { LTLFormula } from '../profiles/ltl-sat/types';
|
|
3
|
+
import type { CTLFormula } from '../profiles/ctl/types';
|
|
4
|
+
export type Profile = 'classical' | 'intuitionistic' | 'S4' | 'LTL' | 'CTL' | 'fuzzy';
|
|
5
|
+
export interface GenericFormula {
|
|
6
|
+
profile: Profile;
|
|
7
|
+
ast: unknown;
|
|
8
|
+
}
|
|
9
|
+
export type Validity = 'preserved' | 'one-way' | 'partial';
|
|
10
|
+
export interface Translation {
|
|
11
|
+
source: Profile;
|
|
12
|
+
target: Profile;
|
|
13
|
+
translate(formula: unknown): unknown;
|
|
14
|
+
validity: Validity;
|
|
15
|
+
}
|
|
16
|
+
/** Aplica la traducción ¬¬ de Glivenko recursivamente.
|
|
17
|
+
*
|
|
18
|
+
* Reglas (Glivenko 1929):
|
|
19
|
+
* atom p → ¬¬p
|
|
20
|
+
* ¬φ → ¬¬(¬φ') = ¬φ' (¬¬¬ ≡ ¬)
|
|
21
|
+
* φ ∧ ψ → ¬¬(φ' ∧ ψ')
|
|
22
|
+
* φ ∨ ψ → ¬¬(φ' ∨ ψ')
|
|
23
|
+
* φ → ψ → ¬¬(φ' → ψ')
|
|
24
|
+
* φ ↔ ψ → ¬¬(φ' ↔ ψ')
|
|
25
|
+
* ⊤ → ⊤
|
|
26
|
+
* ⊥ → ⊥
|
|
27
|
+
*
|
|
28
|
+
* Resultado: clásicamente válido si y solo si el original lo es en IPC.
|
|
29
|
+
*/
|
|
30
|
+
export declare function glivenkoTranslation(intuitFormula: unknown): Formula;
|
|
31
|
+
/** Aplica la traducción de Gödel-McKinsey-Tarski: clasical → S4.
|
|
32
|
+
*
|
|
33
|
+
* Reglas (Gödel 1933):
|
|
34
|
+
* atom p → □p
|
|
35
|
+
* ¬φ → □¬φ'
|
|
36
|
+
* φ ∧ ψ → φ' ∧ ψ'
|
|
37
|
+
* φ ∨ ψ → φ' ∨ ψ'
|
|
38
|
+
* φ → ψ → □(φ' → ψ')
|
|
39
|
+
* φ ↔ ψ → □(φ' ↔ ψ')
|
|
40
|
+
* ⊤ → ⊤
|
|
41
|
+
* ⊥ → ⊥
|
|
42
|
+
*
|
|
43
|
+
* Corrección: φ es tautología clásica sii godelTranslation(φ) es
|
|
44
|
+
* tautología S4 (Gödel 1933, McKinsey-Tarski 1948).
|
|
45
|
+
*/
|
|
46
|
+
export declare function godelTranslation(classicalFormula: unknown): Formula;
|
|
47
|
+
export declare function ltlToCTL(ltlFormula: unknown): CTLFormula;
|
|
48
|
+
export declare function ctlToLTL(ctlFormula: unknown): LTLFormula;
|
|
49
|
+
export declare const TRANSLATIONS: Translation[];
|
|
50
|
+
/**
|
|
51
|
+
* Encuentra la ruta más corta desde `from` hasta `to` en el grafo
|
|
52
|
+
* de traducciones disponibles (BFS).
|
|
53
|
+
*
|
|
54
|
+
* Devuelve la secuencia de perfiles [from, ..., to] o null si no hay ruta.
|
|
55
|
+
*/
|
|
56
|
+
export declare function findTranslationPath(from: Profile, to: Profile): Profile[] | null;
|
|
57
|
+
/**
|
|
58
|
+
* Traduce una fórmula genérica al perfil `target` siguiendo el camino
|
|
59
|
+
* de traducciones más corto disponible.
|
|
60
|
+
*
|
|
61
|
+
* Devuelve null si no existe ruta desde `formula.profile` hasta `target`.
|
|
62
|
+
*/
|
|
63
|
+
export declare function translateFormula(formula: GenericFormula, target: Profile): GenericFormula | null;
|
|
64
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/profile-bridge/index.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,gBAAgB,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAEtF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAE3D,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IACrC,QAAQ,EAAE,QAAQ,CAAC;CACpB;AASD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,OAAO,GAAG,OAAO,CAGnE;AA+BD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAGnE;AAmDD,wBAAgB,QAAQ,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,CAGxD;AA4DD,wBAAgB,QAAQ,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,CAGxD;AA2DD,eAAO,MAAM,YAAY,EAAE,WAAW,EAqCrC,CAAC;AASF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI,CAoBhF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAkBhG"}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ST Profile Bridge — traducciones cross-profile
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Implementa las traducciones clásicas entre perfiles lógicos:
|
|
6
|
+
//
|
|
7
|
+
// intuitionistic → classical (Glivenko ¬¬-translation)
|
|
8
|
+
// classical → S4 (Gödel-McKinsey-Tarski □-embedding)
|
|
9
|
+
// LTL → CTL (embedding conservativo uno-a-uno)
|
|
10
|
+
// CTL → LTL (aproximación parcial, paths existenciales)
|
|
11
|
+
// fuzzy → classical (aproximación por umbral 0.5)
|
|
12
|
+
//
|
|
13
|
+
// Grafo de traducciones:
|
|
14
|
+
//
|
|
15
|
+
// intuitionistic ──(Glivenko)──→ classical ──(Gödel)──→ S4
|
|
16
|
+
// ↑
|
|
17
|
+
// LTL ──(ltlToCTL)──→ CTL ─────────────────────────────────┘
|
|
18
|
+
// CTL ──(ctlToLTL)──→ LTL (partial, one-way)
|
|
19
|
+
// ============================================================
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.TRANSLATIONS = void 0;
|
|
22
|
+
exports.glivenkoTranslation = glivenkoTranslation;
|
|
23
|
+
exports.godelTranslation = godelTranslation;
|
|
24
|
+
exports.ltlToCTL = ltlToCTL;
|
|
25
|
+
exports.ctlToLTL = ctlToLTL;
|
|
26
|
+
exports.findTranslationPath = findTranslationPath;
|
|
27
|
+
exports.translateFormula = translateFormula;
|
|
28
|
+
// ── Utilidades internas ──────────────────────────────────────
|
|
29
|
+
/** Envuelve una Formula en doble negación: φ → ¬¬φ */
|
|
30
|
+
function doubleNeg(f) {
|
|
31
|
+
return { kind: 'not', args: [{ kind: 'not', args: [f] }] };
|
|
32
|
+
}
|
|
33
|
+
/** Aplica la traducción ¬¬ de Glivenko recursivamente.
|
|
34
|
+
*
|
|
35
|
+
* Reglas (Glivenko 1929):
|
|
36
|
+
* atom p → ¬¬p
|
|
37
|
+
* ¬φ → ¬¬(¬φ') = ¬φ' (¬¬¬ ≡ ¬)
|
|
38
|
+
* φ ∧ ψ → ¬¬(φ' ∧ ψ')
|
|
39
|
+
* φ ∨ ψ → ¬¬(φ' ∨ ψ')
|
|
40
|
+
* φ → ψ → ¬¬(φ' → ψ')
|
|
41
|
+
* φ ↔ ψ → ¬¬(φ' ↔ ψ')
|
|
42
|
+
* ⊤ → ⊤
|
|
43
|
+
* ⊥ → ⊥
|
|
44
|
+
*
|
|
45
|
+
* Resultado: clásicamente válido si y solo si el original lo es en IPC.
|
|
46
|
+
*/
|
|
47
|
+
function glivenkoTranslation(intuitFormula) {
|
|
48
|
+
const f = intuitFormula;
|
|
49
|
+
return applyGlivenko(f);
|
|
50
|
+
}
|
|
51
|
+
function applyGlivenko(f) {
|
|
52
|
+
switch (f.kind) {
|
|
53
|
+
case 'true':
|
|
54
|
+
case 'false':
|
|
55
|
+
return f;
|
|
56
|
+
case 'atom':
|
|
57
|
+
return doubleNeg(f);
|
|
58
|
+
case 'not': {
|
|
59
|
+
const inner = (f.args ?? [])[0];
|
|
60
|
+
if (!inner)
|
|
61
|
+
return doubleNeg(f);
|
|
62
|
+
// ¬φ' — la doble negación de una negación colapsa: ¬¬¬φ ≡ ¬φ
|
|
63
|
+
return { kind: 'not', args: [applyGlivenko(inner)] };
|
|
64
|
+
}
|
|
65
|
+
case 'and':
|
|
66
|
+
case 'or':
|
|
67
|
+
case 'implies':
|
|
68
|
+
case 'biconditional': {
|
|
69
|
+
const translatedArgs = (f.args ?? []).map(applyGlivenko);
|
|
70
|
+
return doubleNeg({ ...f, args: translatedArgs });
|
|
71
|
+
}
|
|
72
|
+
default:
|
|
73
|
+
return doubleNeg(f);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Aplica la traducción de Gödel-McKinsey-Tarski: clasical → S4.
|
|
77
|
+
*
|
|
78
|
+
* Reglas (Gödel 1933):
|
|
79
|
+
* atom p → □p
|
|
80
|
+
* ¬φ → □¬φ'
|
|
81
|
+
* φ ∧ ψ → φ' ∧ ψ'
|
|
82
|
+
* φ ∨ ψ → φ' ∨ ψ'
|
|
83
|
+
* φ → ψ → □(φ' → ψ')
|
|
84
|
+
* φ ↔ ψ → □(φ' ↔ ψ')
|
|
85
|
+
* ⊤ → ⊤
|
|
86
|
+
* ⊥ → ⊥
|
|
87
|
+
*
|
|
88
|
+
* Corrección: φ es tautología clásica sii godelTranslation(φ) es
|
|
89
|
+
* tautología S4 (Gödel 1933, McKinsey-Tarski 1948).
|
|
90
|
+
*/
|
|
91
|
+
function godelTranslation(classicalFormula) {
|
|
92
|
+
const f = classicalFormula;
|
|
93
|
+
return applyGodel(f);
|
|
94
|
+
}
|
|
95
|
+
function box(f) {
|
|
96
|
+
return { kind: 'modal_necessity', args: [f] };
|
|
97
|
+
}
|
|
98
|
+
function applyGodel(f) {
|
|
99
|
+
switch (f.kind) {
|
|
100
|
+
case 'true':
|
|
101
|
+
case 'false':
|
|
102
|
+
return f;
|
|
103
|
+
case 'atom':
|
|
104
|
+
return box(f);
|
|
105
|
+
case 'not': {
|
|
106
|
+
const inner = (f.args ?? [])[0];
|
|
107
|
+
if (!inner)
|
|
108
|
+
return box(f);
|
|
109
|
+
return box({ kind: 'not', args: [applyGodel(inner)] });
|
|
110
|
+
}
|
|
111
|
+
case 'and':
|
|
112
|
+
case 'or': {
|
|
113
|
+
const translatedArgs = (f.args ?? []).map(applyGodel);
|
|
114
|
+
return { ...f, args: translatedArgs };
|
|
115
|
+
}
|
|
116
|
+
case 'implies':
|
|
117
|
+
case 'biconditional': {
|
|
118
|
+
const translatedArgs = (f.args ?? []).map(applyGodel);
|
|
119
|
+
return box({ ...f, args: translatedArgs });
|
|
120
|
+
}
|
|
121
|
+
default:
|
|
122
|
+
return box(f);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// ── LTL → CTL ───────────────────────────────────────────────
|
|
126
|
+
// Embedding conservativo: operadores path-existencial de LTL
|
|
127
|
+
// se mapean a sus contrapartes existenciales de CTL.
|
|
128
|
+
//
|
|
129
|
+
// X φ → EX φ' (existe un sucesor)
|
|
130
|
+
// F φ → EF φ' (existe un camino que eventualmente alcanza)
|
|
131
|
+
// G φ → EG φ' (existe un camino siempre φ)
|
|
132
|
+
// φ U ψ → E[φ' U ψ'] (existe un camino con until)
|
|
133
|
+
// φ R ψ → E[ψ' R φ'] (release: E[ψ U (ψ∧φ)] aproximado)
|
|
134
|
+
//
|
|
135
|
+
// validity: 'one-way' — LTL-valid ⇒ imagen CTL-valid en E-paths,
|
|
136
|
+
// pero no viceversa (CTL tiene más poder expresivo sobre branching).
|
|
137
|
+
function ltlToCTL(ltlFormula) {
|
|
138
|
+
const f = ltlFormula;
|
|
139
|
+
return ltlToCTLRec(f);
|
|
140
|
+
}
|
|
141
|
+
function ltlToCTLRec(f) {
|
|
142
|
+
switch (f.kind) {
|
|
143
|
+
case 'atom':
|
|
144
|
+
return { kind: 'atom', name: f.name };
|
|
145
|
+
case 'not':
|
|
146
|
+
return { kind: 'not', arg: ltlToCTLRec(f.arg) };
|
|
147
|
+
case 'and':
|
|
148
|
+
return { kind: 'and', args: f.args.map(ltlToCTLRec) };
|
|
149
|
+
case 'or':
|
|
150
|
+
return { kind: 'or', args: f.args.map(ltlToCTLRec) };
|
|
151
|
+
case 'X':
|
|
152
|
+
return { kind: 'EX', arg: ltlToCTLRec(f.arg) };
|
|
153
|
+
case 'F':
|
|
154
|
+
return { kind: 'EF', arg: ltlToCTLRec(f.arg) };
|
|
155
|
+
case 'G':
|
|
156
|
+
return { kind: 'EG', arg: ltlToCTLRec(f.arg) };
|
|
157
|
+
case 'U':
|
|
158
|
+
return { kind: 'EU', left: ltlToCTLRec(f.left), right: ltlToCTLRec(f.right) };
|
|
159
|
+
case 'R': {
|
|
160
|
+
// Release φ R ψ ≡ ψ W (ψ∧φ): no hay operador R nativo en CTL.
|
|
161
|
+
// Traducimos como ¬(¬ψ U ¬φ) vía dualidad, representado con EU.
|
|
162
|
+
// Para la traducción conservativa one-way usamos:
|
|
163
|
+
// φ R ψ ≡ ¬(¬ψ U ¬φ) → CTL: ¬E[¬ψ' U ¬φ']
|
|
164
|
+
const notLeft = { kind: 'not', arg: ltlToCTLRec(f.left) };
|
|
165
|
+
const notRight = { kind: 'not', arg: ltlToCTLRec(f.right) };
|
|
166
|
+
return {
|
|
167
|
+
kind: 'not',
|
|
168
|
+
arg: { kind: 'EU', left: notRight, right: notLeft },
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// ── CTL → LTL ───────────────────────────────────────────────
|
|
174
|
+
// Aproximación parcial. Los operadores A (universal-path) de CTL
|
|
175
|
+
// no tienen equivalente directo en LTL (Vardi 1988). Los E
|
|
176
|
+
// (existencial) se traducen fielmente en el fragmento linear.
|
|
177
|
+
//
|
|
178
|
+
// EX φ → X φ'
|
|
179
|
+
// AX φ → X φ' (aproximación: LTL no distingue branching)
|
|
180
|
+
// EF φ → F φ'
|
|
181
|
+
// AF φ → F φ'
|
|
182
|
+
// EG φ → G φ'
|
|
183
|
+
// AG φ → G φ'
|
|
184
|
+
// E[φUψ] → φ' U ψ'
|
|
185
|
+
// A[φUψ] → φ' U ψ'
|
|
186
|
+
//
|
|
187
|
+
// validity: 'partial' — la imagen LTL es más débil; sólo preserva
|
|
188
|
+
// semántica lineal, no branching. No apta para model checking exacto.
|
|
189
|
+
function ctlToLTL(ctlFormula) {
|
|
190
|
+
const f = ctlFormula;
|
|
191
|
+
return ctlToLTLRec(f);
|
|
192
|
+
}
|
|
193
|
+
function ctlToLTLRec(f) {
|
|
194
|
+
switch (f.kind) {
|
|
195
|
+
case 'atom':
|
|
196
|
+
return { kind: 'atom', name: f.name };
|
|
197
|
+
case 'true':
|
|
198
|
+
return { kind: 'or', args: [{ kind: 'atom', name: '__true__' }, { kind: 'not', arg: { kind: 'atom', name: '__true__' } }] };
|
|
199
|
+
case 'false':
|
|
200
|
+
return { kind: 'and', args: [{ kind: 'atom', name: '__false__' }, { kind: 'not', arg: { kind: 'atom', name: '__false__' } }] };
|
|
201
|
+
case 'not':
|
|
202
|
+
return { kind: 'not', arg: ctlToLTLRec(f.arg) };
|
|
203
|
+
case 'and':
|
|
204
|
+
return { kind: 'and', args: f.args.map(ctlToLTLRec) };
|
|
205
|
+
case 'or':
|
|
206
|
+
return { kind: 'or', args: f.args.map(ctlToLTLRec) };
|
|
207
|
+
case 'implies':
|
|
208
|
+
return { kind: 'or', args: [{ kind: 'not', arg: ctlToLTLRec(f.left) }, ctlToLTLRec(f.right)] };
|
|
209
|
+
case 'EX':
|
|
210
|
+
case 'AX':
|
|
211
|
+
return { kind: 'X', arg: ctlToLTLRec(f.arg) };
|
|
212
|
+
case 'EF':
|
|
213
|
+
case 'AF':
|
|
214
|
+
return { kind: 'F', arg: ctlToLTLRec(f.arg) };
|
|
215
|
+
case 'EG':
|
|
216
|
+
case 'AG':
|
|
217
|
+
return { kind: 'G', arg: ctlToLTLRec(f.arg) };
|
|
218
|
+
case 'EU':
|
|
219
|
+
case 'AU':
|
|
220
|
+
return { kind: 'U', left: ctlToLTLRec(f.left), right: ctlToLTLRec(f.right) };
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// ── fuzzy → classical ────────────────────────────────────────
|
|
224
|
+
// Umbral crisp: valores ≥ 0.5 → true; < 0.5 → false.
|
|
225
|
+
// Formula de fuzzy se asume como una Formula con valores numéricos
|
|
226
|
+
// codificados como kind:'number'. Aproximación heurística.
|
|
227
|
+
function fuzzyCrisp(f) {
|
|
228
|
+
if (f.kind === 'number') {
|
|
229
|
+
const v = f.value ?? 0;
|
|
230
|
+
return { kind: v >= 0.5 ? 'true' : 'false' };
|
|
231
|
+
}
|
|
232
|
+
const newArgs = (f.args ?? []).map(fuzzyCrisp);
|
|
233
|
+
return { ...f, args: newArgs.length > 0 ? newArgs : undefined };
|
|
234
|
+
}
|
|
235
|
+
// ── Registro de traducciones ────────────────────────────────
|
|
236
|
+
exports.TRANSLATIONS = [
|
|
237
|
+
{
|
|
238
|
+
source: 'intuitionistic',
|
|
239
|
+
target: 'classical',
|
|
240
|
+
translate: glivenkoTranslation,
|
|
241
|
+
validity: 'preserved',
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
source: 'classical',
|
|
245
|
+
target: 'S4',
|
|
246
|
+
translate: godelTranslation,
|
|
247
|
+
validity: 'preserved',
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
source: 'LTL',
|
|
251
|
+
target: 'CTL',
|
|
252
|
+
translate: ltlToCTL,
|
|
253
|
+
validity: 'one-way',
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
source: 'CTL',
|
|
257
|
+
target: 'LTL',
|
|
258
|
+
translate: ctlToLTL,
|
|
259
|
+
validity: 'partial',
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
source: 'fuzzy',
|
|
263
|
+
target: 'classical',
|
|
264
|
+
translate: (f) => fuzzyCrisp(f),
|
|
265
|
+
validity: 'partial',
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
source: 'intuitionistic',
|
|
269
|
+
target: 'S4',
|
|
270
|
+
translate: (f) => godelTranslation(glivenkoTranslation(f)),
|
|
271
|
+
validity: 'preserved',
|
|
272
|
+
},
|
|
273
|
+
];
|
|
274
|
+
// ── Grafo de rutas de traducción ────────────────────────────
|
|
275
|
+
/** Retorna los vecinos directos de un perfil en el grafo de traducciones. */
|
|
276
|
+
function neighbours(from) {
|
|
277
|
+
return exports.TRANSLATIONS.filter((t) => t.source === from).map((t) => t.target);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Encuentra la ruta más corta desde `from` hasta `to` en el grafo
|
|
281
|
+
* de traducciones disponibles (BFS).
|
|
282
|
+
*
|
|
283
|
+
* Devuelve la secuencia de perfiles [from, ..., to] o null si no hay ruta.
|
|
284
|
+
*/
|
|
285
|
+
function findTranslationPath(from, to) {
|
|
286
|
+
if (from === to)
|
|
287
|
+
return [from];
|
|
288
|
+
const visited = new Set([from]);
|
|
289
|
+
const queue = [[from]];
|
|
290
|
+
while (queue.length > 0) {
|
|
291
|
+
const path = queue.shift();
|
|
292
|
+
const current = path[path.length - 1];
|
|
293
|
+
for (const next of neighbours(current)) {
|
|
294
|
+
if (next === to)
|
|
295
|
+
return [...path, next];
|
|
296
|
+
if (!visited.has(next)) {
|
|
297
|
+
visited.add(next);
|
|
298
|
+
queue.push([...path, next]);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Traduce una fórmula genérica al perfil `target` siguiendo el camino
|
|
306
|
+
* de traducciones más corto disponible.
|
|
307
|
+
*
|
|
308
|
+
* Devuelve null si no existe ruta desde `formula.profile` hasta `target`.
|
|
309
|
+
*/
|
|
310
|
+
function translateFormula(formula, target) {
|
|
311
|
+
const path = findTranslationPath(formula.profile, target);
|
|
312
|
+
if (!path)
|
|
313
|
+
return null;
|
|
314
|
+
let current = formula;
|
|
315
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
316
|
+
const src = path[i];
|
|
317
|
+
const dst = path[i + 1];
|
|
318
|
+
const translation = exports.TRANSLATIONS.find((t) => t.source === src && t.target === dst);
|
|
319
|
+
if (!translation)
|
|
320
|
+
return null;
|
|
321
|
+
current = {
|
|
322
|
+
profile: dst,
|
|
323
|
+
ast: translation.translate(current.ast),
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
return current;
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/profile-bridge/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"construct.d.ts","sourceRoot":"","sources":["../../src/proof-nets/construct.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,QAAQ,EAKd,MAAM,SAAS,CAAC;AAmCjB,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,QAAQ,CAqCrE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Proof Nets — Construcción a partir de un secuente
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Dado ⊢ Γ con Γ una lista de fórmulas MLL, esta construcción
|
|
7
|
+
// produce un net candidato:
|
|
8
|
+
//
|
|
9
|
+
// 1. Para cada fórmula F_i de Γ se construye recursivamente su
|
|
10
|
+
// "árbol de descomposición": cada nodo interno se cablea con
|
|
11
|
+
// el link correspondiente (⊗ o ⅋), terminando en hojas que
|
|
12
|
+
// son átomos.
|
|
13
|
+
// 2. Los átomos hoja se emparejan por pares duales (A con A⊥)
|
|
14
|
+
// vía axiom links. El pairing es greedy: para cada átomo
|
|
15
|
+
// libre busca su primer dual libre.
|
|
16
|
+
//
|
|
17
|
+
// El net producido puede o no ser correcto: si Γ no es probable
|
|
18
|
+
// en MLL la correctitud Danos-Regnier fallará. Las conclusiones
|
|
19
|
+
// son las raíces de los árboles de descomposición.
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.constructFromSequent = constructFromSequent;
|
|
22
|
+
const types_1 = require("./types");
|
|
23
|
+
function freshNode(b, formula) {
|
|
24
|
+
const id = b.nextId++;
|
|
25
|
+
b.nodes.push({ id, formula });
|
|
26
|
+
return id;
|
|
27
|
+
}
|
|
28
|
+
// Construye el árbol de descomposición de `f`. Devuelve el id del
|
|
29
|
+
// nodo raíz y la lista de ids de las hojas-átomo en orden de
|
|
30
|
+
// recorrido en profundidad por la izquierda.
|
|
31
|
+
function buildFormulaTree(b, f) {
|
|
32
|
+
if (f.kind === 'atom') {
|
|
33
|
+
const id = freshNode(b, f);
|
|
34
|
+
return { root: id, atomLeaves: [id] };
|
|
35
|
+
}
|
|
36
|
+
const left = buildFormulaTree(b, f.left);
|
|
37
|
+
const right = buildFormulaTree(b, f.right);
|
|
38
|
+
const root = freshNode(b, f);
|
|
39
|
+
b.links.push({
|
|
40
|
+
kind: f.kind === 'tensor' ? 'tensor' : 'par',
|
|
41
|
+
ports: [left.root, right.root, root],
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
root,
|
|
45
|
+
atomLeaves: [...left.atomLeaves, ...right.atomLeaves],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function constructFromSequent(formulas) {
|
|
49
|
+
const b = { nodes: [], links: [], nextId: 0 };
|
|
50
|
+
const conclusions = [];
|
|
51
|
+
const atomLeaves = [];
|
|
52
|
+
for (const f of formulas) {
|
|
53
|
+
const tree = buildFormulaTree(b, f);
|
|
54
|
+
conclusions.push(tree.root);
|
|
55
|
+
atomLeaves.push(...tree.atomLeaves);
|
|
56
|
+
}
|
|
57
|
+
// Pairing greedy: para cada hoja sin asignar, busca la primera
|
|
58
|
+
// hoja dual sin asignar y crea un axiom link entre ambas.
|
|
59
|
+
const taken = new Set();
|
|
60
|
+
for (const i of atomLeaves) {
|
|
61
|
+
if (taken.has(i))
|
|
62
|
+
continue;
|
|
63
|
+
const fi = b.nodes[i].formula;
|
|
64
|
+
let partner = null;
|
|
65
|
+
for (const j of atomLeaves) {
|
|
66
|
+
if (j === i || taken.has(j))
|
|
67
|
+
continue;
|
|
68
|
+
const fj = b.nodes[j].formula;
|
|
69
|
+
if ((0, types_1.formulaEquals)(fj, (0, types_1.dual)(fi))) {
|
|
70
|
+
partner = j;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (partner === null) {
|
|
75
|
+
// Átomo sin par: se deja libre. El criterio de corrección
|
|
76
|
+
// detectará la inconsistencia (componente desconexa).
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
taken.add(i);
|
|
80
|
+
taken.add(partner);
|
|
81
|
+
b.links.push({ kind: 'axiom', ports: [i, partner] });
|
|
82
|
+
}
|
|
83
|
+
return { nodes: b.nodes, links: b.links, conclusions };
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=construct.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"construct.js","sourceRoot":"","sources":["../../src/proof-nets/construct.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correctness.d.ts","sourceRoot":"","sources":["../../src/proof-nets/correctness.ts"],"names":[],"mappings":"AA+BA,OAAO,EAAmB,KAAK,QAAQ,EAAuB,MAAM,SAAS,CAAC;AA+J9E,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAmBhD"}
|