@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,306 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Higher-order unification — Algoritmo de unificación Miller
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Implementa el fragmento de patrón de la unificación de orden superior.
|
|
7
|
+
// Referencia: Dale Miller, "A Logic Programming Language with Lambda
|
|
8
|
+
// Abstraction, Function Variables, and Simple Unification", 1991.
|
|
9
|
+
//
|
|
10
|
+
// Garantías del fragmento de patrón:
|
|
11
|
+
// - Decidible (siempre termina).
|
|
12
|
+
// - Unicidad: si existe unificador, existe un único MGU (most general
|
|
13
|
+
// unifier) módulo α-equivalencia.
|
|
14
|
+
//
|
|
15
|
+
// Manejo de terms no-patrón:
|
|
16
|
+
// Los pares que involucran meta-variables aplicadas a no-variables o
|
|
17
|
+
// variables repetidas/libres se rechazan (retornan null) para mantener
|
|
18
|
+
// la decidibilidad. Ver `isPattern` en pattern.ts.
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.unifyPattern = unifyPattern;
|
|
21
|
+
exports.buildLambdaBinding = buildLambdaBinding;
|
|
22
|
+
exports.unifyMetaApp = unifyMetaApp;
|
|
23
|
+
const normalize_1 = require("./normalize");
|
|
24
|
+
const pattern_1 = require("./pattern");
|
|
25
|
+
// Unifica dos HOTerms usando el algoritmo de patrón Miller.
|
|
26
|
+
// Devuelve la sustitución de meta-variables (MGU) o null si no unifican.
|
|
27
|
+
function unifyPattern(t1, t2) {
|
|
28
|
+
const subst = {};
|
|
29
|
+
const ok = unify((0, normalize_1.normalize)(t1), (0, normalize_1.normalize)(t2), subst, new Map(), new Map());
|
|
30
|
+
return ok ? subst : null;
|
|
31
|
+
}
|
|
32
|
+
// Función recursiva de unificación.
|
|
33
|
+
// `envL` / `envR` mapean nombres de variables ligadas a índices de De Bruijn
|
|
34
|
+
// para comparación α-invariante de variables ligadas.
|
|
35
|
+
function unify(t1, t2, subst, envL, envR) {
|
|
36
|
+
// Expandir meta-variables si ya tienen binding
|
|
37
|
+
const s1 = deref(t1, subst);
|
|
38
|
+
const s2 = deref(t2, subst);
|
|
39
|
+
// Ambas son meta iguales sin binding → trivialmente iguales
|
|
40
|
+
if (s1.kind === 'meta' && s2.kind === 'meta' && s1.name === s2.name)
|
|
41
|
+
return true;
|
|
42
|
+
// Meta del lado izquierdo
|
|
43
|
+
if (s1.kind === 'meta') {
|
|
44
|
+
return bindMeta(s1.name, s2, subst, envR);
|
|
45
|
+
}
|
|
46
|
+
// Meta del lado derecho
|
|
47
|
+
if (s2.kind === 'meta') {
|
|
48
|
+
return bindMeta(s2.name, s1, subst, envL);
|
|
49
|
+
}
|
|
50
|
+
// Variables libres/ligadas
|
|
51
|
+
if (s1.kind === 'var' && s2.kind === 'var') {
|
|
52
|
+
const i1 = envL.get(s1.name);
|
|
53
|
+
const i2 = envR.get(s2.name);
|
|
54
|
+
if (i1 !== undefined && i2 !== undefined)
|
|
55
|
+
return i1 === i2; // ambas ligadas
|
|
56
|
+
if (i1 === undefined && i2 === undefined)
|
|
57
|
+
return s1.name === s2.name; // ambas libres
|
|
58
|
+
return false; // una ligada, una libre
|
|
59
|
+
}
|
|
60
|
+
// Abstracciones: introducir binder fresco para comparación
|
|
61
|
+
if (s1.kind === 'abs' && s2.kind === 'abs') {
|
|
62
|
+
const idx = envL.size; // índice único para este nivel de ligado
|
|
63
|
+
const newEnvL = new Map(envL);
|
|
64
|
+
newEnvL.set(s1.param, idx);
|
|
65
|
+
const newEnvR = new Map(envR);
|
|
66
|
+
newEnvR.set(s2.param, idx);
|
|
67
|
+
return unify(s1.body, s2.body, subst, newEnvL, newEnvR);
|
|
68
|
+
}
|
|
69
|
+
// Aplicaciones: detectar el caso Miller (meta aplicada a vars ligadas)
|
|
70
|
+
if (s1.kind === 'app' || s2.kind === 'app') {
|
|
71
|
+
const f1 = s1.kind === 'app' ? flatHead(s1) : { fn: s1, args: [] };
|
|
72
|
+
const f2 = s2.kind === 'app' ? flatHead(s2) : { fn: s2, args: [] };
|
|
73
|
+
// Caso Miller: meta en cabeza de una app
|
|
74
|
+
// Verificamos la condición de patrón: args deben ser variables ligadas distintas
|
|
75
|
+
if (f1.fn.kind === 'meta' && f1.fn !== f2.fn) {
|
|
76
|
+
if (!isMetaPatternApp(f1.args, envL))
|
|
77
|
+
return false;
|
|
78
|
+
return bindMetaApp(f1.fn.name, f1.args, s2, subst, envL, envR);
|
|
79
|
+
}
|
|
80
|
+
if (f2.fn.kind === 'meta' && f2.fn !== f1.fn) {
|
|
81
|
+
if (!isMetaPatternApp(f2.args, envR))
|
|
82
|
+
return false;
|
|
83
|
+
return bindMetaApp(f2.fn.name, f2.args, s1, subst, envR, envL);
|
|
84
|
+
}
|
|
85
|
+
// Caso rigid-rigid: ambas cabezas son constructores concretos
|
|
86
|
+
if (s1.kind === 'app' && s2.kind === 'app') {
|
|
87
|
+
if (!unify(f1.fn, f2.fn, subst, envL, envR))
|
|
88
|
+
return false;
|
|
89
|
+
if (f1.args.length !== f2.args.length)
|
|
90
|
+
return false;
|
|
91
|
+
for (let i = 0; i < f1.args.length; i++) {
|
|
92
|
+
if (!unify(f1.args[i], f2.args[i], subst, envL, envR))
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return false; // kinds distintos, no se unifican
|
|
99
|
+
}
|
|
100
|
+
// Verifica que los args de una app con cabeza meta son todas variables
|
|
101
|
+
// ligadas y distintas (condición de patrón Miller).
|
|
102
|
+
function isMetaPatternApp(args, env) {
|
|
103
|
+
const seen = new Set();
|
|
104
|
+
for (const a of args) {
|
|
105
|
+
if (a.kind !== 'var')
|
|
106
|
+
return false;
|
|
107
|
+
const idx = env.get(a.name);
|
|
108
|
+
if (idx === undefined)
|
|
109
|
+
return false; // variable libre, no ligada
|
|
110
|
+
if (seen.has(idx))
|
|
111
|
+
return false; // repetida
|
|
112
|
+
seen.add(idx);
|
|
113
|
+
}
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
// Resuelve el caso Miller: metaName aplicado a [y₁…yₙ] (vars ligadas distintas)
|
|
117
|
+
// debe unificar con `rhs`. Construye M ↦ λy₁…yₙ. rhs' donde rhs' es rhs
|
|
118
|
+
// expresado en términos de los parámetros formales.
|
|
119
|
+
// envMeta es el entorno del lado donde vive la meta; envRhs es el del rhs.
|
|
120
|
+
function bindMetaApp(metaName, metaArgs, rhs, subst, envMeta, envRhs) {
|
|
121
|
+
// Los parámetros formales de la lambda que vamos a construir son
|
|
122
|
+
// los nombres reales de las vars ligadas (de izquierda a derecha).
|
|
123
|
+
const params = metaArgs.map((a) => a.name);
|
|
124
|
+
// Para construir el binding correcto de M, necesitamos reescribir `rhs`
|
|
125
|
+
// sustituyendo las variables del envRhs que corresponden a los params
|
|
126
|
+
// de envMeta por los mismos nombres que usaremos en la lambda.
|
|
127
|
+
// En el caso más simple (mismo conjunto de binders) es la identidad.
|
|
128
|
+
// Construimos: M ↦ λp₁…pₙ. rhs_reescrito
|
|
129
|
+
const lambda = buildLambdaForMeta(params, rhs, envMeta, envRhs);
|
|
130
|
+
if (lambda === null)
|
|
131
|
+
return false;
|
|
132
|
+
// Occurs check
|
|
133
|
+
if (metaOccurs(metaName, lambda, subst))
|
|
134
|
+
return false;
|
|
135
|
+
subst[metaName] = lambda;
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
// Construye λp₁…pₙ. body donde body es `rhs` con las variables ligadas
|
|
139
|
+
// de envRhs que tienen el mismo índice que los params en envMeta
|
|
140
|
+
// renombradas a p₁…pₙ.
|
|
141
|
+
function buildLambdaForMeta(params, rhs, envMeta, envRhs) {
|
|
142
|
+
// Mapeamos índices de De Bruijn del meta → nombre de param formal
|
|
143
|
+
const idxToParam = new Map();
|
|
144
|
+
for (const p of params) {
|
|
145
|
+
const idx = envMeta.get(p);
|
|
146
|
+
if (idx === undefined)
|
|
147
|
+
return null;
|
|
148
|
+
idxToParam.set(idx, p);
|
|
149
|
+
}
|
|
150
|
+
// Renombramos en rhs las variables ligadas cuyos índices correspondan
|
|
151
|
+
// a los parámetros de la meta.
|
|
152
|
+
const body = renameByIndex(rhs, envRhs, idxToParam);
|
|
153
|
+
if (body === null)
|
|
154
|
+
return null;
|
|
155
|
+
// Construir λp₁. λp₂. … body
|
|
156
|
+
let result = body;
|
|
157
|
+
for (let i = params.length - 1; i >= 0; i--) {
|
|
158
|
+
result = { kind: 'abs', param: params[i], body: result };
|
|
159
|
+
}
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
// Renombra las variables libres de `t` (en el sentido de `env`) que tienen
|
|
163
|
+
// un índice en `idxToParam` con el nombre param correspondiente.
|
|
164
|
+
// Devuelve null si alguna variable ligada del scope local no está en
|
|
165
|
+
// idxToParam (implicaría que rhs menciona una variable local que no es
|
|
166
|
+
// argumento del meta → escapa de scope).
|
|
167
|
+
function renameByIndex(t, env, idxToParam) {
|
|
168
|
+
switch (t.kind) {
|
|
169
|
+
case 'meta':
|
|
170
|
+
return t;
|
|
171
|
+
case 'var': {
|
|
172
|
+
const idx = env.get(t.name);
|
|
173
|
+
if (idx === undefined)
|
|
174
|
+
return t; // variable libre del objeto-lenguaje: OK
|
|
175
|
+
const param = idxToParam.get(idx);
|
|
176
|
+
if (param === undefined)
|
|
177
|
+
return null; // ligada local no en scope del meta: escapa
|
|
178
|
+
return { kind: 'var', name: param };
|
|
179
|
+
}
|
|
180
|
+
case 'abs': {
|
|
181
|
+
// El param del abs introduce un índice nuevo; no lo incluimos en env
|
|
182
|
+
// (o usamos un índice negativo para "más interno")
|
|
183
|
+
const newEnv = new Map(env);
|
|
184
|
+
// Damos un índice fresco negativo para indicar "ligada más internamente"
|
|
185
|
+
// que todas las del contexto actual → nunca está en idxToParam.
|
|
186
|
+
const innerIdx = -(newEnv.size + 1);
|
|
187
|
+
newEnv.set(t.param, innerIdx);
|
|
188
|
+
const b = renameByIndex(t.body, newEnv, idxToParam);
|
|
189
|
+
if (b === null)
|
|
190
|
+
return null;
|
|
191
|
+
return { kind: 'abs', param: t.param, body: b };
|
|
192
|
+
}
|
|
193
|
+
case 'app': {
|
|
194
|
+
const fn = renameByIndex(t.fn, env, idxToParam);
|
|
195
|
+
if (fn === null)
|
|
196
|
+
return null;
|
|
197
|
+
const args = [];
|
|
198
|
+
for (const a of t.args) {
|
|
199
|
+
const a2 = renameByIndex(a, env, idxToParam);
|
|
200
|
+
if (a2 === null)
|
|
201
|
+
return null;
|
|
202
|
+
args.push(a2);
|
|
203
|
+
}
|
|
204
|
+
return { kind: 'app', fn, args };
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Aplana app anidadas para facilitar comparación cabeza-argumentos.
|
|
209
|
+
function flatHead(t) {
|
|
210
|
+
if (t.kind !== 'app')
|
|
211
|
+
return { fn: t, args: [] };
|
|
212
|
+
const inner = flatHead(t.fn);
|
|
213
|
+
return { fn: inner.fn, args: [...inner.args, ...t.args] };
|
|
214
|
+
}
|
|
215
|
+
// Expande una meta-variable si tiene binding en subst.
|
|
216
|
+
function deref(t, subst) {
|
|
217
|
+
if (t.kind === 'meta') {
|
|
218
|
+
const binding = subst[t.name];
|
|
219
|
+
if (binding !== undefined)
|
|
220
|
+
return deref((0, normalize_1.normalize)((0, normalize_1.applyHOSubst)(binding, subst)), subst);
|
|
221
|
+
}
|
|
222
|
+
return t;
|
|
223
|
+
}
|
|
224
|
+
// Intenta ligar la meta-variable `metaName` al término `value`.
|
|
225
|
+
// `env` es el entorno de variables ligadas del lado donde vive `value`.
|
|
226
|
+
function bindMeta(metaName, value, subst, env) {
|
|
227
|
+
// Occurs check: la meta no puede aparecer en su propio binding
|
|
228
|
+
if (metaOccurs(metaName, value, subst))
|
|
229
|
+
return false;
|
|
230
|
+
// Verificar que el valor es un pattern en el contexto dado
|
|
231
|
+
// (necesitamos reconstruir el scope de variables ligadas desde `env`)
|
|
232
|
+
const boundScope = new Set(env.keys());
|
|
233
|
+
if (!(0, pattern_1.isPattern)(value, boundScope))
|
|
234
|
+
return false;
|
|
235
|
+
// El binding debe ser cerrado: las variables libres del valor deben
|
|
236
|
+
// estar disponibles en el scope del meta (conservador: aceptamos si
|
|
237
|
+
// las FV son todas libres en el objeto-lenguaje, no ligadas locales
|
|
238
|
+
// que no estarán en scope del meta).
|
|
239
|
+
// Para el fragmento de patrón el check de scope es:
|
|
240
|
+
// FV(value) ∩ bound_vars_local = ∅ (variables ligadas localmente
|
|
241
|
+
// no pueden escapar a través del meta).
|
|
242
|
+
// En nuestro caso `env` contiene exactamente las variables ligadas del
|
|
243
|
+
// lado donde nace `value`; las FV del value que NO están en `env` son
|
|
244
|
+
// variables libres del objeto-lenguaje, que sí pueden aparecer en el
|
|
245
|
+
// binding del meta.
|
|
246
|
+
const fv = (0, normalize_1.freeVarsHO)(value);
|
|
247
|
+
for (const v of fv) {
|
|
248
|
+
if (env.has(v))
|
|
249
|
+
return false; // variable ligada local escapa → rechazar
|
|
250
|
+
}
|
|
251
|
+
subst[metaName] = value;
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
// ¿La meta `name` aparece (directa o transitivamente) en `t`?
|
|
255
|
+
function metaOccurs(name, t, subst) {
|
|
256
|
+
switch (t.kind) {
|
|
257
|
+
case 'var':
|
|
258
|
+
return false;
|
|
259
|
+
case 'meta': {
|
|
260
|
+
if (t.name === name)
|
|
261
|
+
return true;
|
|
262
|
+
const binding = subst[t.name];
|
|
263
|
+
return binding !== undefined ? metaOccurs(name, binding, subst) : false;
|
|
264
|
+
}
|
|
265
|
+
case 'abs':
|
|
266
|
+
return metaOccurs(name, t.body, subst);
|
|
267
|
+
case 'app':
|
|
268
|
+
if (metaOccurs(name, t.fn, subst))
|
|
269
|
+
return true;
|
|
270
|
+
for (const a of t.args) {
|
|
271
|
+
if (metaOccurs(name, a, subst))
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// ---- Utilidad: proyección inversa para meta aplicada a variables ----
|
|
278
|
+
//
|
|
279
|
+
// Cuando se une M[y₁…yₙ] ≈ body (pattern case), el MGU es
|
|
280
|
+
// M ↦ λy₁…yₙ. body
|
|
281
|
+
// Esta función construye ese lambda dado el binding encontrado.
|
|
282
|
+
function buildLambdaBinding(params, body, avoidNames) {
|
|
283
|
+
// Usamos los params tal cual; si hay conflictos de nombres en body,
|
|
284
|
+
// la sustitución capture-avoiding de applyHOSubst se encarga.
|
|
285
|
+
let result = body;
|
|
286
|
+
for (let i = params.length - 1; i >= 0; i--) {
|
|
287
|
+
const p = params[i];
|
|
288
|
+
result = { kind: 'abs', param: p, body: result };
|
|
289
|
+
}
|
|
290
|
+
void avoidNames; // reservado para extensión
|
|
291
|
+
return result;
|
|
292
|
+
}
|
|
293
|
+
// Unifica M aplicada a variables ligadas con un cuerpo.
|
|
294
|
+
// Caso central del fragmento Miller: (M y₁ … yₙ) ≈ body
|
|
295
|
+
// donde yᵢ son variables ligadas distintas.
|
|
296
|
+
// Retorna HOSubst con M ↦ λy₁…yₙ. body, o null si no es patrón.
|
|
297
|
+
function unifyMetaApp(metaName, boundVars, body) {
|
|
298
|
+
// Verificar que boundVars son distintos
|
|
299
|
+
if (new Set(boundVars).size !== boundVars.length)
|
|
300
|
+
return null;
|
|
301
|
+
// Construir la abstracción
|
|
302
|
+
const avoid = (0, normalize_1.allNamesHO)(body);
|
|
303
|
+
const lambda = buildLambdaBinding(boundVars, body, avoid);
|
|
304
|
+
return { [metaName]: lambda };
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=unify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unify.js","sourceRoot":"","sources":["../../src/higher-order-unify/unify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { type Env, type Neutral, type Term, type Type, type Value, alphaEq, ap, apN, lam, tArr, tBase, termToString, typeEq, typeToString, v, vClosure, vNeutral, vNeutralVar, } from './types';
|
|
2
|
+
export { apply, evaluate, makeFreshSupply, normalize, reify } from './nbe';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nbe/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,GAAG,EACR,KAAK,OAAO,EACZ,KAAK,IAAI,EACT,KAAK,IAAI,EACT,KAAK,KAAK,EACV,OAAO,EACP,EAAE,EACF,GAAG,EACH,GAAG,EACH,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,CAAC,EACD,QAAQ,EACR,QAAQ,EACR,WAAW,GACZ,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Punto de entrada público del módulo NbE.
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.reify = exports.normalize = exports.makeFreshSupply = exports.evaluate = exports.apply = exports.vNeutralVar = exports.vNeutral = exports.vClosure = exports.v = exports.typeToString = exports.typeEq = exports.termToString = exports.tBase = exports.tArr = exports.lam = exports.apN = exports.ap = exports.alphaEq = void 0;
|
|
5
|
+
var types_1 = require("./types");
|
|
6
|
+
Object.defineProperty(exports, "alphaEq", { enumerable: true, get: function () { return types_1.alphaEq; } });
|
|
7
|
+
Object.defineProperty(exports, "ap", { enumerable: true, get: function () { return types_1.ap; } });
|
|
8
|
+
Object.defineProperty(exports, "apN", { enumerable: true, get: function () { return types_1.apN; } });
|
|
9
|
+
Object.defineProperty(exports, "lam", { enumerable: true, get: function () { return types_1.lam; } });
|
|
10
|
+
Object.defineProperty(exports, "tArr", { enumerable: true, get: function () { return types_1.tArr; } });
|
|
11
|
+
Object.defineProperty(exports, "tBase", { enumerable: true, get: function () { return types_1.tBase; } });
|
|
12
|
+
Object.defineProperty(exports, "termToString", { enumerable: true, get: function () { return types_1.termToString; } });
|
|
13
|
+
Object.defineProperty(exports, "typeEq", { enumerable: true, get: function () { return types_1.typeEq; } });
|
|
14
|
+
Object.defineProperty(exports, "typeToString", { enumerable: true, get: function () { return types_1.typeToString; } });
|
|
15
|
+
Object.defineProperty(exports, "v", { enumerable: true, get: function () { return types_1.v; } });
|
|
16
|
+
Object.defineProperty(exports, "vClosure", { enumerable: true, get: function () { return types_1.vClosure; } });
|
|
17
|
+
Object.defineProperty(exports, "vNeutral", { enumerable: true, get: function () { return types_1.vNeutral; } });
|
|
18
|
+
Object.defineProperty(exports, "vNeutralVar", { enumerable: true, get: function () { return types_1.vNeutralVar; } });
|
|
19
|
+
var nbe_1 = require("./nbe");
|
|
20
|
+
Object.defineProperty(exports, "apply", { enumerable: true, get: function () { return nbe_1.apply; } });
|
|
21
|
+
Object.defineProperty(exports, "evaluate", { enumerable: true, get: function () { return nbe_1.evaluate; } });
|
|
22
|
+
Object.defineProperty(exports, "makeFreshSupply", { enumerable: true, get: function () { return nbe_1.makeFreshSupply; } });
|
|
23
|
+
Object.defineProperty(exports, "normalize", { enumerable: true, get: function () { return nbe_1.normalize; } });
|
|
24
|
+
Object.defineProperty(exports, "reify", { enumerable: true, get: function () { return nbe_1.reify; } });
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nbe/index.ts"],"names":[],"mappings":";AAAA,2CAA2C;;;AAE3C,iCAmBiB;AAbf,gGAAA,OAAO,OAAA;AACP,2FAAA,EAAE,OAAA;AACF,4FAAA,GAAG,OAAA;AACH,4FAAA,GAAG,OAAA;AACH,6FAAA,IAAI,OAAA;AACJ,8FAAA,KAAK,OAAA;AACL,qGAAA,YAAY,OAAA;AACZ,+FAAA,MAAM,OAAA;AACN,qGAAA,YAAY,OAAA;AACZ,0FAAA,CAAC,OAAA;AACD,iGAAA,QAAQ,OAAA;AACR,iGAAA,QAAQ,OAAA;AACR,oGAAA,WAAW,OAAA;AAGb,6BAA2E;AAAlE,4FAAA,KAAK,OAAA;AAAE,+FAAA,QAAQ,OAAA;AAAE,sGAAA,eAAe,OAAA;AAAE,gGAAA,SAAS,OAAA;AAAE,4FAAA,KAAK,OAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Env, type Term, type Type, type Value } from './types';
|
|
2
|
+
export declare function makeFreshSupply(prefix?: string): () => string;
|
|
3
|
+
export declare function apply(fn: Value, arg: Value): Value;
|
|
4
|
+
export declare function evaluate(t: Term, env: Env): Value;
|
|
5
|
+
export declare function reify(value: Value, type: Type, freshSupply: () => string): Term;
|
|
6
|
+
export declare function normalize(t: Term, type: Type, freshSupply?: () => string): Term;
|
|
7
|
+
//# sourceMappingURL=nbe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nbe.d.ts","sourceRoot":"","sources":["../../src/nbe/nbe.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,KAAK,GAAG,EAER,KAAK,IAAI,EACT,KAAK,IAAI,EACT,KAAK,KAAK,EAIX,MAAM,SAAS,CAAC;AAKjB,wBAAgB,eAAe,CAAC,MAAM,SAAO,GAAG,MAAM,MAAM,CAG3D;AAMD,wBAAgB,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,KAAK,CASlD;AAGD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,KAAK,CAiBjD;AAKD,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,MAAM,GAAG,IAAI,CAgB/E;AA8BD,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAI/E"}
|
package/dist/nbe/nbe.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// NbE — Normalization by Evaluation para STLC
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Idea:
|
|
7
|
+
// - evaluate :: Term × Env → Value
|
|
8
|
+
// interpreta el término en el dominio semántico, donde las
|
|
9
|
+
// variables libres y aplicaciones atascadas viven como
|
|
10
|
+
// "neutrales" y las λ se vuelven clausuras nativas de TS.
|
|
11
|
+
// - reify :: Value × Type → Term
|
|
12
|
+
// baja un valor a un término en β-normal forma η-larga,
|
|
13
|
+
// guiándose por el tipo. La η-expansión emerge de "aplicar"
|
|
14
|
+
// el valor a una variable fresca cuando el tipo es flecha.
|
|
15
|
+
// - normalize = reify ∘ evaluate
|
|
16
|
+
//
|
|
17
|
+
// Resultado: forma normal única (β-corta η-larga) por término bien
|
|
18
|
+
// tipado, sin enumerar reducciones explícitas.
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.makeFreshSupply = makeFreshSupply;
|
|
21
|
+
exports.apply = apply;
|
|
22
|
+
exports.evaluate = evaluate;
|
|
23
|
+
exports.reify = reify;
|
|
24
|
+
exports.normalize = normalize;
|
|
25
|
+
const types_1 = require("./types");
|
|
26
|
+
// ---------- Generador de nombres frescos ----------
|
|
27
|
+
// Generador determinístico: dado el mismo input, mismo output.
|
|
28
|
+
// El estado vive en el closure devuelto.
|
|
29
|
+
function makeFreshSupply(prefix = '_x') {
|
|
30
|
+
let n = 0;
|
|
31
|
+
return () => `${prefix}${n++}`;
|
|
32
|
+
}
|
|
33
|
+
// ---------- Aplicación semántica ----------
|
|
34
|
+
// Aplica un Value a otro Value. Si la cabeza es una clausura,
|
|
35
|
+
// β-reduce ahora mismo (extiende el entorno). Si es un neutral,
|
|
36
|
+
// queda atascado como aplicación neutral.
|
|
37
|
+
function apply(fn, arg) {
|
|
38
|
+
if (fn.kind === 'closure') {
|
|
39
|
+
const newEnv = new Map(fn.env);
|
|
40
|
+
newEnv.set(fn.param, arg);
|
|
41
|
+
return evaluate(fn.body, newEnv);
|
|
42
|
+
}
|
|
43
|
+
// fn.kind === 'neutral'
|
|
44
|
+
const head = { kind: 'app', head: fn.head, arg };
|
|
45
|
+
return (0, types_1.vNeutral)(head);
|
|
46
|
+
}
|
|
47
|
+
// ---------- Evaluador ----------
|
|
48
|
+
function evaluate(t, env) {
|
|
49
|
+
switch (t.kind) {
|
|
50
|
+
case 'var': {
|
|
51
|
+
const bound = env.get(t.name);
|
|
52
|
+
// Variable libre → neutral. Variable ligada → valor del entorno.
|
|
53
|
+
if (bound === undefined)
|
|
54
|
+
return (0, types_1.vNeutralVar)(t.name);
|
|
55
|
+
return bound;
|
|
56
|
+
}
|
|
57
|
+
case 'abs':
|
|
58
|
+
// Captura del entorno en clausura — la β-reducción se hará al aplicar.
|
|
59
|
+
return (0, types_1.vClosure)(env, t.param, t.paramType, t.body);
|
|
60
|
+
case 'app': {
|
|
61
|
+
const fnV = evaluate(t.fn, env);
|
|
62
|
+
const argV = evaluate(t.arg, env);
|
|
63
|
+
return apply(fnV, argV);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// ---------- Reificación ----------
|
|
68
|
+
// Trae el valor de vuelta a la sintaxis en forma normal η-larga.
|
|
69
|
+
// El tipo dirige la reificación: en cada arrow type η-expandimos.
|
|
70
|
+
function reify(value, type, freshSupply) {
|
|
71
|
+
if (type.kind === 'arrow') {
|
|
72
|
+
// η-expansión: λy:A. reify (apply value (var y)) : B
|
|
73
|
+
const y = freshSupply();
|
|
74
|
+
const body = reify(apply(value, (0, types_1.vNeutralVar)(y)), type.to, freshSupply);
|
|
75
|
+
return { kind: 'abs', param: y, paramType: type.from, body };
|
|
76
|
+
}
|
|
77
|
+
// type.kind === 'base'
|
|
78
|
+
if (value.kind === 'neutral') {
|
|
79
|
+
return reifyNeutral(value.head, freshSupply);
|
|
80
|
+
}
|
|
81
|
+
// Inalcanzable bajo tipado correcto: una clausura debería tener
|
|
82
|
+
// tipo flecha. Si esto pasa, el caller pasó un tipo equivocado.
|
|
83
|
+
throw new Error('NbE.reify: clausura encontrada en tipo base — el tipo no corresponde al término');
|
|
84
|
+
}
|
|
85
|
+
function reifyNeutral(n, freshSupply) {
|
|
86
|
+
if (n.kind === 'var')
|
|
87
|
+
return { kind: 'var', name: n.name };
|
|
88
|
+
// Aplicación neutral: el argumento se reifica sin saber su tipo
|
|
89
|
+
// exacto, pero como construimos siempre desde apply(...) sobre
|
|
90
|
+
// valores η-largos, basta con bajar recursivamente.
|
|
91
|
+
return {
|
|
92
|
+
kind: 'app',
|
|
93
|
+
fn: reifyNeutral(n.head, freshSupply),
|
|
94
|
+
arg: reifyValueUntyped(n.arg, freshSupply),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// Reificación sin tipo, usada dentro de spines neutrales donde el
|
|
98
|
+
// argumento ya está en forma normal por construcción (vino de
|
|
99
|
+
// evaluar un subtérmino y de aplicarse a neutrales). En el peor caso
|
|
100
|
+
// devuelve la forma "honesta" del valor.
|
|
101
|
+
function reifyValueUntyped(value, freshSupply) {
|
|
102
|
+
if (value.kind === 'neutral')
|
|
103
|
+
return reifyNeutral(value.head, freshSupply);
|
|
104
|
+
// Clausura sin tipo conocido: la bajamos β-normal honestamente
|
|
105
|
+
// aplicándola a una variable fresca (η-1 expansión local).
|
|
106
|
+
const y = freshSupply();
|
|
107
|
+
const body = reifyValueUntyped(apply(value, (0, types_1.vNeutralVar)(y)), freshSupply);
|
|
108
|
+
return { kind: 'abs', param: y, paramType: value.paramType, body };
|
|
109
|
+
}
|
|
110
|
+
// ---------- Normalización ----------
|
|
111
|
+
// NbE clásico: evalúa, luego reifica al tipo objetivo.
|
|
112
|
+
// Si no se pasa supply, se crea uno determinístico fresco por llamada.
|
|
113
|
+
function normalize(t, type, freshSupply) {
|
|
114
|
+
const supply = freshSupply ?? makeFreshSupply();
|
|
115
|
+
const v = evaluate(t, new Map());
|
|
116
|
+
return reify(v, type, supply);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=nbe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nbe.js","sourceRoot":"","sources":["../../src/nbe/nbe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export type Type = {
|
|
2
|
+
kind: 'base';
|
|
3
|
+
name: string;
|
|
4
|
+
} | {
|
|
5
|
+
kind: 'arrow';
|
|
6
|
+
from: Type;
|
|
7
|
+
to: Type;
|
|
8
|
+
};
|
|
9
|
+
export type Term = {
|
|
10
|
+
kind: 'var';
|
|
11
|
+
name: string;
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'abs';
|
|
14
|
+
param: string;
|
|
15
|
+
paramType: Type;
|
|
16
|
+
body: Term;
|
|
17
|
+
} | {
|
|
18
|
+
kind: 'app';
|
|
19
|
+
fn: Term;
|
|
20
|
+
arg: Term;
|
|
21
|
+
};
|
|
22
|
+
export type Value = {
|
|
23
|
+
kind: 'neutral';
|
|
24
|
+
head: Neutral;
|
|
25
|
+
} | {
|
|
26
|
+
kind: 'closure';
|
|
27
|
+
env: Env;
|
|
28
|
+
param: string;
|
|
29
|
+
paramType: Type;
|
|
30
|
+
body: Term;
|
|
31
|
+
};
|
|
32
|
+
export type Neutral = {
|
|
33
|
+
kind: 'var';
|
|
34
|
+
name: string;
|
|
35
|
+
} | {
|
|
36
|
+
kind: 'app';
|
|
37
|
+
head: Neutral;
|
|
38
|
+
arg: Value;
|
|
39
|
+
};
|
|
40
|
+
export type Env = Map<string, Value>;
|
|
41
|
+
export declare const tBase: (name: string) => Type;
|
|
42
|
+
export declare const tArr: (from: Type, to: Type) => Type;
|
|
43
|
+
export declare const v: (name: string) => Term;
|
|
44
|
+
export declare const lam: (param: string, paramType: Type, body: Term) => Term;
|
|
45
|
+
export declare const ap: (fn: Term, arg: Term) => Term;
|
|
46
|
+
export declare const apN: (head: Term, ...args: Term[]) => Term;
|
|
47
|
+
export declare const vNeutralVar: (name: string) => Value;
|
|
48
|
+
export declare const vNeutral: (head: Neutral) => Value;
|
|
49
|
+
export declare const vClosure: (env: Env, param: string, paramType: Type, body: Term) => Value;
|
|
50
|
+
export declare function alphaEq(a: Term, b: Term): boolean;
|
|
51
|
+
export declare function typeEq(a: Type, b: Type): boolean;
|
|
52
|
+
export declare function typeToString(t: Type): string;
|
|
53
|
+
export declare function termToString(t: Term): string;
|
|
54
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/nbe/types.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,IAAI,CAAA;CAAE,CAAC;AAE5F,MAAM,MAAM,IAAI,GACZ;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,CAAC;AAMzC,MAAM,MAAM,KAAK,GACb;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAE9E,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,KAAK,CAAA;CAAE,CAAC;AAEjG,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAGrC,eAAO,MAAM,KAAK,GAAI,MAAM,MAAM,KAAG,IAAgC,CAAC;AACtE,eAAO,MAAM,IAAI,GAAI,MAAM,IAAI,EAAE,IAAI,IAAI,KAAG,IAAqC,CAAC;AAElF,eAAO,MAAM,CAAC,GAAI,MAAM,MAAM,KAAG,IAA+B,CAAC;AACjE,eAAO,MAAM,GAAG,GAAI,OAAO,MAAM,EAAE,WAAW,IAAI,EAAE,MAAM,IAAI,KAAG,IAK/D,CAAC;AACH,eAAO,MAAM,EAAE,GAAI,IAAI,IAAI,EAAE,KAAK,IAAI,KAAG,IAAkC,CAAC;AAC5E,eAAO,MAAM,GAAG,GAAI,MAAM,IAAI,EAAE,GAAG,MAAM,IAAI,EAAE,KAAG,IAA6B,CAAC;AAGhF,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,KAGzC,CAAC;AACH,eAAO,MAAM,QAAQ,GAAI,MAAM,OAAO,KAAG,KAAoC,CAAC;AAC9E,eAAO,MAAM,QAAQ,GAAI,KAAK,GAAG,EAAE,OAAO,MAAM,EAAE,WAAW,IAAI,EAAE,MAAM,IAAI,KAAG,KAM9E,CAAC;AAIH,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAEjD;AAsCD,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAOhD;AAGD,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAK5C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAY5C"}
|