@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,39 @@
|
|
|
1
|
+
import type { Category, MorId } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Objeto FinSet = nombre + conjunto de elementos. El nombre actúa
|
|
4
|
+
* como identidad estable; los elementos viven como strings.
|
|
5
|
+
*/
|
|
6
|
+
export interface FinSetObj {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly elements: ReadonlyArray<string>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Morfismo FinSet: función total entre los elementos de src y tgt.
|
|
12
|
+
* `id` es la clave única en `morphisms`. Construirla via
|
|
13
|
+
* `mkFinSetMor` garantiza coherencia con la categoría.
|
|
14
|
+
*/
|
|
15
|
+
export interface FinSetMor {
|
|
16
|
+
readonly id: MorId;
|
|
17
|
+
readonly src: string;
|
|
18
|
+
readonly tgt: string;
|
|
19
|
+
readonly fn: ReadonlyMap<string, string>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Construye un morfismo en FinSet validando que `fn` cubra
|
|
23
|
+
* todos los elementos del dominio y que sus imágenes vivan en el
|
|
24
|
+
* codominio. Lanza si el cliente intenta crear una función parcial
|
|
25
|
+
* o con valores fuera de tgt.
|
|
26
|
+
*/
|
|
27
|
+
export declare function mkFinSetMor(name: string, src: FinSetObj, tgt: FinSetObj, table: Record<string, string> | ReadonlyMap<string, string>): FinSetMor;
|
|
28
|
+
/**
|
|
29
|
+
* Construye FinSet sobre un conjunto explícito de objetos y morfismos.
|
|
30
|
+
* Cierra automáticamente bajo identidades y composiciones (transitive
|
|
31
|
+
* closure) para que `verifyAssociativity` no falle por morfismos
|
|
32
|
+
* intermedios faltantes.
|
|
33
|
+
*
|
|
34
|
+
* `maxClosureSteps` limita la expansión por seguridad cuando la
|
|
35
|
+
* categoría tiene ciclos densos; default 4 es suficiente para
|
|
36
|
+
* todos los tests del módulo.
|
|
37
|
+
*/
|
|
38
|
+
export declare function FinSet(objs: ReadonlyArray<FinSetObj>, generators?: ReadonlyArray<FinSetMor>, maxClosureSteps?: number): Category<FinSetObj, FinSetMor>;
|
|
39
|
+
//# sourceMappingURL=fin-set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fin-set.d.ts","sourceRoot":"","sources":["../../src/categorical/fin-set.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1D,SAAS,CAuBX;AAED;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CACpB,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,EAC9B,UAAU,GAAE,aAAa,CAAC,SAAS,CAAM,EACzC,eAAe,SAAI,GAClB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CA4JhC"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ST Categorical — FinSet
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Categoría de conjuntos finitos (representados como objetos
|
|
6
|
+
// nombrados con su carrier explícito) y funciones totales entre
|
|
7
|
+
// ellos. Los morfismos llevan un mapa `fn: Map<string,string>`
|
|
8
|
+
// para que la igualdad e identidad sean computables.
|
|
9
|
+
// ============================================================
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.mkFinSetMor = mkFinSetMor;
|
|
12
|
+
exports.FinSet = FinSet;
|
|
13
|
+
/**
|
|
14
|
+
* Construye un morfismo en FinSet validando que `fn` cubra
|
|
15
|
+
* todos los elementos del dominio y que sus imágenes vivan en el
|
|
16
|
+
* codominio. Lanza si el cliente intenta crear una función parcial
|
|
17
|
+
* o con valores fuera de tgt.
|
|
18
|
+
*/
|
|
19
|
+
function mkFinSetMor(name, src, tgt, table) {
|
|
20
|
+
const fn = new Map();
|
|
21
|
+
const tgtSet = new Set(tgt.elements);
|
|
22
|
+
const tableMap = table instanceof Map
|
|
23
|
+
? table
|
|
24
|
+
: new Map(Object.entries(table));
|
|
25
|
+
for (const x of src.elements) {
|
|
26
|
+
const y = tableMap.get(x);
|
|
27
|
+
if (y === undefined) {
|
|
28
|
+
throw new Error(`FinSet morphism ${name}: missing image for ${x} ∈ ${src.name}`);
|
|
29
|
+
}
|
|
30
|
+
if (!tgtSet.has(y)) {
|
|
31
|
+
throw new Error(`FinSet morphism ${name}: image ${y} of ${x} not in target ${tgt.name}`);
|
|
32
|
+
}
|
|
33
|
+
fn.set(x, y);
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
id: `${src.name}→${tgt.name}:${name}`,
|
|
37
|
+
src: src.name,
|
|
38
|
+
tgt: tgt.name,
|
|
39
|
+
fn,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Construye FinSet sobre un conjunto explícito de objetos y morfismos.
|
|
44
|
+
* Cierra automáticamente bajo identidades y composiciones (transitive
|
|
45
|
+
* closure) para que `verifyAssociativity` no falle por morfismos
|
|
46
|
+
* intermedios faltantes.
|
|
47
|
+
*
|
|
48
|
+
* `maxClosureSteps` limita la expansión por seguridad cuando la
|
|
49
|
+
* categoría tiene ciclos densos; default 4 es suficiente para
|
|
50
|
+
* todos los tests del módulo.
|
|
51
|
+
*/
|
|
52
|
+
function FinSet(objs, generators = [], maxClosureSteps = 4) {
|
|
53
|
+
const objsByName = new Map(objs.map((o) => [o.name, o]));
|
|
54
|
+
const morphisms = new Map();
|
|
55
|
+
const objectsSet = new Set(objs);
|
|
56
|
+
function getObj(name) {
|
|
57
|
+
const o = objsByName.get(name);
|
|
58
|
+
if (!o)
|
|
59
|
+
throw new Error(`FinSet: unknown object ${name}`);
|
|
60
|
+
return o;
|
|
61
|
+
}
|
|
62
|
+
function addMor(m) {
|
|
63
|
+
const existing = morphisms.get(m.id);
|
|
64
|
+
if (existing)
|
|
65
|
+
return existing;
|
|
66
|
+
morphisms.set(m.id, m);
|
|
67
|
+
return m;
|
|
68
|
+
}
|
|
69
|
+
// identidades
|
|
70
|
+
for (const o of objs) {
|
|
71
|
+
const fn = new Map();
|
|
72
|
+
for (const x of o.elements)
|
|
73
|
+
fn.set(x, x);
|
|
74
|
+
addMor({ id: `${o.name}→${o.name}:id`, src: o.name, tgt: o.name, fn });
|
|
75
|
+
}
|
|
76
|
+
for (const g of generators)
|
|
77
|
+
addMor(g);
|
|
78
|
+
// composición concreta (no necesita la categoría)
|
|
79
|
+
function rawCompose(g, f) {
|
|
80
|
+
if (f.tgt !== g.src) {
|
|
81
|
+
throw new Error(`FinSet compose: dom mismatch ${f.id} ; ${g.id}`);
|
|
82
|
+
}
|
|
83
|
+
const src = getObj(f.src);
|
|
84
|
+
const tgt = getObj(g.tgt);
|
|
85
|
+
const fn = new Map();
|
|
86
|
+
for (const x of src.elements) {
|
|
87
|
+
const fx = f.fn.get(x);
|
|
88
|
+
const gfx = g.fn.get(fx);
|
|
89
|
+
fn.set(x, gfx);
|
|
90
|
+
}
|
|
91
|
+
// El nombre canónico de la composición es g∘f. Si ese morfismo
|
|
92
|
+
// ya está registrado con otro nombre y misma tabla, lo reusamos
|
|
93
|
+
// para que la igualdad sea robusta.
|
|
94
|
+
const candidate = {
|
|
95
|
+
id: `${src.name}→${tgt.name}:${g.id.split(':').pop()}∘${f.id.split(':').pop()}`,
|
|
96
|
+
src: src.name,
|
|
97
|
+
tgt: tgt.name,
|
|
98
|
+
fn,
|
|
99
|
+
};
|
|
100
|
+
// ¿Ya existe un morfismo con misma tabla? -> reutilizar id
|
|
101
|
+
for (const existing of morphisms.values()) {
|
|
102
|
+
if (existing.src === candidate.src &&
|
|
103
|
+
existing.tgt === candidate.tgt &&
|
|
104
|
+
tablesEqual(existing.fn, fn)) {
|
|
105
|
+
return existing;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
morphisms.set(candidate.id, candidate);
|
|
109
|
+
return candidate;
|
|
110
|
+
}
|
|
111
|
+
// Cierre por composición acotado
|
|
112
|
+
for (let step = 0; step < maxClosureSteps; step++) {
|
|
113
|
+
const snapshot = Array.from(morphisms.values());
|
|
114
|
+
let added = false;
|
|
115
|
+
for (const f of snapshot) {
|
|
116
|
+
for (const g of snapshot) {
|
|
117
|
+
if (f.tgt !== g.src)
|
|
118
|
+
continue;
|
|
119
|
+
const before = morphisms.size;
|
|
120
|
+
rawCompose(g, f);
|
|
121
|
+
if (morphisms.size > before)
|
|
122
|
+
added = true;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (!added)
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
function identity(obj) {
|
|
129
|
+
return morphisms.get(`${obj.name}→${obj.name}:id`);
|
|
130
|
+
}
|
|
131
|
+
function compose(g, f) {
|
|
132
|
+
return rawCompose(g, f);
|
|
133
|
+
}
|
|
134
|
+
function source(m) {
|
|
135
|
+
return getObj(m.src);
|
|
136
|
+
}
|
|
137
|
+
function target(m) {
|
|
138
|
+
return getObj(m.tgt);
|
|
139
|
+
}
|
|
140
|
+
function eqMor(a, b) {
|
|
141
|
+
if (a.src !== b.src || a.tgt !== b.tgt)
|
|
142
|
+
return false;
|
|
143
|
+
return tablesEqual(a.fn, b.fn);
|
|
144
|
+
}
|
|
145
|
+
function eqObj(a, b) {
|
|
146
|
+
return a.name === b.name;
|
|
147
|
+
}
|
|
148
|
+
function hom(a, b) {
|
|
149
|
+
const out = [];
|
|
150
|
+
for (const m of morphisms.values()) {
|
|
151
|
+
if (m.src === a.name && m.tgt === b.name)
|
|
152
|
+
out.push(m);
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
function verifyAssociativity(sample = 50) {
|
|
157
|
+
const ms = Array.from(morphisms.values());
|
|
158
|
+
let checked = 0;
|
|
159
|
+
for (const f of ms) {
|
|
160
|
+
for (const g of ms) {
|
|
161
|
+
if (g.src !== f.tgt)
|
|
162
|
+
continue;
|
|
163
|
+
for (const h of ms) {
|
|
164
|
+
if (h.src !== g.tgt)
|
|
165
|
+
continue;
|
|
166
|
+
// (h∘g)∘f === h∘(g∘f)
|
|
167
|
+
const left = compose(compose(h, g), f);
|
|
168
|
+
const right = compose(h, compose(g, f));
|
|
169
|
+
if (!eqMor(left, right))
|
|
170
|
+
return false;
|
|
171
|
+
if (++checked >= sample)
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
function verifyIdentity(sample = 50) {
|
|
179
|
+
const ms = Array.from(morphisms.values());
|
|
180
|
+
let checked = 0;
|
|
181
|
+
for (const f of ms) {
|
|
182
|
+
const idSrc = identity(getObj(f.src));
|
|
183
|
+
const idTgt = identity(getObj(f.tgt));
|
|
184
|
+
if (!eqMor(compose(f, idSrc), f))
|
|
185
|
+
return false;
|
|
186
|
+
if (!eqMor(compose(idTgt, f), f))
|
|
187
|
+
return false;
|
|
188
|
+
if (++checked >= sample)
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
name: 'FinSet',
|
|
195
|
+
objects: objectsSet,
|
|
196
|
+
morphisms,
|
|
197
|
+
identity,
|
|
198
|
+
compose,
|
|
199
|
+
source,
|
|
200
|
+
target,
|
|
201
|
+
eqMor,
|
|
202
|
+
eqObj,
|
|
203
|
+
hom,
|
|
204
|
+
verifyAssociativity,
|
|
205
|
+
verifyIdentity,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function tablesEqual(a, b) {
|
|
209
|
+
if (a.size !== b.size)
|
|
210
|
+
return false;
|
|
211
|
+
for (const [k, v] of a) {
|
|
212
|
+
if (b.get(k) !== v)
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=fin-set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fin-set.js","sourceRoot":"","sources":["../../src/categorical/fin-set.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Category, MorId } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Morfismo de la categoría libre = path. Representamos un path
|
|
4
|
+
* como la lista de nombres de aristas (o vacío para la identidad)
|
|
5
|
+
* junto con su origen y destino.
|
|
6
|
+
*/
|
|
7
|
+
export interface FreeMor {
|
|
8
|
+
readonly id: MorId;
|
|
9
|
+
readonly src: string;
|
|
10
|
+
readonly tgt: string;
|
|
11
|
+
readonly path: ReadonlyArray<string>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Construye la categoría libre. `generators` es una lista de tripletas
|
|
15
|
+
* `[from, to, name]` donde `name` debe ser único globalmente.
|
|
16
|
+
*
|
|
17
|
+
* `maxLength` acota la longitud máxima de paths considerados al
|
|
18
|
+
* "materializar" la categoría como `Map<MorId, FreeMor>`. Esto es
|
|
19
|
+
* inevitable: la categoría libre sobre un grafo con ciclos es
|
|
20
|
+
* infinita. Para tests usamos `maxLength=3`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function Free(vertices: ReadonlyArray<string>, generators: ReadonlyArray<readonly [string, string, string]>, maxLength?: number): Category<string, FreeMor>;
|
|
23
|
+
//# sourceMappingURL=free.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"free.d.ts","sourceRoot":"","sources":["../../src/categorical/free.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACtC;AAED;;;;;;;;GAQG;AACH,wBAAgB,IAAI,CAClB,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAC/B,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAC5D,SAAS,SAAI,GACZ,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAsI3B"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ST Categorical — Categoría libre sobre un grafo
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Dado un grafo dirigido (vertices + aristas con nombres),
|
|
6
|
+
// construye la categoría libre cuyos morfismos son paths
|
|
7
|
+
// (cadenas de aristas componibles), módulo la equivalencia
|
|
8
|
+
// asociativa con la identidad como path vacío.
|
|
9
|
+
// ============================================================
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.Free = Free;
|
|
12
|
+
/**
|
|
13
|
+
* Construye la categoría libre. `generators` es una lista de tripletas
|
|
14
|
+
* `[from, to, name]` donde `name` debe ser único globalmente.
|
|
15
|
+
*
|
|
16
|
+
* `maxLength` acota la longitud máxima de paths considerados al
|
|
17
|
+
* "materializar" la categoría como `Map<MorId, FreeMor>`. Esto es
|
|
18
|
+
* inevitable: la categoría libre sobre un grafo con ciclos es
|
|
19
|
+
* infinita. Para tests usamos `maxLength=3`.
|
|
20
|
+
*/
|
|
21
|
+
function Free(vertices, generators, maxLength = 3) {
|
|
22
|
+
const edgesByName = new Map();
|
|
23
|
+
const edgesByFrom = new Map();
|
|
24
|
+
for (const v of vertices)
|
|
25
|
+
edgesByFrom.set(v, []);
|
|
26
|
+
for (const [from, to, name] of generators) {
|
|
27
|
+
if (edgesByName.has(name))
|
|
28
|
+
throw new Error(`Free: duplicate edge name ${name}`);
|
|
29
|
+
edgesByName.set(name, { from, to });
|
|
30
|
+
if (!edgesByFrom.has(from))
|
|
31
|
+
edgesByFrom.set(from, []);
|
|
32
|
+
edgesByFrom.get(from).push({ name, to });
|
|
33
|
+
}
|
|
34
|
+
const morphisms = new Map();
|
|
35
|
+
const objectsSet = new Set(vertices);
|
|
36
|
+
function pathId(src, tgt, path) {
|
|
37
|
+
return `${src}→${tgt}:[${path.join(',')}]`;
|
|
38
|
+
}
|
|
39
|
+
// Identidades
|
|
40
|
+
for (const v of vertices) {
|
|
41
|
+
const id = pathId(v, v, []);
|
|
42
|
+
morphisms.set(id, { id, src: v, tgt: v, path: [] });
|
|
43
|
+
}
|
|
44
|
+
// Generadores
|
|
45
|
+
for (const [from, to, name] of generators) {
|
|
46
|
+
const id = pathId(from, to, [name]);
|
|
47
|
+
morphisms.set(id, { id, src: from, tgt: to, path: [name] });
|
|
48
|
+
}
|
|
49
|
+
// Composiciones acotadas (paths hasta maxLength)
|
|
50
|
+
function enumerate(from, length) {
|
|
51
|
+
if (length === 0)
|
|
52
|
+
return [{ to: from, path: [] }];
|
|
53
|
+
const out = [];
|
|
54
|
+
for (const { name, to } of edgesByFrom.get(from) ?? []) {
|
|
55
|
+
for (const rest of enumerate(to, length - 1)) {
|
|
56
|
+
out.push({ to: rest.to, path: [name, ...rest.path] });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
for (const v of vertices) {
|
|
62
|
+
for (let len = 2; len <= maxLength; len++) {
|
|
63
|
+
for (const { to, path } of enumerate(v, len)) {
|
|
64
|
+
const id = pathId(v, to, path);
|
|
65
|
+
if (!morphisms.has(id)) {
|
|
66
|
+
morphisms.set(id, { id, src: v, tgt: to, path });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function identity(obj) {
|
|
72
|
+
return morphisms.get(pathId(obj, obj, []));
|
|
73
|
+
}
|
|
74
|
+
function compose(g, f) {
|
|
75
|
+
if (f.tgt !== g.src) {
|
|
76
|
+
throw new Error(`Free compose: dom mismatch ${f.id} ; ${g.id}`);
|
|
77
|
+
}
|
|
78
|
+
const path = [...f.path, ...g.path];
|
|
79
|
+
const id = pathId(f.src, g.tgt, path);
|
|
80
|
+
const cached = morphisms.get(id);
|
|
81
|
+
if (cached)
|
|
82
|
+
return cached;
|
|
83
|
+
// Si excede maxLength, lo registramos on-demand para que la
|
|
84
|
+
// categoría se comporte cerrada bajo composición; el cliente
|
|
85
|
+
// que pase tests pesados puede subir maxLength.
|
|
86
|
+
const m = { id, src: f.src, tgt: g.tgt, path };
|
|
87
|
+
morphisms.set(id, m);
|
|
88
|
+
return m;
|
|
89
|
+
}
|
|
90
|
+
function source(m) {
|
|
91
|
+
return m.src;
|
|
92
|
+
}
|
|
93
|
+
function target(m) {
|
|
94
|
+
return m.tgt;
|
|
95
|
+
}
|
|
96
|
+
function eqMor(a, b) {
|
|
97
|
+
if (a.src !== b.src || a.tgt !== b.tgt)
|
|
98
|
+
return false;
|
|
99
|
+
if (a.path.length !== b.path.length)
|
|
100
|
+
return false;
|
|
101
|
+
for (let i = 0; i < a.path.length; i++)
|
|
102
|
+
if (a.path[i] !== b.path[i])
|
|
103
|
+
return false;
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
function eqObj(a, b) {
|
|
107
|
+
return a === b;
|
|
108
|
+
}
|
|
109
|
+
function hom(a, b) {
|
|
110
|
+
const out = [];
|
|
111
|
+
for (const m of morphisms.values()) {
|
|
112
|
+
if (m.src === a && m.tgt === b)
|
|
113
|
+
out.push(m);
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
function verifyAssociativity(sample = 50) {
|
|
118
|
+
const ms = Array.from(morphisms.values());
|
|
119
|
+
let checked = 0;
|
|
120
|
+
for (const f of ms) {
|
|
121
|
+
for (const g of ms) {
|
|
122
|
+
if (g.src !== f.tgt)
|
|
123
|
+
continue;
|
|
124
|
+
for (const h of ms) {
|
|
125
|
+
if (h.src !== g.tgt)
|
|
126
|
+
continue;
|
|
127
|
+
const left = compose(compose(h, g), f);
|
|
128
|
+
const right = compose(h, compose(g, f));
|
|
129
|
+
if (!eqMor(left, right))
|
|
130
|
+
return false;
|
|
131
|
+
if (++checked >= sample)
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
function verifyIdentity(sample = 50) {
|
|
139
|
+
const ms = Array.from(morphisms.values());
|
|
140
|
+
let checked = 0;
|
|
141
|
+
for (const f of ms) {
|
|
142
|
+
const idSrc = identity(f.src);
|
|
143
|
+
const idTgt = identity(f.tgt);
|
|
144
|
+
if (!eqMor(compose(f, idSrc), f))
|
|
145
|
+
return false;
|
|
146
|
+
if (!eqMor(compose(idTgt, f), f))
|
|
147
|
+
return false;
|
|
148
|
+
if (++checked >= sample)
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
name: 'Free',
|
|
155
|
+
objects: objectsSet,
|
|
156
|
+
morphisms,
|
|
157
|
+
identity,
|
|
158
|
+
compose,
|
|
159
|
+
source,
|
|
160
|
+
target,
|
|
161
|
+
eqMor,
|
|
162
|
+
eqObj,
|
|
163
|
+
hom,
|
|
164
|
+
verifyAssociativity,
|
|
165
|
+
verifyIdentity,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=free.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"free.js","sourceRoot":"","sources":["../../src/categorical/free.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Category, Functor, NaturalTransformation } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Crea un functor verificable. El cliente pasa los mapeos a
|
|
4
|
+
* objetos/morfismos; las verificaciones de leyes se derivan
|
|
5
|
+
* recorriendo los `morphisms` de la categoría fuente.
|
|
6
|
+
*/
|
|
7
|
+
export declare function mkFunctor<O1, M1, O2, M2>(opts: {
|
|
8
|
+
name: string;
|
|
9
|
+
source: Category<O1, M1>;
|
|
10
|
+
target: Category<O2, M2>;
|
|
11
|
+
onObjects: (o: O1) => O2;
|
|
12
|
+
onMorphisms: (m: M1) => M2;
|
|
13
|
+
}): Functor<O1, M1, O2, M2>;
|
|
14
|
+
/**
|
|
15
|
+
* Functor identidad `Id_C : C → C`. Útil para tests y como elemento
|
|
16
|
+
* neutro de la composición de functores.
|
|
17
|
+
*/
|
|
18
|
+
export declare function identityFunctor<O, M>(cat: Category<O, M>): Functor<O, M, O, M>;
|
|
19
|
+
/**
|
|
20
|
+
* Composición de functores F ; G = G ∘ F. La firma respeta la
|
|
21
|
+
* categoría source/target original sin perder información de tipos.
|
|
22
|
+
*/
|
|
23
|
+
export declare function composeFunctors<O1, M1, O2, M2, O3, M3>(G: Functor<O2, M2, O3, M3>, F: Functor<O1, M1, O2, M2>): Functor<O1, M1, O3, M3>;
|
|
24
|
+
/**
|
|
25
|
+
* Crea una transformación natural η : F ⇒ G verificando su
|
|
26
|
+
* naturalidad por muestreo. El cliente pasa la familia de
|
|
27
|
+
* componentes `component(a) : F(a) → G(a)`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function mkNaturalTransformation<O1, M1, O2, M2>(opts: {
|
|
30
|
+
name: string;
|
|
31
|
+
source: Functor<O1, M1, O2, M2>;
|
|
32
|
+
target: Functor<O1, M1, O2, M2>;
|
|
33
|
+
component: (o: O1) => M2;
|
|
34
|
+
}): NaturalTransformation<O1, M1, O2, M2>;
|
|
35
|
+
/**
|
|
36
|
+
* Transformación natural identidad `id_F : F ⇒ F` con componentes
|
|
37
|
+
* `id_{F(a)}`. Sirve como elemento neutro de composición vertical.
|
|
38
|
+
*/
|
|
39
|
+
export declare function identityNT<O1, M1, O2, M2>(F: Functor<O1, M1, O2, M2>): NaturalTransformation<O1, M1, O2, M2>;
|
|
40
|
+
//# sourceMappingURL=functor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functor.d.ts","sourceRoot":"","sources":["../../src/categorical/functor.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACzB,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACzB,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;IACzB,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;CAC5B,GAAG,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAwC1B;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAQ9E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EACpD,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAC1B,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GACzB,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAazB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;CAC1B,GAAG,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CA4BxC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EACvC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GACzB,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAOvC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ST Categorical — Functor y NaturalTransformation
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Wrappers genéricos para construir functores entre categorías
|
|
6
|
+
// arbitrarias y verificar sus leyes vía muestreo sobre los
|
|
7
|
+
// morfismos del dominio.
|
|
8
|
+
// ============================================================
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.mkFunctor = mkFunctor;
|
|
11
|
+
exports.identityFunctor = identityFunctor;
|
|
12
|
+
exports.composeFunctors = composeFunctors;
|
|
13
|
+
exports.mkNaturalTransformation = mkNaturalTransformation;
|
|
14
|
+
exports.identityNT = identityNT;
|
|
15
|
+
/**
|
|
16
|
+
* Crea un functor verificable. El cliente pasa los mapeos a
|
|
17
|
+
* objetos/morfismos; las verificaciones de leyes se derivan
|
|
18
|
+
* recorriendo los `morphisms` de la categoría fuente.
|
|
19
|
+
*/
|
|
20
|
+
function mkFunctor(opts) {
|
|
21
|
+
const { name, source, target, onObjects, onMorphisms } = opts;
|
|
22
|
+
function verifyIdentityPreservation() {
|
|
23
|
+
for (const o of source.objects) {
|
|
24
|
+
const idC = source.identity(o);
|
|
25
|
+
const Fid = onMorphisms(idC);
|
|
26
|
+
const idDFo = target.identity(onObjects(o));
|
|
27
|
+
if (!target.eqMor(Fid, idDFo))
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
function verifyComposition(sample = 50) {
|
|
33
|
+
const ms = Array.from(source.morphisms.values());
|
|
34
|
+
let checked = 0;
|
|
35
|
+
for (const f of ms) {
|
|
36
|
+
for (const g of ms) {
|
|
37
|
+
if (!source.eqObj(source.target(f), source.source(g)))
|
|
38
|
+
continue;
|
|
39
|
+
const gf = source.compose(g, f);
|
|
40
|
+
const Fgf = onMorphisms(gf);
|
|
41
|
+
const Fg = onMorphisms(g);
|
|
42
|
+
const Ff = onMorphisms(f);
|
|
43
|
+
const FgFf = target.compose(Fg, Ff);
|
|
44
|
+
if (!target.eqMor(Fgf, FgFf))
|
|
45
|
+
return false;
|
|
46
|
+
if (++checked >= sample)
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
name,
|
|
54
|
+
source,
|
|
55
|
+
target,
|
|
56
|
+
onObjects,
|
|
57
|
+
onMorphisms,
|
|
58
|
+
verifyIdentityPreservation,
|
|
59
|
+
verifyComposition,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Functor identidad `Id_C : C → C`. Útil para tests y como elemento
|
|
64
|
+
* neutro de la composición de functores.
|
|
65
|
+
*/
|
|
66
|
+
function identityFunctor(cat) {
|
|
67
|
+
return mkFunctor({
|
|
68
|
+
name: `Id_${cat.name}`,
|
|
69
|
+
source: cat,
|
|
70
|
+
target: cat,
|
|
71
|
+
onObjects: (o) => o,
|
|
72
|
+
onMorphisms: (m) => m,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Composición de functores F ; G = G ∘ F. La firma respeta la
|
|
77
|
+
* categoría source/target original sin perder información de tipos.
|
|
78
|
+
*/
|
|
79
|
+
function composeFunctors(G, F) {
|
|
80
|
+
if (F.target !== G.source) {
|
|
81
|
+
// Permitido si son la misma categoría por valor; pero como las
|
|
82
|
+
// categorías son objetos, exigimos identidad referencial.
|
|
83
|
+
throw new Error(`composeFunctors: F.target (${F.target.name}) !== G.source (${G.source.name})`);
|
|
84
|
+
}
|
|
85
|
+
return mkFunctor({
|
|
86
|
+
name: `${G.name}∘${F.name}`,
|
|
87
|
+
source: F.source,
|
|
88
|
+
target: G.target,
|
|
89
|
+
onObjects: (o) => G.onObjects(F.onObjects(o)),
|
|
90
|
+
onMorphisms: (m) => G.onMorphisms(F.onMorphisms(m)),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Crea una transformación natural η : F ⇒ G verificando su
|
|
95
|
+
* naturalidad por muestreo. El cliente pasa la familia de
|
|
96
|
+
* componentes `component(a) : F(a) → G(a)`.
|
|
97
|
+
*/
|
|
98
|
+
function mkNaturalTransformation(opts) {
|
|
99
|
+
const { name, source: F, target: G, component } = opts;
|
|
100
|
+
if (F.source !== G.source || F.target !== G.target) {
|
|
101
|
+
throw new Error('mkNaturalTransformation: F and G must be parallel functors');
|
|
102
|
+
}
|
|
103
|
+
const C = F.source;
|
|
104
|
+
const D = F.target;
|
|
105
|
+
function verifyNaturality(sample = 50) {
|
|
106
|
+
const ms = Array.from(C.morphisms.values());
|
|
107
|
+
let checked = 0;
|
|
108
|
+
for (const f of ms) {
|
|
109
|
+
const a = C.source(f);
|
|
110
|
+
const b = C.target(f);
|
|
111
|
+
const etaA = component(a);
|
|
112
|
+
const etaB = component(b);
|
|
113
|
+
const Gf = G.onMorphisms(f);
|
|
114
|
+
const Ff = F.onMorphisms(f);
|
|
115
|
+
// G(f) ∘ η_a vs η_b ∘ F(f)
|
|
116
|
+
const left = D.compose(Gf, etaA);
|
|
117
|
+
const right = D.compose(etaB, Ff);
|
|
118
|
+
if (!D.eqMor(left, right))
|
|
119
|
+
return false;
|
|
120
|
+
if (++checked >= sample)
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
return { name, source: F, target: G, component, verifyNaturality };
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Transformación natural identidad `id_F : F ⇒ F` con componentes
|
|
129
|
+
* `id_{F(a)}`. Sirve como elemento neutro de composición vertical.
|
|
130
|
+
*/
|
|
131
|
+
function identityNT(F) {
|
|
132
|
+
return mkNaturalTransformation({
|
|
133
|
+
name: `id_${F.name}`,
|
|
134
|
+
source: F,
|
|
135
|
+
target: F,
|
|
136
|
+
component: (a) => F.target.identity(F.onObjects(a)),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=functor.js.map
|