@stevenvo780/st-lang 4.5.1 → 4.5.2

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 (285) hide show
  1. package/dist/bdd/index.d.ts +4 -0
  2. package/dist/bdd/index.d.ts.map +1 -0
  3. package/dist/bdd/index.js +29 -0
  4. package/dist/bdd/index.js.map +1 -0
  5. package/dist/bdd/manager.d.ts +122 -0
  6. package/dist/bdd/manager.d.ts.map +1 -0
  7. package/dist/bdd/manager.js +524 -0
  8. package/dist/bdd/manager.js.map +1 -0
  9. package/dist/bdd/types.d.ts +20 -0
  10. package/dist/bdd/types.d.ts.map +1 -0
  11. package/dist/bdd/types.js +28 -0
  12. package/dist/bdd/types.js.map +1 -0
  13. package/dist/game-theory/common-games.d.ts +50 -0
  14. package/dist/game-theory/common-games.d.ts.map +1 -0
  15. package/dist/game-theory/common-games.js +112 -0
  16. package/dist/game-theory/common-games.js.map +1 -0
  17. package/dist/game-theory/dominance.d.ts +26 -0
  18. package/dist/game-theory/dominance.d.ts.map +1 -0
  19. package/dist/game-theory/dominance.js +203 -0
  20. package/dist/game-theory/dominance.js.map +1 -0
  21. package/dist/game-theory/index.d.ts +8 -0
  22. package/dist/game-theory/index.d.ts.map +1 -0
  23. package/dist/game-theory/index.js +47 -0
  24. package/dist/game-theory/index.js.map +1 -0
  25. package/dist/game-theory/lemke-howson.d.ts +3 -0
  26. package/dist/game-theory/lemke-howson.d.ts.map +1 -0
  27. package/dist/game-theory/lemke-howson.js +269 -0
  28. package/dist/game-theory/lemke-howson.js.map +1 -0
  29. package/dist/game-theory/linalg.d.ts +7 -0
  30. package/dist/game-theory/linalg.d.ts.map +1 -0
  31. package/dist/game-theory/linalg.js +69 -0
  32. package/dist/game-theory/linalg.js.map +1 -0
  33. package/dist/game-theory/pure-nash.d.ts +3 -0
  34. package/dist/game-theory/pure-nash.d.ts.map +1 -0
  35. package/dist/game-theory/pure-nash.js +86 -0
  36. package/dist/game-theory/pure-nash.js.map +1 -0
  37. package/dist/game-theory/support-enumeration.d.ts +3 -0
  38. package/dist/game-theory/support-enumeration.d.ts.map +1 -0
  39. package/dist/game-theory/support-enumeration.js +214 -0
  40. package/dist/game-theory/support-enumeration.js.map +1 -0
  41. package/dist/game-theory/types.d.ts +57 -0
  42. package/dist/game-theory/types.d.ts.map +1 -0
  43. package/dist/game-theory/types.js +191 -0
  44. package/dist/game-theory/types.js.map +1 -0
  45. package/dist/index.d.ts +9 -1
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +36 -1
  48. package/dist/index.js.map +1 -1
  49. package/dist/information-theory/index.d.ts +29 -0
  50. package/dist/information-theory/index.d.ts.map +1 -0
  51. package/dist/information-theory/index.js +323 -0
  52. package/dist/information-theory/index.js.map +1 -0
  53. package/dist/namespaces/logic.d.ts +42 -0
  54. package/dist/namespaces/logic.d.ts.map +1 -0
  55. package/dist/namespaces/logic.js +112 -0
  56. package/dist/namespaces/logic.js.map +1 -0
  57. package/dist/namespaces/proof-systems.d.ts +18 -0
  58. package/dist/namespaces/proof-systems.d.ts.map +1 -0
  59. package/dist/namespaces/proof-systems.js +59 -0
  60. package/dist/namespaces/proof-systems.js.map +1 -0
  61. package/dist/namespaces/reasoning.d.ts +26 -0
  62. package/dist/namespaces/reasoning.d.ts.map +1 -0
  63. package/dist/namespaces/reasoning.js +72 -0
  64. package/dist/namespaces/reasoning.js.map +1 -0
  65. package/dist/namespaces/semantics.d.ts +21 -0
  66. package/dist/namespaces/semantics.d.ts.map +1 -0
  67. package/dist/namespaces/semantics.js +64 -0
  68. package/dist/namespaces/semantics.js.map +1 -0
  69. package/dist/namespaces/solvers.d.ts +22 -0
  70. package/dist/namespaces/solvers.d.ts.map +1 -0
  71. package/dist/namespaces/solvers.js +66 -0
  72. package/dist/namespaces/solvers.js.map +1 -0
  73. package/dist/namespaces/type-theory.d.ts +22 -0
  74. package/dist/namespaces/type-theory.d.ts.map +1 -0
  75. package/dist/namespaces/type-theory.js +65 -0
  76. package/dist/namespaces/type-theory.js.map +1 -0
  77. package/dist/optimization/branch-and-bound.d.ts +11 -0
  78. package/dist/optimization/branch-and-bound.d.ts.map +1 -0
  79. package/dist/optimization/branch-and-bound.js +311 -0
  80. package/dist/optimization/branch-and-bound.js.map +1 -0
  81. package/dist/optimization/index.d.ts +5 -0
  82. package/dist/optimization/index.d.ts.map +1 -0
  83. package/dist/optimization/index.js +20 -0
  84. package/dist/optimization/index.js.map +1 -0
  85. package/dist/optimization/simplex.d.ts +8 -0
  86. package/dist/optimization/simplex.d.ts.map +1 -0
  87. package/dist/optimization/simplex.js +408 -0
  88. package/dist/optimization/simplex.js.map +1 -0
  89. package/dist/optimization/standard-form.d.ts +11 -0
  90. package/dist/optimization/standard-form.d.ts.map +1 -0
  91. package/dist/optimization/standard-form.js +112 -0
  92. package/dist/optimization/standard-form.js.map +1 -0
  93. package/dist/optimization/types.d.ts +44 -0
  94. package/dist/optimization/types.d.ts.map +1 -0
  95. package/dist/optimization/types.js +15 -0
  96. package/dist/optimization/types.js.map +1 -0
  97. package/dist/profiles/hol/connectives.d.ts +46 -0
  98. package/dist/profiles/hol/connectives.d.ts.map +1 -0
  99. package/dist/profiles/hol/connectives.js +104 -0
  100. package/dist/profiles/hol/connectives.js.map +1 -0
  101. package/dist/profiles/hol/index.d.ts +7 -0
  102. package/dist/profiles/hol/index.d.ts.map +1 -0
  103. package/dist/profiles/hol/index.js +77 -0
  104. package/dist/profiles/hol/index.js.map +1 -0
  105. package/dist/profiles/hol/rules.d.ts +31 -0
  106. package/dist/profiles/hol/rules.d.ts.map +1 -0
  107. package/dist/profiles/hol/rules.js +258 -0
  108. package/dist/profiles/hol/rules.js.map +1 -0
  109. package/dist/profiles/hol/term.d.ts +52 -0
  110. package/dist/profiles/hol/term.d.ts.map +1 -0
  111. package/dist/profiles/hol/term.js +345 -0
  112. package/dist/profiles/hol/term.js.map +1 -0
  113. package/dist/profiles/hol/type-system.d.ts +38 -0
  114. package/dist/profiles/hol/type-system.d.ts.map +1 -0
  115. package/dist/profiles/hol/type-system.js +133 -0
  116. package/dist/profiles/hol/type-system.js.map +1 -0
  117. package/dist/profiles/hol/types.d.ts +59 -0
  118. package/dist/profiles/hol/types.d.ts.map +1 -0
  119. package/dist/profiles/hol/types.js +26 -0
  120. package/dist/profiles/hol/types.js.map +1 -0
  121. package/dist/smt-lib/ast.d.ts +138 -0
  122. package/dist/smt-lib/ast.d.ts.map +1 -0
  123. package/dist/smt-lib/ast.js +73 -0
  124. package/dist/smt-lib/ast.js.map +1 -0
  125. package/dist/smt-lib/emitter.d.ts +12 -0
  126. package/dist/smt-lib/emitter.d.ts.map +1 -0
  127. package/dist/smt-lib/emitter.js +174 -0
  128. package/dist/smt-lib/emitter.js.map +1 -0
  129. package/dist/smt-lib/index.d.ts +6 -0
  130. package/dist/smt-lib/index.d.ts.map +1 -0
  131. package/dist/smt-lib/index.js +31 -0
  132. package/dist/smt-lib/index.js.map +1 -0
  133. package/dist/smt-lib/parser.d.ts +13 -0
  134. package/dist/smt-lib/parser.d.ts.map +1 -0
  135. package/dist/smt-lib/parser.js +614 -0
  136. package/dist/smt-lib/parser.js.map +1 -0
  137. package/dist/smt-lib/tokenizer.d.ts +16 -0
  138. package/dist/smt-lib/tokenizer.d.ts.map +1 -0
  139. package/dist/smt-lib/tokenizer.js +234 -0
  140. package/dist/smt-lib/tokenizer.js.map +1 -0
  141. package/dist/tests/api/namespaces.test.d.ts +9 -0
  142. package/dist/tests/api/namespaces.test.d.ts.map +1 -0
  143. package/dist/tests/api/namespaces.test.js +218 -0
  144. package/dist/tests/api/namespaces.test.js.map +1 -0
  145. package/dist/tests/bdd/manager.test.d.ts +2 -0
  146. package/dist/tests/bdd/manager.test.d.ts.map +1 -0
  147. package/dist/tests/bdd/manager.test.js +472 -0
  148. package/dist/tests/bdd/manager.test.js.map +1 -0
  149. package/dist/tests/game-theory/game-theory.test.d.ts +2 -0
  150. package/dist/tests/game-theory/game-theory.test.d.ts.map +1 -0
  151. package/dist/tests/game-theory/game-theory.test.js +252 -0
  152. package/dist/tests/game-theory/game-theory.test.js.map +1 -0
  153. package/dist/tests/hol/hol.test.d.ts +2 -0
  154. package/dist/tests/hol/hol.test.d.ts.map +1 -0
  155. package/dist/tests/hol/hol.test.js +340 -0
  156. package/dist/tests/hol/hol.test.js.map +1 -0
  157. package/dist/tests/information-theory/information-theory.test.d.ts +2 -0
  158. package/dist/tests/information-theory/information-theory.test.d.ts.map +1 -0
  159. package/dist/tests/information-theory/information-theory.test.js +291 -0
  160. package/dist/tests/information-theory/information-theory.test.js.map +1 -0
  161. package/dist/tests/optimization/ilp.test.d.ts +2 -0
  162. package/dist/tests/optimization/ilp.test.d.ts.map +1 -0
  163. package/dist/tests/optimization/ilp.test.js +204 -0
  164. package/dist/tests/optimization/ilp.test.js.map +1 -0
  165. package/dist/tests/optimization/lp.test.d.ts +2 -0
  166. package/dist/tests/optimization/lp.test.d.ts.map +1 -0
  167. package/dist/tests/optimization/lp.test.js +224 -0
  168. package/dist/tests/optimization/lp.test.js.map +1 -0
  169. package/dist/tests/properties/agm.property.test.d.ts +2 -0
  170. package/dist/tests/properties/agm.property.test.d.ts.map +1 -0
  171. package/dist/tests/properties/agm.property.test.js +75 -0
  172. package/dist/tests/properties/agm.property.test.js.map +1 -0
  173. package/dist/tests/properties/anti-unification.property.test.d.ts +2 -0
  174. package/dist/tests/properties/anti-unification.property.test.d.ts.map +1 -0
  175. package/dist/tests/properties/anti-unification.property.test.js +43 -0
  176. package/dist/tests/properties/anti-unification.property.test.js.map +1 -0
  177. package/dist/tests/properties/argumentation.property.test.d.ts +2 -0
  178. package/dist/tests/properties/argumentation.property.test.d.ts.map +1 -0
  179. package/dist/tests/properties/argumentation.property.test.js +51 -0
  180. package/dist/tests/properties/argumentation.property.test.js.map +1 -0
  181. package/dist/tests/properties/bayesian.property.test.d.ts +2 -0
  182. package/dist/tests/properties/bayesian.property.test.d.ts.map +1 -0
  183. package/dist/tests/properties/bayesian.property.test.js +32 -0
  184. package/dist/tests/properties/bayesian.property.test.js.map +1 -0
  185. package/dist/tests/properties/bisimulation.property.test.d.ts +2 -0
  186. package/dist/tests/properties/bisimulation.property.test.d.ts.map +1 -0
  187. package/dist/tests/properties/bisimulation.property.test.js +50 -0
  188. package/dist/tests/properties/bisimulation.property.test.js.map +1 -0
  189. package/dist/tests/properties/cdcl.property.test.d.ts +2 -0
  190. package/dist/tests/properties/cdcl.property.test.d.ts.map +1 -0
  191. package/dist/tests/properties/cdcl.property.test.js +70 -0
  192. package/dist/tests/properties/cdcl.property.test.js.map +1 -0
  193. package/dist/tests/properties/coinduction.property.test.d.ts +2 -0
  194. package/dist/tests/properties/coinduction.property.test.d.ts.map +1 -0
  195. package/dist/tests/properties/coinduction.property.test.js +34 -0
  196. package/dist/tests/properties/coinduction.property.test.js.map +1 -0
  197. package/dist/tests/properties/constructive-reals.property.test.d.ts +2 -0
  198. package/dist/tests/properties/constructive-reals.property.test.d.ts.map +1 -0
  199. package/dist/tests/properties/constructive-reals.property.test.js +59 -0
  200. package/dist/tests/properties/constructive-reals.property.test.js.map +1 -0
  201. package/dist/tests/properties/csp.property.test.d.ts +2 -0
  202. package/dist/tests/properties/csp.property.test.d.ts.map +1 -0
  203. package/dist/tests/properties/csp.property.test.js +58 -0
  204. package/dist/tests/properties/csp.property.test.js.map +1 -0
  205. package/dist/tests/properties/generators.d.ts +78 -0
  206. package/dist/tests/properties/generators.d.ts.map +1 -0
  207. package/dist/tests/properties/generators.js +348 -0
  208. package/dist/tests/properties/generators.js.map +1 -0
  209. package/dist/tests/properties/ho-unify.property.test.d.ts +2 -0
  210. package/dist/tests/properties/ho-unify.property.test.d.ts.map +1 -0
  211. package/dist/tests/properties/ho-unify.property.test.js +46 -0
  212. package/dist/tests/properties/ho-unify.property.test.js.map +1 -0
  213. package/dist/tests/properties/hyperreal.property.test.d.ts +2 -0
  214. package/dist/tests/properties/hyperreal.property.test.d.ts.map +1 -0
  215. package/dist/tests/properties/hyperreal.property.test.js +33 -0
  216. package/dist/tests/properties/hyperreal.property.test.js.map +1 -0
  217. package/dist/tests/properties/intuit-nj.property.test.d.ts +2 -0
  218. package/dist/tests/properties/intuit-nj.property.test.d.ts.map +1 -0
  219. package/dist/tests/properties/intuit-nj.property.test.js +57 -0
  220. package/dist/tests/properties/intuit-nj.property.test.js.map +1 -0
  221. package/dist/tests/properties/lambda-calc.property.test.d.ts +2 -0
  222. package/dist/tests/properties/lambda-calc.property.test.d.ts.map +1 -0
  223. package/dist/tests/properties/lambda-calc.property.test.js +35 -0
  224. package/dist/tests/properties/lambda-calc.property.test.js.map +1 -0
  225. package/dist/tests/properties/mln.property.test.d.ts +2 -0
  226. package/dist/tests/properties/mln.property.test.d.ts.map +1 -0
  227. package/dist/tests/properties/mln.property.test.js +41 -0
  228. package/dist/tests/properties/mln.property.test.js.map +1 -0
  229. package/dist/tests/properties/mltt.property.test.d.ts +2 -0
  230. package/dist/tests/properties/mltt.property.test.d.ts.map +1 -0
  231. package/dist/tests/properties/mltt.property.test.js +33 -0
  232. package/dist/tests/properties/mltt.property.test.js.map +1 -0
  233. package/dist/tests/properties/nbe.property.test.d.ts +2 -0
  234. package/dist/tests/properties/nbe.property.test.d.ts.map +1 -0
  235. package/dist/tests/properties/nbe.property.test.js +44 -0
  236. package/dist/tests/properties/nbe.property.test.js.map +1 -0
  237. package/dist/tests/properties/planning.property.test.d.ts +2 -0
  238. package/dist/tests/properties/planning.property.test.d.ts.map +1 -0
  239. package/dist/tests/properties/planning.property.test.js +51 -0
  240. package/dist/tests/properties/planning.property.test.js.map +1 -0
  241. package/dist/tests/properties/profile-bridge.property.test.d.ts +2 -0
  242. package/dist/tests/properties/profile-bridge.property.test.d.ts.map +1 -0
  243. package/dist/tests/properties/profile-bridge.property.test.js +71 -0
  244. package/dist/tests/properties/profile-bridge.property.test.js.map +1 -0
  245. package/dist/tests/properties/refinement-types.property.test.d.ts +2 -0
  246. package/dist/tests/properties/refinement-types.property.test.d.ts.map +1 -0
  247. package/dist/tests/properties/refinement-types.property.test.js +37 -0
  248. package/dist/tests/properties/refinement-types.property.test.js.map +1 -0
  249. package/dist/tests/properties/sequent-g3.property.test.d.ts +2 -0
  250. package/dist/tests/properties/sequent-g3.property.test.d.ts.map +1 -0
  251. package/dist/tests/properties/sequent-g3.property.test.js +34 -0
  252. package/dist/tests/properties/sequent-g3.property.test.js.map +1 -0
  253. package/dist/tests/properties/symbolic-diff.property.test.d.ts +2 -0
  254. package/dist/tests/properties/symbolic-diff.property.test.d.ts.map +1 -0
  255. package/dist/tests/properties/symbolic-diff.property.test.js +49 -0
  256. package/dist/tests/properties/symbolic-diff.property.test.js.map +1 -0
  257. package/dist/tests/properties/system-f.property.test.d.ts +2 -0
  258. package/dist/tests/properties/system-f.property.test.d.ts.map +1 -0
  259. package/dist/tests/properties/system-f.property.test.js +37 -0
  260. package/dist/tests/properties/system-f.property.test.js.map +1 -0
  261. package/dist/tests/properties/theorem-cache.property.test.d.ts +2 -0
  262. package/dist/tests/properties/theorem-cache.property.test.d.ts.map +1 -0
  263. package/dist/tests/properties/theorem-cache.property.test.js +38 -0
  264. package/dist/tests/properties/theorem-cache.property.test.js.map +1 -0
  265. package/dist/tests/properties/trs.property.test.d.ts +2 -0
  266. package/dist/tests/properties/trs.property.test.d.ts.map +1 -0
  267. package/dist/tests/properties/trs.property.test.js +34 -0
  268. package/dist/tests/properties/trs.property.test.js.map +1 -0
  269. package/dist/tests/properties/unification.property.test.d.ts +2 -0
  270. package/dist/tests/properties/unification.property.test.d.ts.map +1 -0
  271. package/dist/tests/properties/unification.property.test.js +42 -0
  272. package/dist/tests/properties/unification.property.test.js.map +1 -0
  273. package/dist/tests/smt-lib/emitter.test.d.ts +2 -0
  274. package/dist/tests/smt-lib/emitter.test.d.ts.map +1 -0
  275. package/dist/tests/smt-lib/emitter.test.js +155 -0
  276. package/dist/tests/smt-lib/emitter.test.js.map +1 -0
  277. package/dist/tests/smt-lib/parser.test.d.ts +2 -0
  278. package/dist/tests/smt-lib/parser.test.d.ts.map +1 -0
  279. package/dist/tests/smt-lib/parser.test.js +164 -0
  280. package/dist/tests/smt-lib/parser.test.js.map +1 -0
  281. package/dist/tests/smt-lib/tokenizer.test.d.ts +2 -0
  282. package/dist/tests/smt-lib/tokenizer.test.d.ts.map +1 -0
  283. package/dist/tests/smt-lib/tokenizer.test.js +59 -0
  284. package/dist/tests/smt-lib/tokenizer.test.js.map +1 -0
  285. package/package.json +2 -1
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const game_theory_1 = require("../../game-theory");
5
+ function pure(player, s, size) {
6
+ return { player, distribution: (0, game_theory_1.pureDistribution)(s, size) };
7
+ }
8
+ function mixed(player, dist) {
9
+ return { player, distribution: dist };
10
+ }
11
+ (0, vitest_1.describe)('game-theory — common-games sanity', () => {
12
+ (0, vitest_1.it)("Prisoner's Dilemma: único Nash puro (D, D) con payoff (1, 1)", () => {
13
+ const g = (0, game_theory_1.prisonersDilemma)();
14
+ const eqs = (0, game_theory_1.findPureNash)(g);
15
+ (0, vitest_1.expect)(eqs).toHaveLength(1);
16
+ const eq = eqs[0];
17
+ (0, vitest_1.expect)(eq.isPure).toBe(true);
18
+ (0, vitest_1.expect)(eq.isStrict).toBe(true);
19
+ (0, vitest_1.expect)(eq.strategies[0].distribution).toEqual([0, 1]);
20
+ (0, vitest_1.expect)(eq.strategies[1].distribution).toEqual([0, 1]);
21
+ (0, vitest_1.expect)(eq.payoffs).toEqual([1, 1]);
22
+ });
23
+ (0, vitest_1.it)('Matching Pennies: no hay Nash puro', () => {
24
+ const g = (0, game_theory_1.matchingPennies)();
25
+ const eqs = (0, game_theory_1.findPureNash)(g);
26
+ (0, vitest_1.expect)(eqs).toHaveLength(0);
27
+ });
28
+ (0, vitest_1.it)('Matching Pennies: Nash mixto (1/2, 1/2) via support enumeration', () => {
29
+ const g = (0, game_theory_1.matchingPennies)();
30
+ const all = (0, game_theory_1.enumerateAllNash)(g);
31
+ (0, vitest_1.expect)(all).toHaveLength(1);
32
+ const eq = all[0];
33
+ (0, vitest_1.expect)(eq.isPure).toBe(false);
34
+ (0, vitest_1.expect)((0, game_theory_1.vectorsApproxEqual)(eq.strategies[0].distribution, [0.5, 0.5], 1e-7)).toBe(true);
35
+ (0, vitest_1.expect)((0, game_theory_1.vectorsApproxEqual)(eq.strategies[1].distribution, [0.5, 0.5], 1e-7)).toBe(true);
36
+ (0, vitest_1.expect)((0, game_theory_1.approxEqual)(eq.payoffs[0], 0, 1e-7)).toBe(true);
37
+ (0, vitest_1.expect)((0, game_theory_1.approxEqual)(eq.payoffs[1], 0, 1e-7)).toBe(true);
38
+ });
39
+ (0, vitest_1.it)('Rock-Paper-Scissors: único Nash mixto (1/3, 1/3, 1/3) cada jugador', () => {
40
+ const g = (0, game_theory_1.rockPaperScissors)();
41
+ (0, vitest_1.expect)((0, game_theory_1.findPureNash)(g)).toHaveLength(0);
42
+ const all = (0, game_theory_1.enumerateAllNash)(g);
43
+ (0, vitest_1.expect)(all).toHaveLength(1);
44
+ const eq = all[0];
45
+ (0, vitest_1.expect)(eq.isPure).toBe(false);
46
+ (0, vitest_1.expect)((0, game_theory_1.vectorsApproxEqual)(eq.strategies[0].distribution, [1 / 3, 1 / 3, 1 / 3], 1e-7)).toBe(true);
47
+ (0, vitest_1.expect)((0, game_theory_1.vectorsApproxEqual)(eq.strategies[1].distribution, [1 / 3, 1 / 3, 1 / 3], 1e-7)).toBe(true);
48
+ });
49
+ (0, vitest_1.it)('Battle of the Sexes: 2 Nash puros + 1 mixto', () => {
50
+ const g = (0, game_theory_1.battleOfSexes)();
51
+ const pures = (0, game_theory_1.findPureNash)(g);
52
+ (0, vitest_1.expect)(pures).toHaveLength(2);
53
+ const all = (0, game_theory_1.enumerateAllNash)(g);
54
+ (0, vitest_1.expect)(all).toHaveLength(3);
55
+ const mixedEq = all.find((e) => !e.isPure);
56
+ (0, vitest_1.expect)(mixedEq).toBeDefined();
57
+ // En BoS con (2,1)/(0,0)/(0,0)/(1,2), el mixto es p=2/3 para player1
58
+ // (probabilidad de Opera) y q=1/3 para player2.
59
+ (0, vitest_1.expect)((0, game_theory_1.vectorsApproxEqual)(mixedEq.strategies[0].distribution, [2 / 3, 1 / 3], 1e-7)).toBe(true);
60
+ (0, vitest_1.expect)((0, game_theory_1.vectorsApproxEqual)(mixedEq.strategies[1].distribution, [1 / 3, 2 / 3], 1e-7)).toBe(true);
61
+ });
62
+ (0, vitest_1.it)('Stag Hunt: 2 Nash puros + 1 mixto', () => {
63
+ const g = (0, game_theory_1.stagHunt)();
64
+ const pures = (0, game_theory_1.findPureNash)(g);
65
+ (0, vitest_1.expect)(pures).toHaveLength(2);
66
+ const all = (0, game_theory_1.enumerateAllNash)(g);
67
+ (0, vitest_1.expect)(all).toHaveLength(3);
68
+ });
69
+ });
70
+ (0, vitest_1.describe)('game-theory — bestResponse', () => {
71
+ (0, vitest_1.it)('PD: best response a coop puro es D', () => {
72
+ const g = (0, game_theory_1.prisonersDilemma)();
73
+ // opponentStrategies debe incluir todos los jugadores; la entrada
74
+ // de "player" se ignora — usamos una distribución placeholder.
75
+ const opp = [pure(0, 0, 2), pure(1, 0, 2)];
76
+ const br = (0, game_theory_1.bestResponse)(g, 0, opp);
77
+ (0, vitest_1.expect)(br).toEqual([1]); // Defect
78
+ });
79
+ (0, vitest_1.it)('Matching Pennies: best response a mezcla 50/50 son todas las puras (empate)', () => {
80
+ const g = (0, game_theory_1.matchingPennies)();
81
+ const opp = [pure(0, 0, 2), mixed(1, [0.5, 0.5])];
82
+ const br = (0, game_theory_1.bestResponse)(g, 0, opp);
83
+ (0, vitest_1.expect)(br.sort()).toEqual([0, 1]);
84
+ });
85
+ (0, vitest_1.it)('Battle of the Sexes: best response a "Opera" puro del rival es "Opera"', () => {
86
+ const g = (0, game_theory_1.battleOfSexes)();
87
+ const opp = [pure(0, 0, 2), pure(1, 0, 2)];
88
+ const br0 = (0, game_theory_1.bestResponse)(g, 0, opp);
89
+ (0, vitest_1.expect)(br0).toEqual([0]);
90
+ });
91
+ });
92
+ (0, vitest_1.describe)('game-theory — dominance', () => {
93
+ (0, vitest_1.it)('isDominated detecta estrategia estrictamente dominada', () => {
94
+ // Jugador 1: estrategia 0 da [1,1], estrategia 1 da [3,3] → 0 dominada
95
+ const g = (0, game_theory_1.createTwoPlayerGame)([
96
+ [1, 1],
97
+ [3, 3],
98
+ ], [
99
+ [0, 0],
100
+ [0, 0],
101
+ ]);
102
+ (0, vitest_1.expect)((0, game_theory_1.isDominated)(g, 0, 0, true)).toBe(true);
103
+ (0, vitest_1.expect)((0, game_theory_1.isDominated)(g, 0, 1, true)).toBe(false);
104
+ });
105
+ (0, vitest_1.it)('eliminateDominated reduce el juego', () => {
106
+ // 3x2: la estrategia 2 del jugador 1 está dominada por la 0 (estricta).
107
+ // Las otras dos filas de P1 dan los mismos pagos, así que ninguna
108
+ // está estrictamente dominada por la otra. P2 tiene pagos planos →
109
+ // tampoco se elimina nada del lado 2.
110
+ const g = (0, game_theory_1.createTwoPlayerGame)([
111
+ [5, 5],
112
+ [5, 5], // mismo que fila 0 → no estrictamente dominada
113
+ [1, 1], // dominada por estrategia 0
114
+ ], [
115
+ [0, 0],
116
+ [0, 0],
117
+ [0, 0],
118
+ ]);
119
+ const reduced = (0, game_theory_1.eliminateDominated)(g, true);
120
+ (0, vitest_1.expect)(reduced.strategies[0]).toBe(2);
121
+ (0, vitest_1.expect)(reduced.strategies[1]).toBe(2);
122
+ });
123
+ (0, vitest_1.it)('eliminateDominated: iterado encuentra mas reducciones', () => {
124
+ // Juego donde tras eliminar una de player 1, una de player 2 queda dominada.
125
+ // Player 1 elige fila, Player 2 elige columna.
126
+ // Row 2 dominada por row 0 para P1; tras eliminarla, col 2 queda dominada por col 0 para P2.
127
+ const g = (0, game_theory_1.createTwoPlayerGame)([
128
+ [5, 4, 3], // P1 utility
129
+ [4, 3, 2],
130
+ [1, 0, -1], // dominada por fila 0
131
+ ], [
132
+ [3, 4, 2], // P2 utility
133
+ [3, 4, 2],
134
+ [3, 4, 2],
135
+ ]);
136
+ const reduced = (0, game_theory_1.eliminateDominated)(g, true);
137
+ // Tras eliminar fila 2 de P1, miramos columnas de P2.
138
+ // P2 ahora tiene matrices [[3,4,2],[3,4,2]]. col 2 (=2) está dominada por col 1 (=4).
139
+ (0, vitest_1.expect)(reduced.strategies[0]).toBeLessThanOrEqual(2);
140
+ (0, vitest_1.expect)(reduced.strategies[1]).toBeLessThanOrEqual(3);
141
+ // Al menos UNA dimensión debe haberse reducido del original
142
+ const originalProfiles = 3 * 3;
143
+ const newProfiles = reduced.strategies[0] * reduced.strategies[1];
144
+ (0, vitest_1.expect)(newProfiles).toBeLessThan(originalProfiles);
145
+ });
146
+ (0, vitest_1.it)('PD: ninguna estrategia esta dominada (D es weak-better pero ambos prefieren D)', () => {
147
+ const g = (0, game_theory_1.prisonersDilemma)();
148
+ // Cooperate está estrictamente dominada por Defect en PD
149
+ (0, vitest_1.expect)((0, game_theory_1.isDominated)(g, 0, 0, true)).toBe(true);
150
+ (0, vitest_1.expect)((0, game_theory_1.isDominated)(g, 0, 1, true)).toBe(false);
151
+ (0, vitest_1.expect)((0, game_theory_1.isDominated)(g, 1, 0, true)).toBe(true);
152
+ (0, vitest_1.expect)((0, game_theory_1.isDominated)(g, 1, 1, true)).toBe(false);
153
+ const reduced = (0, game_theory_1.eliminateDominated)(g, true);
154
+ (0, vitest_1.expect)(reduced.strategies).toEqual([1, 1]);
155
+ (0, vitest_1.expect)(reduced.payoffs[0]).toEqual([1]);
156
+ (0, vitest_1.expect)(reduced.payoffs[1]).toEqual([1]);
157
+ });
158
+ });
159
+ (0, vitest_1.describe)('game-theory — lemke-howson', () => {
160
+ (0, vitest_1.it)('lemkeHowson encuentra Nash en matching pennies', () => {
161
+ const g = (0, game_theory_1.matchingPennies)();
162
+ const eq = (0, game_theory_1.lemkeHowson)(g, 0);
163
+ (0, vitest_1.expect)(eq).not.toBeNull();
164
+ (0, vitest_1.expect)((0, game_theory_1.vectorsApproxEqual)(eq.strategies[0].distribution, [0.5, 0.5], 1e-6)).toBe(true);
165
+ (0, vitest_1.expect)((0, game_theory_1.vectorsApproxEqual)(eq.strategies[1].distribution, [0.5, 0.5], 1e-6)).toBe(true);
166
+ });
167
+ (0, vitest_1.it)('lemkeHowson encuentra Nash en RPS', () => {
168
+ const g = (0, game_theory_1.rockPaperScissors)();
169
+ const eq = (0, game_theory_1.lemkeHowson)(g, 0);
170
+ (0, vitest_1.expect)(eq).not.toBeNull();
171
+ (0, vitest_1.expect)((0, game_theory_1.vectorsApproxEqual)(eq.strategies[0].distribution, [1 / 3, 1 / 3, 1 / 3], 1e-6)).toBe(true);
172
+ });
173
+ (0, vitest_1.it)('lemkeHowson encuentra UN Nash en battle of sexes', () => {
174
+ const g = (0, game_theory_1.battleOfSexes)();
175
+ const eq = (0, game_theory_1.lemkeHowson)(g, 0);
176
+ (0, vitest_1.expect)(eq).not.toBeNull();
177
+ // Debe ser uno de los 3 Nash conocidos
178
+ const allEqs = (0, game_theory_1.enumerateAllNash)(g);
179
+ const match = allEqs.some((e) => (0, game_theory_1.vectorsApproxEqual)(e.strategies[0].distribution, eq.strategies[0].distribution, 1e-5) &&
180
+ (0, game_theory_1.vectorsApproxEqual)(e.strategies[1].distribution, eq.strategies[1].distribution, 1e-5));
181
+ (0, vitest_1.expect)(match).toBe(true);
182
+ });
183
+ });
184
+ (0, vitest_1.describe)('game-theory — expectedPayoff', () => {
185
+ (0, vitest_1.it)('expectedPayoff es lineal en el perfil mixto', () => {
186
+ const g = (0, game_theory_1.matchingPennies)();
187
+ const halfHalf = [mixed(0, [0.5, 0.5]), mixed(1, [0.5, 0.5])];
188
+ (0, vitest_1.expect)((0, game_theory_1.approxEqual)((0, game_theory_1.expectedPayoff)(g, 0, halfHalf), 0, 1e-9)).toBe(true);
189
+ (0, vitest_1.expect)((0, game_theory_1.approxEqual)((0, game_theory_1.expectedPayoff)(g, 1, halfHalf), 0, 1e-9)).toBe(true);
190
+ // Si player 2 juega H puro y player 1 juega 50/50, payoff de player 1 = 0
191
+ const allH = [mixed(0, [0.5, 0.5]), pure(1, 0, 2)];
192
+ (0, vitest_1.expect)((0, game_theory_1.approxEqual)((0, game_theory_1.expectedPayoff)(g, 0, allH), 0, 1e-9)).toBe(true);
193
+ // y payoff de player 2 = 0
194
+ (0, vitest_1.expect)((0, game_theory_1.approxEqual)((0, game_theory_1.expectedPayoff)(g, 1, allH), 0, 1e-9)).toBe(true);
195
+ });
196
+ });
197
+ (0, vitest_1.describe)('game-theory — asymmetric NxM games', () => {
198
+ (0, vitest_1.it)('2x3 con única Nash pura', () => {
199
+ // Construido para que (0, 1) sea la única Nash:
200
+ // P1: fila 0 le da 5,7,3 ; fila 1 le da 4,2,1 → fila 0 domina
201
+ // P2: dada fila 0, columna 1 (=7) le da 6 vs 1 y 2 → mejor.
202
+ const g = (0, game_theory_1.createTwoPlayerGame)([
203
+ [5, 7, 3],
204
+ [4, 2, 1],
205
+ ], [
206
+ [1, 6, 2],
207
+ [3, 5, 4],
208
+ ]);
209
+ const eqs = (0, game_theory_1.findPureNash)(g);
210
+ (0, vitest_1.expect)(eqs.length).toBeGreaterThanOrEqual(1);
211
+ const has01 = eqs.some((e) => e.strategies[0].distribution[0] === 1 && e.strategies[1].distribution[1] === 1);
212
+ (0, vitest_1.expect)(has01).toBe(true);
213
+ });
214
+ (0, vitest_1.it)('enumerateAllNash respeta maxSize cap', () => {
215
+ const g = (0, game_theory_1.rockPaperScissors)();
216
+ const cap1 = (0, game_theory_1.enumerateAllNash)(g, 1);
217
+ // Cap a tamaño 1 → solo busca puros (no hay en RPS)
218
+ (0, vitest_1.expect)(cap1).toHaveLength(0);
219
+ const cap3 = (0, game_theory_1.enumerateAllNash)(g, 3);
220
+ (0, vitest_1.expect)(cap3).toHaveLength(1);
221
+ });
222
+ });
223
+ (0, vitest_1.describe)('game-theory — N-player simétricos chicos', () => {
224
+ (0, vitest_1.it)('3-player coordination game: hay Nash puros donde todos coordinan', () => {
225
+ // 3 jugadores, 2 estrategias cada uno (A=0, B=1).
226
+ // payoff[player][profile_index]: si todos juegan lo mismo dan 1, sino 0.
227
+ // perfil index: (s1, s2, s3) → s1*4 + s2*2 + s3
228
+ const players = 3;
229
+ const sizes = [2, 2, 2];
230
+ const payoff = (s1, s2, s3) => (s1 === s2 && s2 === s3 ? 1 : 0);
231
+ const payoffs = [];
232
+ for (let p = 0; p < players; p++) {
233
+ const row = [];
234
+ for (let s1 = 0; s1 < 2; s1++) {
235
+ for (let s2 = 0; s2 < 2; s2++) {
236
+ for (let s3 = 0; s3 < 2; s3++) {
237
+ row.push(payoff(s1, s2, s3));
238
+ }
239
+ }
240
+ }
241
+ payoffs.push(row);
242
+ }
243
+ const g = { players, strategies: sizes, payoffs };
244
+ const pures = (0, game_theory_1.findPureNash)(g);
245
+ // (0,0,0) y (1,1,1) son Nash; (0,0,1) no (player 3 desviaría a 0).
246
+ (0, vitest_1.expect)(pures.length).toBeGreaterThanOrEqual(2);
247
+ const allCoord = pures.filter((e) => e.strategies.every((s) => s.distribution[0] === 1) ||
248
+ e.strategies.every((s) => s.distribution[1] === 1));
249
+ (0, vitest_1.expect)(allCoord).toHaveLength(2);
250
+ });
251
+ });
252
+ //# sourceMappingURL=game-theory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"game-theory.test.js","sourceRoot":"","sources":["../../../src/tests/game-theory/game-theory.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hol.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hol.test.d.ts","sourceRoot":"","sources":["../../../src/tests/hol/hol.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,340 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const hol_1 = require("../../profiles/hol");
5
+ // --- Helpers ---
6
+ const ty_a = (0, hol_1.tvar)('α');
7
+ const ty_b = (0, hol_1.tvar)('β');
8
+ const x_a = (0, hol_1.mkVar)('x', ty_a);
9
+ const y_a = (0, hol_1.mkVar)('y', ty_a);
10
+ const z_a = (0, hol_1.mkVar)('z', ty_a);
11
+ const p_b = (0, hol_1.mkVar)('p', hol_1.TyBool);
12
+ const q_b = (0, hol_1.mkVar)('q', hol_1.TyBool);
13
+ const f_a_a = (0, hol_1.mkVar)('f', (0, hol_1.funTy)(ty_a, ty_a));
14
+ const g_a_a = (0, hol_1.mkVar)('g', (0, hol_1.funTy)(ty_a, ty_a));
15
+ // =================================================================
16
+ // Tipos
17
+ // =================================================================
18
+ (0, vitest_1.describe)('HOL — sistema de tipos', () => {
19
+ (0, vitest_1.it)('typeEq distingue tconst de tvar con mismo nombre', () => {
20
+ (0, vitest_1.expect)((0, hol_1.typeEq)((0, hol_1.tconst)('α'), (0, hol_1.tvar)('α'))).toBe(false);
21
+ });
22
+ (0, vitest_1.it)('typeEq es estructural sobre flechas', () => {
23
+ (0, vitest_1.expect)((0, hol_1.typeEq)((0, hol_1.funTy)(hol_1.TyBool, hol_1.TyBool), (0, hol_1.funTy)(hol_1.TyBool, hol_1.TyBool))).toBe(true);
24
+ (0, vitest_1.expect)((0, hol_1.typeEq)((0, hol_1.funTy)(hol_1.TyBool, hol_1.TyBool), (0, hol_1.funTy)(hol_1.TyBool, hol_1.TyInd))).toBe(false);
25
+ });
26
+ (0, vitest_1.it)('funTyN asocia a derecha', () => {
27
+ const t = (0, hol_1.funTyN)(hol_1.TyBool, hol_1.TyBool, hol_1.TyBool); // bool → bool → bool
28
+ (0, vitest_1.expect)((0, hol_1.typeToString)(t)).toBe('(bool → (bool → bool))');
29
+ });
30
+ (0, vitest_1.it)('substType reemplaza tvars y respeta tconsts', () => {
31
+ const t = (0, hol_1.funTy)((0, hol_1.tvar)('α'), (0, hol_1.tvar)('β'));
32
+ const sub = (0, hol_1.substType)({ α: hol_1.TyBool, β: hol_1.TyInd }, t);
33
+ (0, vitest_1.expect)((0, hol_1.typeEq)(sub, (0, hol_1.funTy)(hol_1.TyBool, hol_1.TyInd))).toBe(true);
34
+ });
35
+ });
36
+ // =================================================================
37
+ // Type inference
38
+ // =================================================================
39
+ (0, vitest_1.describe)('HOL — type inference', () => {
40
+ (0, vitest_1.it)('typeOf de λx:bool. x = bool → bool', () => {
41
+ const t = (0, hol_1.mkAbs)('x', hol_1.TyBool, (0, hol_1.mkVar)('x', hol_1.TyBool));
42
+ (0, vitest_1.expect)((0, hol_1.typeEq)((0, hol_1.typeOf)(t), (0, hol_1.funTy)(hol_1.TyBool, hol_1.TyBool))).toBe(true);
43
+ });
44
+ (0, vitest_1.it)('typeOf de λx:α. λy:α. x = α → α → α', () => {
45
+ const t = (0, hol_1.mkAbs)('x', ty_a, (0, hol_1.mkAbs)('y', ty_a, (0, hol_1.mkVar)('x', ty_a)));
46
+ (0, vitest_1.expect)((0, hol_1.typeEq)((0, hol_1.typeOf)(t), (0, hol_1.funTyN)(ty_a, ty_a, ty_a))).toBe(true);
47
+ });
48
+ (0, vitest_1.it)('typeOf rechaza ill-typed: aplicación con tipos incompatibles', () => {
49
+ // f : α → α aplicado a p : bool (cuando α ≠ bool en este contexto)
50
+ (0, vitest_1.expect)(() => (0, hol_1.mkCombTerm)(f_a_a, p_b)).toThrow();
51
+ });
52
+ (0, vitest_1.it)('typeOf rechaza aplicación sobre no-función', () => {
53
+ // x : α aplicado a y : α — x no es función
54
+ (0, vitest_1.expect)(() => (0, hol_1.mkCombTerm)(x_a, y_a)).toThrow();
55
+ });
56
+ (0, vitest_1.it)('typeOf calcula codominio de combinación bien tipada', () => {
57
+ const t = (0, hol_1.mkCombTerm)(f_a_a, x_a); // f x : α
58
+ (0, vitest_1.expect)((0, hol_1.typeEq)((0, hol_1.typeOf)(t), ty_a)).toBe(true);
59
+ });
60
+ });
61
+ // =================================================================
62
+ // α-equivalencia
63
+ // =================================================================
64
+ (0, vitest_1.describe)('HOL — α-equivalencia', () => {
65
+ (0, vitest_1.it)('λx:α. x ≡α λy:α. y', () => {
66
+ const t1 = (0, hol_1.mkAbs)('x', ty_a, (0, hol_1.mkVar)('x', ty_a));
67
+ const t2 = (0, hol_1.mkAbs)('y', ty_a, (0, hol_1.mkVar)('y', ty_a));
68
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(t1, t2)).toBe(true);
69
+ });
70
+ (0, vitest_1.it)('λx:α. x ≢α λy:β. y (tipos distintos)', () => {
71
+ const t1 = (0, hol_1.mkAbs)('x', ty_a, (0, hol_1.mkVar)('x', ty_a));
72
+ const t2 = (0, hol_1.mkAbs)('y', ty_b, (0, hol_1.mkVar)('y', ty_b));
73
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(t1, t2)).toBe(false);
74
+ });
75
+ (0, vitest_1.it)('variables libres con mismo nombre y mismo tipo son iguales', () => {
76
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(x_a, (0, hol_1.mkVar)('x', ty_a))).toBe(true);
77
+ });
78
+ (0, vitest_1.it)('variables libres con mismo nombre pero distinto tipo NO son iguales', () => {
79
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(x_a, (0, hol_1.mkVar)('x', ty_b))).toBe(false);
80
+ });
81
+ });
82
+ // =================================================================
83
+ // Reglas primitivas
84
+ // =================================================================
85
+ (0, vitest_1.describe)('HOL — reglas primitivas: REFL', () => {
86
+ (0, vitest_1.it)('refl(x:α) produce |- x = x', () => {
87
+ const th = (0, hol_1.refl)(x_a);
88
+ (0, vitest_1.expect)(th.hyps).toEqual([]);
89
+ const eq = (0, hol_1.destEq)(th.concl);
90
+ (0, vitest_1.expect)(eq).not.toBeNull();
91
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[0], x_a)).toBe(true);
92
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[1], x_a)).toBe(true);
93
+ (0, vitest_1.expect)(th.rule).toBe('REFL');
94
+ });
95
+ (0, vitest_1.it)('refl sobre término booleano: |- T = T', () => {
96
+ const th = (0, hol_1.refl)(hol_1.True);
97
+ (0, vitest_1.expect)((0, hol_1.typeEq)((0, hol_1.typeOf)(th.concl), hol_1.TyBool)).toBe(true);
98
+ });
99
+ });
100
+ (0, vitest_1.describe)('HOL — reglas primitivas: TRANS', () => {
101
+ (0, vitest_1.it)('TRANS compone igualdades: x=y, y=z |- x=z', () => {
102
+ // Asumimos x = y y y = z, luego TRANS.
103
+ const xyEq = (0, hol_1.mkEq)(x_a, y_a);
104
+ const yzEq = (0, hol_1.mkEq)(y_a, z_a);
105
+ const th1 = (0, hol_1.assume)(xyEq);
106
+ const th2 = (0, hol_1.assume)(yzEq);
107
+ const th = (0, hol_1.trans)(th1, th2);
108
+ const eq = (0, hol_1.destEq)(th.concl);
109
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[0], x_a)).toBe(true);
110
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[1], z_a)).toBe(true);
111
+ (0, vitest_1.expect)(th.hyps).toHaveLength(2);
112
+ });
113
+ (0, vitest_1.it)('TRANS falla si los puntos medios no encajan', () => {
114
+ const th1 = (0, hol_1.assume)((0, hol_1.mkEq)(x_a, y_a));
115
+ const th2 = (0, hol_1.assume)((0, hol_1.mkEq)(z_a, x_a));
116
+ (0, vitest_1.expect)(() => (0, hol_1.trans)(th1, th2)).toThrow();
117
+ });
118
+ (0, vitest_1.it)('TRANS falla si una premisa no es igualdad', () => {
119
+ const th1 = (0, hol_1.assume)(p_b);
120
+ const th2 = (0, hol_1.assume)((0, hol_1.mkEq)(x_a, y_a));
121
+ (0, vitest_1.expect)(() => (0, hol_1.trans)(th1, th2)).toThrow();
122
+ });
123
+ });
124
+ (0, vitest_1.describe)('HOL — reglas primitivas: MK_COMB', () => {
125
+ (0, vitest_1.it)('MK_COMB combina f=g y x=y para dar f x = g y', () => {
126
+ const th1 = (0, hol_1.assume)((0, hol_1.mkEq)(f_a_a, g_a_a));
127
+ const th2 = (0, hol_1.assume)((0, hol_1.mkEq)(x_a, y_a));
128
+ const th = (0, hol_1.mkComb)(th1, th2);
129
+ const eq = (0, hol_1.destEq)(th.concl);
130
+ (0, vitest_1.expect)(eq).not.toBeNull();
131
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[0], (0, hol_1.mkCombTerm)(f_a_a, x_a))).toBe(true);
132
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[1], (0, hol_1.mkCombTerm)(g_a_a, y_a))).toBe(true);
133
+ });
134
+ (0, vitest_1.it)('MK_COMB falla si los tipos no encajan', () => {
135
+ // f : α → α y x : bool no compatibles.
136
+ const th1 = (0, hol_1.assume)((0, hol_1.mkEq)(f_a_a, g_a_a));
137
+ const th2 = (0, hol_1.assume)((0, hol_1.mkEq)(p_b, q_b));
138
+ (0, vitest_1.expect)(() => (0, hol_1.mkComb)(th1, th2)).toThrow();
139
+ });
140
+ });
141
+ (0, vitest_1.describe)('HOL — reglas primitivas: ABS', () => {
142
+ (0, vitest_1.it)('ABS sobre |- x = x produce |- (λv:α. x) = (λv:α. x)', () => {
143
+ // Partimos de REFL (sin hipótesis) para que ABS pueda
144
+ // abstraer cualquier variable.
145
+ const v = (0, hol_1.mkVar)('v', ty_a);
146
+ const th1 = (0, hol_1.refl)(v); // |- v = v
147
+ const th = (0, hol_1.abs)(v, th1); // |- (λv. v) = (λv. v)
148
+ const eq = (0, hol_1.destEq)(th.concl);
149
+ (0, vitest_1.expect)(eq).not.toBeNull();
150
+ (0, vitest_1.expect)(eq[0].kind).toBe('abs');
151
+ (0, vitest_1.expect)(eq[1].kind).toBe('abs');
152
+ (0, vitest_1.expect)(th.hyps).toEqual([]);
153
+ });
154
+ (0, vitest_1.it)('ABS falla si la variable aparece libre en una hipótesis', () => {
155
+ // Hipótesis menciona x libre; abstraer x no es válido.
156
+ const th1 = (0, hol_1.assume)((0, hol_1.mkEq)(x_a, y_a));
157
+ (0, vitest_1.expect)(() => (0, hol_1.abs)(x_a, th1)).toThrow();
158
+ });
159
+ });
160
+ (0, vitest_1.describe)('HOL — reglas primitivas: BETA', () => {
161
+ (0, vitest_1.it)('BETA de (λx:α. x) x produce |- (λx.x) x = x', () => {
162
+ const v = (0, hol_1.mkVar)('x', ty_a);
163
+ const lam = (0, hol_1.mkAbs)('x', ty_a, v);
164
+ const app = (0, hol_1.mkCombTerm)(lam, v);
165
+ const th = (0, hol_1.beta)(app);
166
+ const eq = (0, hol_1.destEq)(th.concl);
167
+ (0, vitest_1.expect)(eq).not.toBeNull();
168
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[0], app)).toBe(true);
169
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[1], v)).toBe(true);
170
+ });
171
+ (0, vitest_1.it)('BETA falla sobre términos que no son (λv.t) v', () => {
172
+ (0, vitest_1.expect)(() => (0, hol_1.beta)(x_a)).toThrow();
173
+ // (λx.x) y — el argumento no coincide con el binder
174
+ const lam = (0, hol_1.mkAbs)('x', ty_a, (0, hol_1.mkVar)('x', ty_a));
175
+ const app = (0, hol_1.mkCombTerm)(lam, y_a);
176
+ (0, vitest_1.expect)(() => (0, hol_1.beta)(app)).toThrow();
177
+ });
178
+ });
179
+ (0, vitest_1.describe)('HOL — reglas primitivas: ASSUME', () => {
180
+ (0, vitest_1.it)('ASSUME(p) produce p |- p', () => {
181
+ const th = (0, hol_1.assume)(p_b);
182
+ (0, vitest_1.expect)(th.hyps).toHaveLength(1);
183
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(th.hyps[0], p_b)).toBe(true);
184
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(th.concl, p_b)).toBe(true);
185
+ });
186
+ (0, vitest_1.it)('ASSUME rechaza términos no-booleanos', () => {
187
+ (0, vitest_1.expect)(() => (0, hol_1.assume)(x_a)).toThrow();
188
+ });
189
+ });
190
+ (0, vitest_1.describe)('HOL — reglas primitivas: EQ_MP', () => {
191
+ (0, vitest_1.it)('EQ_MP con |- p ↔ q y |- p deriva |- q', () => {
192
+ const th1 = (0, hol_1.assume)((0, hol_1.mkEq)(p_b, q_b)); // p = q (bi-implicación)
193
+ const th2 = (0, hol_1.assume)(p_b);
194
+ const th = (0, hol_1.eqMp)(th1, th2);
195
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(th.concl, q_b)).toBe(true);
196
+ });
197
+ (0, vitest_1.it)('EQ_MP falla si LHS de la igualdad no es α-igual a la 2da premisa', () => {
198
+ const r_b = (0, hol_1.mkVar)('r', hol_1.TyBool);
199
+ const th1 = (0, hol_1.assume)((0, hol_1.mkEq)(p_b, q_b));
200
+ const th2 = (0, hol_1.assume)(r_b);
201
+ (0, vitest_1.expect)(() => (0, hol_1.eqMp)(th1, th2)).toThrow();
202
+ });
203
+ (0, vitest_1.it)('EQ_MP falla si la igualdad no es entre booleanos', () => {
204
+ const th1 = (0, hol_1.assume)((0, hol_1.mkEq)(x_a, y_a)); // α = α, no bool
205
+ const th2 = (0, hol_1.assume)(p_b);
206
+ (0, vitest_1.expect)(() => (0, hol_1.eqMp)(th1, th2)).toThrow();
207
+ });
208
+ });
209
+ (0, vitest_1.describe)('HOL — reglas primitivas: DEDUCT_ANTISYM_RULE', () => {
210
+ (0, vitest_1.it)('p |- q, q |- p derivan |- p ↔ q', () => {
211
+ // Construcción artificial: asume q desde p y p desde q.
212
+ // Empezamos con p |- p y q |- q, y derivamos un teorema
213
+ // anti-simétrico p ↔ p (caso trivial).
214
+ const th1 = (0, hol_1.assume)(p_b);
215
+ const th2 = (0, hol_1.assume)(q_b);
216
+ // th1: p |- p, th2: q |- q. DEDUCT_ANTISYM_RULE da:
217
+ // (hyps(th1) - {q}) ∪ (hyps(th2) - {p}) |- p ↔ q
218
+ // = (p) ∪ (q) |- p ↔ q
219
+ const th = (0, hol_1.deductAntisymRule)(th1, th2);
220
+ const eq = (0, hol_1.destEq)(th.concl);
221
+ (0, vitest_1.expect)(eq).not.toBeNull();
222
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[0], p_b)).toBe(true);
223
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[1], q_b)).toBe(true);
224
+ });
225
+ (0, vitest_1.it)('limpia hipótesis que coinciden con la otra conclusión', () => {
226
+ // Construye: {p} |- q (asumiendo p,q como hipótesis falsa),
227
+ // {q} |- p (idem). El resultado debe ser |- p ↔ q sin hipótesis.
228
+ // Para no necesitar más maquinaria, usamos el caso donde
229
+ // th1: p |- q (artificial: assume q con la hipótesis p añadida vía
230
+ // un truco no disponible). Probaremos un caso más simple:
231
+ // th1 = ASSUME(p ⇒ q) → no, ese tampoco. Vamos a usar el caso
232
+ // canónico: |- p ⇒ q (vacuo). Simplificado: si th1: |- p, th2: |- p,
233
+ // entonces (hyps(th1) - {p}) ∪ (hyps(th2) - {p}) |- p ↔ p.
234
+ const reflP = (0, hol_1.refl)(p_b); // |- p = p
235
+ // No es ideal, pero confirmamos que con teoremas vacíos de hipótesis
236
+ // el resultado tampoco tiene hipótesis.
237
+ const th = (0, hol_1.deductAntisymRule)(reflP, reflP);
238
+ (0, vitest_1.expect)(th.hyps).toEqual([]);
239
+ });
240
+ });
241
+ (0, vitest_1.describe)('HOL — reglas primitivas: INST_TYPE', () => {
242
+ (0, vitest_1.it)('instType reemplaza variables de tipo en el teorema', () => {
243
+ const th1 = (0, hol_1.refl)(x_a); // |- (x:α) = (x:α)
244
+ const th = (0, hol_1.instType)({ α: hol_1.TyBool }, th1);
245
+ const eq = (0, hol_1.destEq)(th.concl);
246
+ (0, vitest_1.expect)(eq).not.toBeNull();
247
+ (0, vitest_1.expect)((0, hol_1.typeEq)((0, hol_1.typeOf)(eq[0]), hol_1.TyBool)).toBe(true);
248
+ });
249
+ });
250
+ (0, vitest_1.describe)('HOL — reglas primitivas: INST', () => {
251
+ (0, vitest_1.it)('inst reemplaza variables libres por términos', () => {
252
+ const th1 = (0, hol_1.refl)(x_a); // |- x = x
253
+ const th = (0, hol_1.inst)({ x: y_a }, th1); // |- y = y
254
+ const eq = (0, hol_1.destEq)(th.concl);
255
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[0], y_a)).toBe(true);
256
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[1], y_a)).toBe(true);
257
+ });
258
+ (0, vitest_1.it)('inst falla si el tipo del valor no coincide con la variable', () => {
259
+ // x : α, intentamos sustituirla por algo de tipo bool → la
260
+ // sustitución reemplaza por nombre+tipo, así que la variable
261
+ // libre x:α no será encontrada y el teorema vuelve casi sin
262
+ // cambios. Pero más interesante: si inst llega a producir un
263
+ // teorema, la sustitución solo afecta x donde su tipo coincida.
264
+ const th1 = (0, hol_1.refl)(x_a); // |- (x:α) = (x:α)
265
+ // Sustituimos x por p:bool: como el tipo no coincide, no debería
266
+ // afectar el teorema (queda igual). Esto se considera comportamiento
267
+ // correcto en HOL.
268
+ const th = (0, hol_1.inst)({ x: p_b }, th1);
269
+ // El teorema queda inalterado: x:α no fue tocado porque buscamos
270
+ // x:bool. Por lo tanto sigue siendo |- (x:α) = (x:α).
271
+ const eq = (0, hol_1.destEq)(th.concl);
272
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[0], x_a)).toBe(true);
273
+ });
274
+ });
275
+ // =================================================================
276
+ // Free vars y captura
277
+ // =================================================================
278
+ (0, vitest_1.describe)('HOL — free vars y sustitución capture-free', () => {
279
+ (0, vitest_1.it)('freeVars distingue libres de ligadas', () => {
280
+ // λx:α. x (sin libres) vs (f x) (con f y x libres)
281
+ const lam = (0, hol_1.mkAbs)('x', ty_a, (0, hol_1.mkVar)('x', ty_a));
282
+ (0, vitest_1.expect)((0, hol_1.freeVars)(lam)).toHaveLength(0);
283
+ const app = (0, hol_1.mkCombTerm)(f_a_a, x_a);
284
+ const fvs = (0, hol_1.freeVars)(app);
285
+ (0, vitest_1.expect)(fvs).toHaveLength(2);
286
+ (0, vitest_1.expect)(fvs.map((v) => v.name).sort()).toEqual(['f', 'x']);
287
+ });
288
+ (0, vitest_1.it)('occursFree detecta correctamente', () => {
289
+ const lam = (0, hol_1.mkAbs)('x', ty_a, (0, hol_1.mkVar)('x', ty_a));
290
+ (0, vitest_1.expect)((0, hol_1.occursFree)('x', ty_a, lam)).toBe(false);
291
+ (0, vitest_1.expect)((0, hol_1.occursFree)('f', (0, hol_1.funTy)(ty_a, ty_a), (0, hol_1.mkCombTerm)(f_a_a, x_a))).toBe(true);
292
+ });
293
+ });
294
+ // =================================================================
295
+ // Conectivas / cuantificadores
296
+ // =================================================================
297
+ (0, vitest_1.describe)('HOL — conectivas y cuantificadores definidos', () => {
298
+ (0, vitest_1.it)('mkAnd produce un término de tipo bool', () => {
299
+ const t = (0, hol_1.mkAnd)(p_b, q_b);
300
+ (0, vitest_1.expect)((0, hol_1.typeEq)((0, hol_1.typeOf)(t), hol_1.TyBool)).toBe(true);
301
+ });
302
+ (0, vitest_1.it)('mkImplies produce un término de tipo bool', () => {
303
+ const t = (0, hol_1.mkImplies)(p_b, q_b);
304
+ (0, vitest_1.expect)((0, hol_1.typeEq)((0, hol_1.typeOf)(t), hol_1.TyBool)).toBe(true);
305
+ });
306
+ (0, vitest_1.it)('mkForall produce un término bool con un λ interno bien tipado', () => {
307
+ // ∀x:α. (f x) = (f x) — el cuerpo es bool sólo si f produce bool.
308
+ const fBool = (0, hol_1.mkVar)('P', (0, hol_1.funTy)(ty_a, hol_1.TyBool));
309
+ const body = (0, hol_1.mkCombTerm)(fBool, (0, hol_1.mkVar)('x', ty_a));
310
+ const forall = (0, hol_1.mkForall)('x', ty_a, body);
311
+ (0, vitest_1.expect)((0, hol_1.typeEq)((0, hol_1.typeOf)(forall), hol_1.TyBool)).toBe(true);
312
+ });
313
+ (0, vitest_1.it)('True es bool y refl(True) está bien formado', () => {
314
+ (0, vitest_1.expect)((0, hol_1.typeEq)((0, hol_1.typeOf)(hol_1.True), hol_1.TyBool)).toBe(true);
315
+ const th = (0, hol_1.refl)(hol_1.True);
316
+ const eq = (0, hol_1.destEq)(th.concl);
317
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[0], hol_1.True)).toBe(true);
318
+ });
319
+ });
320
+ // =================================================================
321
+ // Smoke / integración
322
+ // =================================================================
323
+ (0, vitest_1.describe)('HOL — smoke: teoremas pequeños derivables del núcleo', () => {
324
+ (0, vitest_1.it)('combinación TRANS + REFL da identidad triple', () => {
325
+ // |- x = x (REFL), |- x = x (REFL), TRANS → |- x = x
326
+ const th1 = (0, hol_1.refl)(x_a);
327
+ const th2 = (0, hol_1.refl)(x_a);
328
+ const th = (0, hol_1.trans)(th1, th2);
329
+ const eq = (0, hol_1.destEq)(th.concl);
330
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[0], x_a)).toBe(true);
331
+ (0, vitest_1.expect)((0, hol_1.alphaEq)(eq[1], x_a)).toBe(true);
332
+ });
333
+ (0, vitest_1.it)('termToString produce salida legible', () => {
334
+ const lam = (0, hol_1.mkAbs)('x', ty_a, (0, hol_1.mkVar)('x', ty_a));
335
+ const out = (0, hol_1.termToString)(lam);
336
+ (0, vitest_1.expect)(out).toContain('λx');
337
+ (0, vitest_1.expect)(out).toContain('x');
338
+ });
339
+ });
340
+ //# sourceMappingURL=hol.test.js.map