@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.
Files changed (185) hide show
  1. package/dist/categorical/fin-set.d.ts +39 -0
  2. package/dist/categorical/fin-set.d.ts.map +1 -0
  3. package/dist/categorical/fin-set.js +217 -0
  4. package/dist/categorical/fin-set.js.map +1 -0
  5. package/dist/categorical/free.d.ts +23 -0
  6. package/dist/categorical/free.d.ts.map +1 -0
  7. package/dist/categorical/free.js +168 -0
  8. package/dist/categorical/free.js.map +1 -0
  9. package/dist/categorical/functor.d.ts +40 -0
  10. package/dist/categorical/functor.d.ts.map +1 -0
  11. package/dist/categorical/functor.js +139 -0
  12. package/dist/categorical/functor.js.map +1 -0
  13. package/dist/categorical/index.d.ts +11 -0
  14. package/dist/categorical/index.d.ts.map +1 -0
  15. package/dist/categorical/index.js +33 -0
  16. package/dist/categorical/index.js.map +1 -0
  17. package/dist/categorical/limits.d.ts +64 -0
  18. package/dist/categorical/limits.d.ts.map +1 -0
  19. package/dist/categorical/limits.js +248 -0
  20. package/dist/categorical/limits.js.map +1 -0
  21. package/dist/categorical/monoidal.d.ts +14 -0
  22. package/dist/categorical/monoidal.d.ts.map +1 -0
  23. package/dist/categorical/monoidal.js +148 -0
  24. package/dist/categorical/monoidal.js.map +1 -0
  25. package/dist/categorical/poset.d.ts +14 -0
  26. package/dist/categorical/poset.d.ts.map +1 -0
  27. package/dist/categorical/poset.js +115 -0
  28. package/dist/categorical/poset.js.map +1 -0
  29. package/dist/categorical/types.d.ts +111 -0
  30. package/dist/categorical/types.d.ts.map +1 -0
  31. package/dist/categorical/types.js +15 -0
  32. package/dist/categorical/types.js.map +1 -0
  33. package/dist/csp-hoare/analysis.d.ts +51 -0
  34. package/dist/csp-hoare/analysis.d.ts.map +1 -0
  35. package/dist/csp-hoare/analysis.js +317 -0
  36. package/dist/csp-hoare/analysis.js.map +1 -0
  37. package/dist/csp-hoare/examples.d.ts +33 -0
  38. package/dist/csp-hoare/examples.d.ts.map +1 -0
  39. package/dist/csp-hoare/examples.js +108 -0
  40. package/dist/csp-hoare/examples.js.map +1 -0
  41. package/dist/csp-hoare/index.d.ts +6 -0
  42. package/dist/csp-hoare/index.d.ts.map +1 -0
  43. package/dist/csp-hoare/index.js +50 -0
  44. package/dist/csp-hoare/index.js.map +1 -0
  45. package/dist/csp-hoare/semantics.d.ts +49 -0
  46. package/dist/csp-hoare/semantics.d.ts.map +1 -0
  47. package/dist/csp-hoare/semantics.js +494 -0
  48. package/dist/csp-hoare/semantics.js.map +1 -0
  49. package/dist/csp-hoare/types.d.ts +60 -0
  50. package/dist/csp-hoare/types.d.ts.map +1 -0
  51. package/dist/csp-hoare/types.js +31 -0
  52. package/dist/csp-hoare/types.js.map +1 -0
  53. package/dist/hindley-milner/index.d.ts +7 -0
  54. package/dist/hindley-milner/index.d.ts.map +1 -0
  55. package/dist/hindley-milner/index.js +60 -0
  56. package/dist/hindley-milner/index.js.map +1 -0
  57. package/dist/hindley-milner/infer.d.ts +26 -0
  58. package/dist/hindley-milner/infer.d.ts.map +1 -0
  59. package/dist/hindley-milner/infer.js +278 -0
  60. package/dist/hindley-milner/infer.js.map +1 -0
  61. package/dist/hindley-milner/substitution.d.ts +21 -0
  62. package/dist/hindley-milner/substitution.d.ts.map +1 -0
  63. package/dist/hindley-milner/substitution.js +215 -0
  64. package/dist/hindley-milner/substitution.js.map +1 -0
  65. package/dist/hindley-milner/types.d.ts +84 -0
  66. package/dist/hindley-milner/types.d.ts.map +1 -0
  67. package/dist/hindley-milner/types.js +166 -0
  68. package/dist/hindley-milner/types.js.map +1 -0
  69. package/dist/hott/equality.d.ts +4 -0
  70. package/dist/hott/equality.d.ts.map +1 -0
  71. package/dist/hott/equality.js +108 -0
  72. package/dist/hott/equality.js.map +1 -0
  73. package/dist/hott/index.d.ts +13 -0
  74. package/dist/hott/index.d.ts.map +1 -0
  75. package/dist/hott/index.js +77 -0
  76. package/dist/hott/index.js.map +1 -0
  77. package/dist/hott/infer.d.ts +11 -0
  78. package/dist/hott/infer.d.ts.map +1 -0
  79. package/dist/hott/infer.js +465 -0
  80. package/dist/hott/infer.js.map +1 -0
  81. package/dist/hott/normalize.d.ts +5 -0
  82. package/dist/hott/normalize.d.ts.map +1 -0
  83. package/dist/hott/normalize.js +240 -0
  84. package/dist/hott/normalize.js.map +1 -0
  85. package/dist/hott/path-algebra.d.ts +25 -0
  86. package/dist/hott/path-algebra.d.ts.map +1 -0
  87. package/dist/hott/path-algebra.js +67 -0
  88. package/dist/hott/path-algebra.js.map +1 -0
  89. package/dist/hott/substitute.d.ts +3 -0
  90. package/dist/hott/substitute.d.ts.map +1 -0
  91. package/dist/hott/substitute.js +131 -0
  92. package/dist/hott/substitute.js.map +1 -0
  93. package/dist/hott/types.d.ts +126 -0
  94. package/dist/hott/types.d.ts.map +1 -0
  95. package/dist/hott/types.js +346 -0
  96. package/dist/hott/types.js.map +1 -0
  97. package/dist/index.d.ts +7 -0
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +48 -3
  100. package/dist/index.js.map +1 -1
  101. package/dist/lemma-synthesis/index.d.ts +124 -0
  102. package/dist/lemma-synthesis/index.d.ts.map +1 -0
  103. package/dist/lemma-synthesis/index.js +640 -0
  104. package/dist/lemma-synthesis/index.js.map +1 -0
  105. package/dist/tactic-dsl/combinators.d.ts +6 -0
  106. package/dist/tactic-dsl/combinators.d.ts.map +1 -0
  107. package/dist/tactic-dsl/combinators.js +98 -0
  108. package/dist/tactic-dsl/combinators.js.map +1 -0
  109. package/dist/tactic-dsl/index.d.ts +39 -0
  110. package/dist/tactic-dsl/index.d.ts.map +1 -0
  111. package/dist/tactic-dsl/index.js +162 -0
  112. package/dist/tactic-dsl/index.js.map +1 -0
  113. package/dist/tactic-dsl/tactics.d.ts +21 -0
  114. package/dist/tactic-dsl/tactics.d.ts.map +1 -0
  115. package/dist/tactic-dsl/tactics.js +536 -0
  116. package/dist/tactic-dsl/tactics.js.map +1 -0
  117. package/dist/tactic-dsl/types.d.ts +54 -0
  118. package/dist/tactic-dsl/types.d.ts.map +1 -0
  119. package/dist/tactic-dsl/types.js +226 -0
  120. package/dist/tactic-dsl/types.js.map +1 -0
  121. package/dist/tests/categorical/categorical.test.d.ts +2 -0
  122. package/dist/tests/categorical/categorical.test.d.ts.map +1 -0
  123. package/dist/tests/categorical/categorical.test.js +300 -0
  124. package/dist/tests/categorical/categorical.test.js.map +1 -0
  125. package/dist/tests/csp-hoare/csp-hoare.test.d.ts +2 -0
  126. package/dist/tests/csp-hoare/csp-hoare.test.d.ts.map +1 -0
  127. package/dist/tests/csp-hoare/csp-hoare.test.js +313 -0
  128. package/dist/tests/csp-hoare/csp-hoare.test.js.map +1 -0
  129. package/dist/tests/hindley-milner/hindley-milner.test.d.ts +2 -0
  130. package/dist/tests/hindley-milner/hindley-milner.test.d.ts.map +1 -0
  131. package/dist/tests/hindley-milner/hindley-milner.test.js +327 -0
  132. package/dist/tests/hindley-milner/hindley-milner.test.js.map +1 -0
  133. package/dist/tests/hott/hott.test.d.ts +2 -0
  134. package/dist/tests/hott/hott.test.d.ts.map +1 -0
  135. package/dist/tests/hott/hott.test.js +271 -0
  136. package/dist/tests/hott/hott.test.js.map +1 -0
  137. package/dist/tests/lemma-synthesis/lemma-synthesis.test.d.ts +2 -0
  138. package/dist/tests/lemma-synthesis/lemma-synthesis.test.d.ts.map +1 -0
  139. package/dist/tests/lemma-synthesis/lemma-synthesis.test.js +460 -0
  140. package/dist/tests/lemma-synthesis/lemma-synthesis.test.js.map +1 -0
  141. package/dist/tests/tactic-dsl/tactic-dsl.test.d.ts +2 -0
  142. package/dist/tests/tactic-dsl/tactic-dsl.test.d.ts.map +1 -0
  143. package/dist/tests/tactic-dsl/tactic-dsl.test.js +259 -0
  144. package/dist/tests/tactic-dsl/tactic-dsl.test.js.map +1 -0
  145. package/dist/tests/tptp/bridge.test.d.ts +2 -0
  146. package/dist/tests/tptp/bridge.test.d.ts.map +1 -0
  147. package/dist/tests/tptp/bridge.test.js +154 -0
  148. package/dist/tests/tptp/bridge.test.js.map +1 -0
  149. package/dist/tests/tptp/emitter.test.d.ts +2 -0
  150. package/dist/tests/tptp/emitter.test.d.ts.map +1 -0
  151. package/dist/tests/tptp/emitter.test.js +128 -0
  152. package/dist/tests/tptp/emitter.test.js.map +1 -0
  153. package/dist/tests/tptp/parser.test.d.ts +2 -0
  154. package/dist/tests/tptp/parser.test.d.ts.map +1 -0
  155. package/dist/tests/tptp/parser.test.js +192 -0
  156. package/dist/tests/tptp/parser.test.js.map +1 -0
  157. package/dist/tests/tptp/tokenizer.test.d.ts +2 -0
  158. package/dist/tests/tptp/tokenizer.test.d.ts.map +1 -0
  159. package/dist/tests/tptp/tokenizer.test.js +60 -0
  160. package/dist/tests/tptp/tokenizer.test.js.map +1 -0
  161. package/dist/tptp/ast.d.ts +73 -0
  162. package/dist/tptp/ast.d.ts.map +1 -0
  163. package/dist/tptp/ast.js +35 -0
  164. package/dist/tptp/ast.js.map +1 -0
  165. package/dist/tptp/bridge.d.ts +14 -0
  166. package/dist/tptp/bridge.d.ts.map +1 -0
  167. package/dist/tptp/bridge.js +146 -0
  168. package/dist/tptp/bridge.js.map +1 -0
  169. package/dist/tptp/emitter.d.ts +5 -0
  170. package/dist/tptp/emitter.d.ts.map +1 -0
  171. package/dist/tptp/emitter.js +103 -0
  172. package/dist/tptp/emitter.js.map +1 -0
  173. package/dist/tptp/index.d.ts +7 -0
  174. package/dist/tptp/index.d.ts.map +1 -0
  175. package/dist/tptp/index.js +31 -0
  176. package/dist/tptp/index.js.map +1 -0
  177. package/dist/tptp/parser.d.ts +23 -0
  178. package/dist/tptp/parser.d.ts.map +1 -0
  179. package/dist/tptp/parser.js +440 -0
  180. package/dist/tptp/parser.js.map +1 -0
  181. package/dist/tptp/tokenizer.d.ts +14 -0
  182. package/dist/tptp/tokenizer.d.ts.map +1 -0
  183. package/dist/tptp/tokenizer.js +264 -0
  184. package/dist/tptp/tokenizer.js.map +1 -0
  185. package/package.json +4 -1
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // Hindley-Milner — Punto de entrada público
4
+ // ============================================================
5
+ //
6
+ // Sistema de tipos let-polimórfico (Damas-Milner). Provee:
7
+ // - Sintaxis: Type, TypeScheme, Expr, TypeEnv.
8
+ // - Constructores breves: tVar, tConst, tArrow, tApp, eLam, eApp,
9
+ // eLet, eLetRec, eIf, eLit, eVar.
10
+ // - Algoritmo W: algorithmW / infer / inferScheme.
11
+ // - Unificación y sustituciones: unify, applySubst, composeSubsts,
12
+ // freshTypeVar, generalize, instantiate.
13
+ // - Entorno inicial con primitivos (+, ==, pair, cons, ...).
14
+ // - normalizeScheme: renombra tvars ligadas a a, b, c, ... para
15
+ // comparación estable en tests.
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.normalizeScheme = exports.initialEnv = exports.isInferError = exports.inferScheme = exports.infer = exports.algorithmW = exports.instantiate = exports.generalize = exports.isUnifyError = exports.unify = exports.occursIn = exports.resetFreshSupply = exports.freshTypeVar = exports.composeSubsts = exports.applySubstScheme = exports.applySubst = exports.emptySubst = exports.schemeToString = exports.typeToString = exports.schemeFreeVars = exports.typeFreeVars = exports.TStr = exports.TBool = exports.TInt = exports.eIf = exports.eLetRec = exports.eLet = exports.eLam = exports.eAppN = exports.eApp = exports.eLit = exports.eVar = exports.mono = exports.scheme = exports.tApp = exports.tArrow = exports.tConst = exports.tVar = exports.TypeEnv = void 0;
18
+ var types_1 = require("./types");
19
+ Object.defineProperty(exports, "TypeEnv", { enumerable: true, get: function () { return types_1.TypeEnv; } });
20
+ Object.defineProperty(exports, "tVar", { enumerable: true, get: function () { return types_1.tVar; } });
21
+ Object.defineProperty(exports, "tConst", { enumerable: true, get: function () { return types_1.tConst; } });
22
+ Object.defineProperty(exports, "tArrow", { enumerable: true, get: function () { return types_1.tArrow; } });
23
+ Object.defineProperty(exports, "tApp", { enumerable: true, get: function () { return types_1.tApp; } });
24
+ Object.defineProperty(exports, "scheme", { enumerable: true, get: function () { return types_1.scheme; } });
25
+ Object.defineProperty(exports, "mono", { enumerable: true, get: function () { return types_1.mono; } });
26
+ Object.defineProperty(exports, "eVar", { enumerable: true, get: function () { return types_1.eVar; } });
27
+ Object.defineProperty(exports, "eLit", { enumerable: true, get: function () { return types_1.eLit; } });
28
+ Object.defineProperty(exports, "eApp", { enumerable: true, get: function () { return types_1.eApp; } });
29
+ Object.defineProperty(exports, "eAppN", { enumerable: true, get: function () { return types_1.eAppN; } });
30
+ Object.defineProperty(exports, "eLam", { enumerable: true, get: function () { return types_1.eLam; } });
31
+ Object.defineProperty(exports, "eLet", { enumerable: true, get: function () { return types_1.eLet; } });
32
+ Object.defineProperty(exports, "eLetRec", { enumerable: true, get: function () { return types_1.eLetRec; } });
33
+ Object.defineProperty(exports, "eIf", { enumerable: true, get: function () { return types_1.eIf; } });
34
+ Object.defineProperty(exports, "TInt", { enumerable: true, get: function () { return types_1.TInt; } });
35
+ Object.defineProperty(exports, "TBool", { enumerable: true, get: function () { return types_1.TBool; } });
36
+ Object.defineProperty(exports, "TStr", { enumerable: true, get: function () { return types_1.TStr; } });
37
+ Object.defineProperty(exports, "typeFreeVars", { enumerable: true, get: function () { return types_1.typeFreeVars; } });
38
+ Object.defineProperty(exports, "schemeFreeVars", { enumerable: true, get: function () { return types_1.schemeFreeVars; } });
39
+ Object.defineProperty(exports, "typeToString", { enumerable: true, get: function () { return types_1.typeToString; } });
40
+ Object.defineProperty(exports, "schemeToString", { enumerable: true, get: function () { return types_1.schemeToString; } });
41
+ var substitution_1 = require("./substitution");
42
+ Object.defineProperty(exports, "emptySubst", { enumerable: true, get: function () { return substitution_1.emptySubst; } });
43
+ Object.defineProperty(exports, "applySubst", { enumerable: true, get: function () { return substitution_1.applySubst; } });
44
+ Object.defineProperty(exports, "applySubstScheme", { enumerable: true, get: function () { return substitution_1.applySubstScheme; } });
45
+ Object.defineProperty(exports, "composeSubsts", { enumerable: true, get: function () { return substitution_1.composeSubsts; } });
46
+ Object.defineProperty(exports, "freshTypeVar", { enumerable: true, get: function () { return substitution_1.freshTypeVar; } });
47
+ Object.defineProperty(exports, "resetFreshSupply", { enumerable: true, get: function () { return substitution_1.resetFreshSupply; } });
48
+ Object.defineProperty(exports, "occursIn", { enumerable: true, get: function () { return substitution_1.occursIn; } });
49
+ Object.defineProperty(exports, "unify", { enumerable: true, get: function () { return substitution_1.unify; } });
50
+ Object.defineProperty(exports, "isUnifyError", { enumerable: true, get: function () { return substitution_1.isUnifyError; } });
51
+ Object.defineProperty(exports, "generalize", { enumerable: true, get: function () { return substitution_1.generalize; } });
52
+ Object.defineProperty(exports, "instantiate", { enumerable: true, get: function () { return substitution_1.instantiate; } });
53
+ var infer_1 = require("./infer");
54
+ Object.defineProperty(exports, "algorithmW", { enumerable: true, get: function () { return infer_1.algorithmW; } });
55
+ Object.defineProperty(exports, "infer", { enumerable: true, get: function () { return infer_1.infer; } });
56
+ Object.defineProperty(exports, "inferScheme", { enumerable: true, get: function () { return infer_1.inferScheme; } });
57
+ Object.defineProperty(exports, "isInferError", { enumerable: true, get: function () { return infer_1.isInferError; } });
58
+ Object.defineProperty(exports, "initialEnv", { enumerable: true, get: function () { return infer_1.initialEnv; } });
59
+ Object.defineProperty(exports, "normalizeScheme", { enumerable: true, get: function () { return infer_1.normalizeScheme; } });
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hindley-milner/index.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,4CAA4C;AAC5C,+DAA+D;AAC/D,EAAE;AACF,2DAA2D;AAC3D,iDAAiD;AACjD,oEAAoE;AACpE,sCAAsC;AACtC,qDAAqD;AACrD,qEAAqE;AACrE,6CAA6C;AAC7C,+DAA+D;AAC/D,kEAAkE;AAClE,oCAAoC;;;AAMpC,iCAuBiB;AAtBf,gGAAA,OAAO,OAAA;AACP,6FAAA,IAAI,OAAA;AACJ,+FAAA,MAAM,OAAA;AACN,+FAAA,MAAM,OAAA;AACN,6FAAA,IAAI,OAAA;AACJ,+FAAA,MAAM,OAAA;AACN,6FAAA,IAAI,OAAA;AACJ,6FAAA,IAAI,OAAA;AACJ,6FAAA,IAAI,OAAA;AACJ,6FAAA,IAAI,OAAA;AACJ,8FAAA,KAAK,OAAA;AACL,6FAAA,IAAI,OAAA;AACJ,6FAAA,IAAI,OAAA;AACJ,gGAAA,OAAO,OAAA;AACP,4FAAA,GAAG,OAAA;AACH,6FAAA,IAAI,OAAA;AACJ,8FAAA,KAAK,OAAA;AACL,6FAAA,IAAI,OAAA;AACJ,qGAAA,YAAY,OAAA;AACZ,uGAAA,cAAc,OAAA;AACd,qGAAA,YAAY,OAAA;AACZ,uGAAA,cAAc,OAAA;AAGhB,+CAYwB;AAXtB,0GAAA,UAAU,OAAA;AACV,0GAAA,UAAU,OAAA;AACV,gHAAA,gBAAgB,OAAA;AAChB,6GAAA,aAAa,OAAA;AACb,4GAAA,YAAY,OAAA;AACZ,gHAAA,gBAAgB,OAAA;AAChB,wGAAA,QAAQ,OAAA;AACR,qGAAA,KAAK,OAAA;AACL,4GAAA,YAAY,OAAA;AACZ,0GAAA,UAAU,OAAA;AACV,2GAAA,WAAW,OAAA;AAGb,iCAAoG;AAA3F,mGAAA,UAAU,OAAA;AAAE,8FAAA,KAAK,OAAA;AAAE,oGAAA,WAAW,OAAA;AAAE,qGAAA,YAAY,OAAA;AAAE,mGAAA,UAAU,OAAA;AAAE,wGAAA,eAAe,OAAA"}
@@ -0,0 +1,26 @@
1
+ import type { Expr, Type, TypeScheme } from './types';
2
+ import { TypeEnv } from './types';
3
+ import type { Substitution } from './substitution';
4
+ export interface InferResult {
5
+ type: Type;
6
+ subst: Substitution;
7
+ }
8
+ export type InferOutcome = InferResult | {
9
+ error: string;
10
+ };
11
+ export declare function isInferError(r: InferOutcome): r is {
12
+ error: string;
13
+ };
14
+ export declare function initialEnv(): TypeEnv;
15
+ export declare function algorithmW(expr: Expr, env: TypeEnv): InferOutcome;
16
+ export declare function infer(expr: Expr, env?: TypeEnv): InferOutcome;
17
+ export interface InferSchemeResult {
18
+ scheme: TypeScheme;
19
+ subst: Substitution;
20
+ type: Type;
21
+ }
22
+ export declare function inferScheme(expr: Expr, env?: TypeEnv): InferSchemeResult | {
23
+ error: string;
24
+ };
25
+ export declare function normalizeScheme(sc: TypeScheme): TypeScheme;
26
+ //# sourceMappingURL=infer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infer.d.ts","sourceRoot":"","sources":["../../src/hindley-milner/infer.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAqB,OAAO,EAA4C,MAAM,SAAS,CAAC;AAC/F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAanD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC,IAAI;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAEpE;AAOD,wBAAgB,UAAU,IAAI,OAAO,CA+CpC;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAG,YAAY,CAsHjE;AAQD,wBAAgB,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,GAAE,OAAsB,GAAG,YAAY,CAE3E;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,IAAI,EACV,GAAG,GAAE,OAAsB,GAC1B,iBAAiB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAMvC;AAeD,wBAAgB,eAAe,CAAC,EAAE,EAAE,UAAU,GAAG,UAAU,CAyB1D"}
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // Hindley-Milner — Algorithm W (Damas-Milner)
4
+ // ============================================================
5
+ //
6
+ // Implementación de Algorithm W tal como aparece en Damas & Milner
7
+ // 1982. La función W toma un entorno Γ y una expresión e, y devuelve
8
+ // un par (S, τ) donde S es la sustitución principal y τ el tipo
9
+ // principal de e bajo S(Γ).
10
+ //
11
+ // Reglas (esquemáticas):
12
+ // W(Γ, x) = (∅, [β/α] τ) si Γ(x) = ∀α. τ con β frescas
13
+ // W(Γ, λx.e) = sea β fresca; (S, τ) = W(Γ[x:β], e);
14
+ // devolver (S, S(β) → τ)
15
+ // W(Γ, e₁ e₂) = (S₁, τ₁) = W(Γ, e₁);
16
+ // (S₂, τ₂) = W(S₁(Γ), e₂);
17
+ // β fresca; V = mgu(S₂(τ₁), τ₂ → β);
18
+ // devolver (V ∘ S₂ ∘ S₁, V(β))
19
+ // W(Γ, let x = e₁ in e₂) =
20
+ // (S₁, τ₁) = W(Γ, e₁);
21
+ // σ = generalize(S₁(Γ), τ₁);
22
+ // (S₂, τ₂) = W(S₁(Γ)[x:σ], e₂);
23
+ // devolver (S₂ ∘ S₁, τ₂)
24
+ // W(Γ, if c then a else b) = unificar c con Bool y a con b.
25
+ // W(Γ, letRec [n₁=e₁,...] in e) — todos los nᵢ con tvars frescos
26
+ // en el entorno mientras se infieren los eᵢ; luego generalizar.
27
+ //
28
+ // Convención: trabajamos con `freshTypeVar('t')`. Para tests con
29
+ // nombres predecibles se llama `resetFreshSupply()`.
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.isInferError = isInferError;
32
+ exports.initialEnv = initialEnv;
33
+ exports.algorithmW = algorithmW;
34
+ exports.infer = infer;
35
+ exports.inferScheme = inferScheme;
36
+ exports.normalizeScheme = normalizeScheme;
37
+ const types_1 = require("./types");
38
+ const substitution_1 = require("./substitution");
39
+ function isInferError(r) {
40
+ return typeof r === 'object' && r !== null && 'error' in r && !('type' in r);
41
+ }
42
+ // ---------- Entorno inicial con primitivos ----------
43
+ //
44
+ // Operadores aritméticos como Int → Int → Int. Comparadores son
45
+ // polimórficos: ∀α. α → α → Bool. Listas y pares con sus
46
+ // constructores y proyectores.
47
+ function initialEnv() {
48
+ const a = 'a';
49
+ const b = 'b';
50
+ const TA = { kind: 'tvar', name: a };
51
+ const TB = { kind: 'tvar', name: b };
52
+ const arithBinop = (0, types_1.mono)((0, types_1.tArrow)(types_1.TInt, (0, types_1.tArrow)(types_1.TInt, types_1.TInt)));
53
+ const cmpBinop = (0, types_1.scheme)([a], (0, types_1.tArrow)(TA, (0, types_1.tArrow)(TA, types_1.TBool)));
54
+ const pairTy = (0, types_1.tApp)('Pair', TA, TB);
55
+ const listTyA = (0, types_1.tApp)('List', TA);
56
+ return new types_1.TypeEnv(new Map([
57
+ ['+', arithBinop],
58
+ ['-', arithBinop],
59
+ ['*', arithBinop],
60
+ ['/', arithBinop],
61
+ ['mod', arithBinop],
62
+ ['==', cmpBinop],
63
+ ['!=', cmpBinop],
64
+ ['<', cmpBinop],
65
+ ['>', cmpBinop],
66
+ ['<=', cmpBinop],
67
+ ['>=', cmpBinop],
68
+ ['true', (0, types_1.mono)(types_1.TBool)],
69
+ ['false', (0, types_1.mono)(types_1.TBool)],
70
+ ['not', (0, types_1.mono)((0, types_1.tArrow)(types_1.TBool, types_1.TBool))],
71
+ ['&&', (0, types_1.mono)((0, types_1.tArrow)(types_1.TBool, (0, types_1.tArrow)(types_1.TBool, types_1.TBool)))],
72
+ ['||', (0, types_1.mono)((0, types_1.tArrow)(types_1.TBool, (0, types_1.tArrow)(types_1.TBool, types_1.TBool)))],
73
+ ['pair', (0, types_1.scheme)([a, b], (0, types_1.tArrow)(TA, (0, types_1.tArrow)(TB, pairTy)))],
74
+ ['fst', (0, types_1.scheme)([a, b], (0, types_1.tArrow)(pairTy, TA))],
75
+ ['snd', (0, types_1.scheme)([a, b], (0, types_1.tArrow)(pairTy, TB))],
76
+ ['nil', (0, types_1.scheme)([a], listTyA)],
77
+ ['cons', (0, types_1.scheme)([a], (0, types_1.tArrow)(TA, (0, types_1.tArrow)(listTyA, listTyA)))],
78
+ ['head', (0, types_1.scheme)([a], (0, types_1.tArrow)(listTyA, TA))],
79
+ ['tail', (0, types_1.scheme)([a], (0, types_1.tArrow)(listTyA, listTyA))],
80
+ ['isEmpty', (0, types_1.scheme)([a], (0, types_1.tArrow)(listTyA, types_1.TBool))],
81
+ // fixpoint, útil para introducir letRec puntualmente sin el azúcar
82
+ ['fix', (0, types_1.scheme)([a], (0, types_1.tArrow)((0, types_1.tArrow)(TA, TA), TA))],
83
+ ]));
84
+ }
85
+ // ---------- Algorithm W ----------
86
+ function algorithmW(expr, env) {
87
+ switch (expr.kind) {
88
+ case 'lit': {
89
+ const t = typeof expr.value === 'number' ? types_1.TInt : typeof expr.value === 'boolean' ? types_1.TBool : types_1.TStr;
90
+ return { type: t, subst: (0, substitution_1.emptySubst)() };
91
+ }
92
+ case 'var': {
93
+ const sc = env.lookup(expr.name);
94
+ if (sc === undefined)
95
+ return { error: `unbound variable: ${expr.name}` };
96
+ return { type: (0, substitution_1.instantiate)(sc), subst: (0, substitution_1.emptySubst)() };
97
+ }
98
+ case 'lam': {
99
+ const tv = (0, substitution_1.freshTypeVar)('t');
100
+ const env2 = env.extend(expr.param, (0, types_1.mono)(tv));
101
+ const body = algorithmW(expr.body, env2);
102
+ if (isInferError(body))
103
+ return body;
104
+ return {
105
+ type: (0, types_1.tArrow)((0, substitution_1.applySubst)(tv, body.subst), body.type),
106
+ subst: body.subst,
107
+ };
108
+ }
109
+ case 'app': {
110
+ const r1 = algorithmW(expr.fn, env);
111
+ if (isInferError(r1))
112
+ return r1;
113
+ const env2 = applyEnv(env, r1.subst);
114
+ const r2 = algorithmW(expr.arg, env2);
115
+ if (isInferError(r2))
116
+ return r2;
117
+ const tv = (0, substitution_1.freshTypeVar)('t');
118
+ const u = (0, substitution_1.unify)((0, substitution_1.applySubst)(r1.type, r2.subst), (0, types_1.tArrow)(r2.type, tv));
119
+ if ((0, substitution_1.isUnifyError)(u))
120
+ return { error: u.error };
121
+ const finalSubst = (0, substitution_1.composeSubsts)(u, (0, substitution_1.composeSubsts)(r2.subst, r1.subst));
122
+ return { type: (0, substitution_1.applySubst)(tv, u), subst: finalSubst };
123
+ }
124
+ case 'let': {
125
+ const r1 = algorithmW(expr.value, env);
126
+ if (isInferError(r1))
127
+ return r1;
128
+ const env1 = applyEnv(env, r1.subst);
129
+ const sc = (0, substitution_1.generalize)(env1.freeVars(), r1.type);
130
+ const env2 = env1.extend(expr.bind, sc);
131
+ const r2 = algorithmW(expr.body, env2);
132
+ if (isInferError(r2))
133
+ return r2;
134
+ return {
135
+ type: r2.type,
136
+ subst: (0, substitution_1.composeSubsts)(r2.subst, r1.subst),
137
+ };
138
+ }
139
+ case 'letRec': {
140
+ // Asignar tvar fresco a cada def, inferir cada body bajo el
141
+ // entorno extendido, unificar el tipo de cada body con el tvar
142
+ // declarado, y al final generalizar.
143
+ if (expr.defs.length === 0)
144
+ return algorithmW(expr.body, env);
145
+ const freshVars = expr.defs.map(() => (0, substitution_1.freshTypeVar)('t'));
146
+ let envExt = env;
147
+ for (let i = 0; i < expr.defs.length; i++) {
148
+ envExt = envExt.extend(expr.defs[i].name, (0, types_1.mono)(freshVars[i]));
149
+ }
150
+ let s = (0, substitution_1.emptySubst)();
151
+ for (let i = 0; i < expr.defs.length; i++) {
152
+ const def = expr.defs[i];
153
+ const fv = freshVars[i];
154
+ const ri = algorithmW(def.body, applyEnv(envExt, s));
155
+ if (isInferError(ri))
156
+ return ri;
157
+ const u = (0, substitution_1.unify)((0, substitution_1.applySubst)(fv, (0, substitution_1.composeSubsts)(ri.subst, s)), ri.type);
158
+ if ((0, substitution_1.isUnifyError)(u))
159
+ return { error: u.error };
160
+ s = (0, substitution_1.composeSubsts)(u, (0, substitution_1.composeSubsts)(ri.subst, s));
161
+ }
162
+ // Reconstruir entorno generalizado.
163
+ const envAfter = applyEnv(env, s);
164
+ const envFv = envAfter.freeVars();
165
+ let envGen = envAfter;
166
+ for (let i = 0; i < expr.defs.length; i++) {
167
+ const ty = (0, substitution_1.applySubst)(freshVars[i], s);
168
+ const sc = (0, substitution_1.generalize)(envFv, ty);
169
+ envGen = envGen.extend(expr.defs[i].name, sc);
170
+ }
171
+ const rBody = algorithmW(expr.body, envGen);
172
+ if (isInferError(rBody))
173
+ return rBody;
174
+ return {
175
+ type: rBody.type,
176
+ subst: (0, substitution_1.composeSubsts)(rBody.subst, s),
177
+ };
178
+ }
179
+ case 'if': {
180
+ const rc = algorithmW(expr.cond, env);
181
+ if (isInferError(rc))
182
+ return rc;
183
+ const uCond = (0, substitution_1.unify)(rc.type, types_1.TBool);
184
+ if ((0, substitution_1.isUnifyError)(uCond)) {
185
+ return { error: `condition of 'if' must be Bool: ${uCond.error}` };
186
+ }
187
+ const s1 = (0, substitution_1.composeSubsts)(uCond, rc.subst);
188
+ const rt = algorithmW(expr.then, applyEnv(env, s1));
189
+ if (isInferError(rt))
190
+ return rt;
191
+ const s2 = (0, substitution_1.composeSubsts)(rt.subst, s1);
192
+ const re = algorithmW(expr.else, applyEnv(env, s2));
193
+ if (isInferError(re))
194
+ return re;
195
+ const s3 = (0, substitution_1.composeSubsts)(re.subst, s2);
196
+ const u = (0, substitution_1.unify)((0, substitution_1.applySubst)(rt.type, s3), re.type);
197
+ if ((0, substitution_1.isUnifyError)(u)) {
198
+ return { error: `branches of 'if' must agree: ${u.error}` };
199
+ }
200
+ const finalSubst = (0, substitution_1.composeSubsts)(u, s3);
201
+ return { type: (0, substitution_1.applySubst)(re.type, u), subst: finalSubst };
202
+ }
203
+ }
204
+ }
205
+ // ---------- API de alto nivel ----------
206
+ //
207
+ // infer() devuelve sólo lo necesario al consumidor: el tipo final
208
+ // y la sustitución que lo produjo (útil para imprimirla, debug,
209
+ // etc.). El esquema principal lo expone `inferScheme`.
210
+ function infer(expr, env = initialEnv()) {
211
+ return algorithmW(expr, env);
212
+ }
213
+ function inferScheme(expr, env = initialEnv()) {
214
+ const r = algorithmW(expr, env);
215
+ if (isInferError(r))
216
+ return r;
217
+ const envAfter = applyEnv(env, r.subst);
218
+ const sc = (0, substitution_1.generalize)(envAfter.freeVars(), r.type);
219
+ return { scheme: sc, subst: r.subst, type: r.type };
220
+ }
221
+ // ---------- Helpers ----------
222
+ function applyEnv(env, s) {
223
+ if (s.size === 0)
224
+ return env;
225
+ const next = new Map();
226
+ for (const [name, sc] of env.bindings) {
227
+ next.set(name, (0, substitution_1.applySubstScheme)(sc, s));
228
+ }
229
+ return new types_1.TypeEnv(next);
230
+ }
231
+ // Renombrado canónico de un esquema para tests: ∀t5 t9. t5 → t9
232
+ // pasa a ser ∀a b. a → b. Asegura comparaciones estables sin
233
+ // depender del contador global.
234
+ function normalizeScheme(sc) {
235
+ const fv = Array.from((0, types_1.typeFreeVars)(sc.body));
236
+ const ordered = sc.forall.filter((v) => fv.includes(v));
237
+ const namePool = 'abcdefghijklmnopqrstuvwxyz'.split('');
238
+ const renames = new Map();
239
+ let i = 0;
240
+ function pick() {
241
+ if (i < namePool.length)
242
+ return namePool[i++];
243
+ return `t${i++}`;
244
+ }
245
+ // Recorrer en orden de aparición en el cuerpo para que el nombre
246
+ // resultante sea estable bajo equivalencia α.
247
+ visitTypeVars(sc.body, (v) => {
248
+ if (ordered.includes(v) && !renames.has(v)) {
249
+ renames.set(v, pick());
250
+ }
251
+ });
252
+ const sub = new Map();
253
+ for (const [old, fresh] of renames) {
254
+ sub.set(old, { kind: 'tvar', name: fresh });
255
+ }
256
+ return {
257
+ forall: Array.from(renames.values()),
258
+ body: (0, substitution_1.applySubst)(sc.body, sub),
259
+ };
260
+ }
261
+ function visitTypeVars(t, cb) {
262
+ switch (t.kind) {
263
+ case 'tvar':
264
+ cb(t.name);
265
+ return;
266
+ case 'tconst':
267
+ return;
268
+ case 'arrow':
269
+ visitTypeVars(t.from, cb);
270
+ visitTypeVars(t.to, cb);
271
+ return;
272
+ case 'tapp':
273
+ for (const a of t.args)
274
+ visitTypeVars(a, cb);
275
+ return;
276
+ }
277
+ }
278
+ //# sourceMappingURL=infer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infer.js","sourceRoot":"","sources":["../../src/hindley-milner/infer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Type, TypeScheme } from './types';
2
+ import { schemeFreeVars } from './types';
3
+ export type Substitution = Map<string, Type>;
4
+ export declare const emptySubst: () => Substitution;
5
+ export declare function applySubst(t: Type, s: Substitution): Type;
6
+ export declare function applySubstScheme(sc: TypeScheme, s: Substitution): TypeScheme;
7
+ export declare function composeSubsts(s1: Substitution, s2: Substitution): Substitution;
8
+ export declare function resetFreshSupply(): void;
9
+ export declare function freshTypeVar(prefix?: string): Type;
10
+ export declare function occursIn(name: string, t: Type): boolean;
11
+ export type UnifyResult = Substitution | {
12
+ error: string;
13
+ };
14
+ export declare function isUnifyError(r: UnifyResult): r is {
15
+ error: string;
16
+ };
17
+ export declare function unify(t1: Type, t2: Type): UnifyResult;
18
+ export declare function generalize(envFreeVars: Set<string>, t: Type): TypeScheme;
19
+ export declare function instantiate(sc: TypeScheme): Type;
20
+ export { schemeFreeVars };
21
+ //# sourceMappingURL=substitution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"substitution.d.ts","sourceRoot":"","sources":["../../src/hindley-milner/substitution.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,cAAc,EAA8B,MAAM,SAAS,CAAC;AAErE,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAE7C,eAAO,MAAM,UAAU,QAAO,YAAyB,CAAC;AAExD,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,CAGzD;AA6BD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,GAAG,UAAU,CAU5E;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,GAAG,YAAY,CAO9E;AAQD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,YAAY,CAAC,MAAM,SAAM,GAAG,IAAI,CAG/C;AAKD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAWvD;AAKD,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,IAAI;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAEnE;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,WAAW,CAsCrD;AAmCD,wBAAgB,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,GAAG,UAAU,CASxE;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAOhD;AAGD,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // Hindley-Milner — Sustituciones, unificación, fresh vars
4
+ // ============================================================
5
+ //
6
+ // Sustitución σ : tvar → Type. Aplicar σ a un tipo reemplaza las
7
+ // variables libres que aparezcan en su dominio.
8
+ //
9
+ // composeSubsts(s1, s2) calcula s1 ∘ s2 : primero aplica s2, luego s1.
10
+ // El truco habitual es:
11
+ //
12
+ // (s1 ∘ s2)(α) = s1 (s2 α)
13
+ //
14
+ // Implementado como: aplicar s1 a los valores de s2, y añadir las
15
+ // entradas de s1 que s2 no tocó.
16
+ //
17
+ // Unificación es la unificación de primer orden Robinson, con
18
+ // occurs-check para impedir tipos infinitos (`α ≡ α → α` falla).
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.schemeFreeVars = exports.emptySubst = void 0;
21
+ exports.applySubst = applySubst;
22
+ exports.applySubstScheme = applySubstScheme;
23
+ exports.composeSubsts = composeSubsts;
24
+ exports.resetFreshSupply = resetFreshSupply;
25
+ exports.freshTypeVar = freshTypeVar;
26
+ exports.occursIn = occursIn;
27
+ exports.isUnifyError = isUnifyError;
28
+ exports.unify = unify;
29
+ exports.generalize = generalize;
30
+ exports.instantiate = instantiate;
31
+ const types_1 = require("./types");
32
+ Object.defineProperty(exports, "schemeFreeVars", { enumerable: true, get: function () { return types_1.schemeFreeVars; } });
33
+ const emptySubst = () => new Map();
34
+ exports.emptySubst = emptySubst;
35
+ function applySubst(t, s) {
36
+ if (s.size === 0)
37
+ return t;
38
+ return applySubstChase(t, s, new Set());
39
+ }
40
+ function applySubstChase(t, s, seen) {
41
+ switch (t.kind) {
42
+ case 'tvar': {
43
+ const r = s.get(t.name);
44
+ if (r === undefined)
45
+ return t;
46
+ if (seen.has(t.name))
47
+ return t; // guard contra cadenas cíclicas (no deberían ocurrir tras unify)
48
+ const nextSeen = new Set(seen);
49
+ nextSeen.add(t.name);
50
+ return applySubstChase(r, s, nextSeen);
51
+ }
52
+ case 'tconst':
53
+ return t;
54
+ case 'arrow':
55
+ return {
56
+ kind: 'arrow',
57
+ from: applySubstChase(t.from, s, seen),
58
+ to: applySubstChase(t.to, s, seen),
59
+ };
60
+ case 'tapp':
61
+ return {
62
+ kind: 'tapp',
63
+ fn: t.fn,
64
+ args: t.args.map((a) => applySubstChase(a, s, seen)),
65
+ };
66
+ }
67
+ }
68
+ function applySubstScheme(sc, s) {
69
+ if (s.size === 0)
70
+ return sc;
71
+ // No sustituir las variables ligadas por el ∀.
72
+ let restricted = s;
73
+ if (sc.forall.length > 0) {
74
+ restricted = new Map(s);
75
+ for (const b of sc.forall)
76
+ restricted.delete(b);
77
+ if (restricted.size === 0)
78
+ return sc;
79
+ }
80
+ return { forall: sc.forall, body: applySubst(sc.body, restricted) };
81
+ }
82
+ function composeSubsts(s1, s2) {
83
+ const result = new Map();
84
+ for (const [k, v] of s2)
85
+ result.set(k, applySubst(v, s1));
86
+ for (const [k, v] of s1) {
87
+ if (!result.has(k))
88
+ result.set(k, v);
89
+ }
90
+ return result;
91
+ }
92
+ // ---------- Generación de variables frescas ----------
93
+ //
94
+ // freshCounter es módulo-global. resetFreshSupply() permite que los
95
+ // tests obtengan nombres reproducibles.
96
+ let freshCounter = 0;
97
+ function resetFreshSupply() {
98
+ freshCounter = 0;
99
+ }
100
+ function freshTypeVar(prefix = 't') {
101
+ const name = `${prefix}${freshCounter++}`;
102
+ return { kind: 'tvar', name };
103
+ }
104
+ // ---------- Occurs check ----------
105
+ // α aparece en t como subtérmino? Si sí, unificarlos crearía un
106
+ // tipo recursivo (infinito).
107
+ function occursIn(name, t) {
108
+ switch (t.kind) {
109
+ case 'tvar':
110
+ return t.name === name;
111
+ case 'tconst':
112
+ return false;
113
+ case 'arrow':
114
+ return occursIn(name, t.from) || occursIn(name, t.to);
115
+ case 'tapp':
116
+ return t.args.some((a) => occursIn(name, a));
117
+ }
118
+ }
119
+ function isUnifyError(r) {
120
+ return typeof r === 'object' && r !== null && !(r instanceof Map) && 'error' in r;
121
+ }
122
+ function unify(t1, t2) {
123
+ if (t1.kind === 'tvar')
124
+ return bindVar(t1.name, t2);
125
+ if (t2.kind === 'tvar')
126
+ return bindVar(t2.name, t1);
127
+ if (t1.kind === 'tconst' && t2.kind === 'tconst') {
128
+ if (t1.name === t2.name)
129
+ return (0, exports.emptySubst)();
130
+ return { error: `cannot unify ${t1.name} with ${t2.name}` };
131
+ }
132
+ if (t1.kind === 'arrow' && t2.kind === 'arrow') {
133
+ const sFrom = unify(t1.from, t2.from);
134
+ if (isUnifyError(sFrom))
135
+ return sFrom;
136
+ const sTo = unify(applySubst(t1.to, sFrom), applySubst(t2.to, sFrom));
137
+ if (isUnifyError(sTo))
138
+ return sTo;
139
+ return composeSubsts(sTo, sFrom);
140
+ }
141
+ if (t1.kind === 'tapp' && t2.kind === 'tapp') {
142
+ if (t1.fn !== t2.fn)
143
+ return { error: `cannot unify ${t1.fn} with ${t2.fn}` };
144
+ if (t1.args.length !== t2.args.length) {
145
+ return {
146
+ error: `arity mismatch on ${t1.fn}: ${t1.args.length} vs ${t2.args.length}`,
147
+ };
148
+ }
149
+ let s = (0, exports.emptySubst)();
150
+ for (let i = 0; i < t1.args.length; i++) {
151
+ const a1 = applySubst(t1.args[i], s);
152
+ const a2 = applySubst(t2.args[i], s);
153
+ const step = unify(a1, a2);
154
+ if (isUnifyError(step))
155
+ return step;
156
+ s = composeSubsts(step, s);
157
+ }
158
+ return s;
159
+ }
160
+ return {
161
+ error: `cannot unify ${describeKind(t1)} with ${describeKind(t2)}`,
162
+ };
163
+ }
164
+ function describeKind(t) {
165
+ switch (t.kind) {
166
+ case 'tvar':
167
+ return `tvar ${t.name}`;
168
+ case 'tconst':
169
+ return t.name;
170
+ case 'arrow':
171
+ return 'function type';
172
+ case 'tapp':
173
+ return `${t.fn} type constructor`;
174
+ }
175
+ }
176
+ function bindVar(name, t) {
177
+ if (t.kind === 'tvar' && t.name === name)
178
+ return (0, exports.emptySubst)();
179
+ if (occursIn(name, t)) {
180
+ return { error: `occurs check failed: ${name} occurs in ${(0, types_1.typeToString)(t)}` };
181
+ }
182
+ const s = new Map();
183
+ s.set(name, t);
184
+ return s;
185
+ }
186
+ // ---------- generalize / instantiate ----------
187
+ //
188
+ // generalize cierra los tipos libres que no están en el entorno: es
189
+ // la regla que convierte un monotipo en un esquema polimórfico. Sólo
190
+ // debe llamarse al tipar la RHS de un `let`.
191
+ //
192
+ // instantiate abre un esquema reemplazando cada cuantificador con una
193
+ // variable fresca: es la regla que vuelve a "abrir" un binding cuando
194
+ // se usa una variable polimórfica.
195
+ function generalize(envFreeVars, t) {
196
+ const tFv = (0, types_1.typeFreeVars)(t);
197
+ const quantified = [];
198
+ for (const v of tFv) {
199
+ if (!envFreeVars.has(v))
200
+ quantified.push(v);
201
+ }
202
+ // orden estable para que la salida sea reproducible.
203
+ quantified.sort();
204
+ return { forall: quantified, body: t };
205
+ }
206
+ function instantiate(sc) {
207
+ if (sc.forall.length === 0)
208
+ return sc.body;
209
+ const s = new Map();
210
+ for (const b of sc.forall) {
211
+ s.set(b, freshTypeVar('t'));
212
+ }
213
+ return applySubst(sc.body, s);
214
+ }
215
+ //# sourceMappingURL=substitution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"substitution.js","sourceRoot":"","sources":["../../src/hindley-milner/substitution.ts"],"names":[],"mappings":"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"}