@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.
- package/dist/bdd/index.d.ts +4 -0
- package/dist/bdd/index.d.ts.map +1 -0
- package/dist/bdd/index.js +29 -0
- package/dist/bdd/index.js.map +1 -0
- package/dist/bdd/manager.d.ts +122 -0
- package/dist/bdd/manager.d.ts.map +1 -0
- package/dist/bdd/manager.js +524 -0
- package/dist/bdd/manager.js.map +1 -0
- package/dist/bdd/types.d.ts +20 -0
- package/dist/bdd/types.d.ts.map +1 -0
- package/dist/bdd/types.js +28 -0
- package/dist/bdd/types.js.map +1 -0
- package/dist/game-theory/common-games.d.ts +50 -0
- package/dist/game-theory/common-games.d.ts.map +1 -0
- package/dist/game-theory/common-games.js +112 -0
- package/dist/game-theory/common-games.js.map +1 -0
- package/dist/game-theory/dominance.d.ts +26 -0
- package/dist/game-theory/dominance.d.ts.map +1 -0
- package/dist/game-theory/dominance.js +203 -0
- package/dist/game-theory/dominance.js.map +1 -0
- package/dist/game-theory/index.d.ts +8 -0
- package/dist/game-theory/index.d.ts.map +1 -0
- package/dist/game-theory/index.js +47 -0
- package/dist/game-theory/index.js.map +1 -0
- package/dist/game-theory/lemke-howson.d.ts +3 -0
- package/dist/game-theory/lemke-howson.d.ts.map +1 -0
- package/dist/game-theory/lemke-howson.js +269 -0
- package/dist/game-theory/lemke-howson.js.map +1 -0
- package/dist/game-theory/linalg.d.ts +7 -0
- package/dist/game-theory/linalg.d.ts.map +1 -0
- package/dist/game-theory/linalg.js +69 -0
- package/dist/game-theory/linalg.js.map +1 -0
- package/dist/game-theory/pure-nash.d.ts +3 -0
- package/dist/game-theory/pure-nash.d.ts.map +1 -0
- package/dist/game-theory/pure-nash.js +86 -0
- package/dist/game-theory/pure-nash.js.map +1 -0
- package/dist/game-theory/support-enumeration.d.ts +3 -0
- package/dist/game-theory/support-enumeration.d.ts.map +1 -0
- package/dist/game-theory/support-enumeration.js +214 -0
- package/dist/game-theory/support-enumeration.js.map +1 -0
- package/dist/game-theory/types.d.ts +57 -0
- package/dist/game-theory/types.d.ts.map +1 -0
- package/dist/game-theory/types.js +191 -0
- package/dist/game-theory/types.js.map +1 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -1
- package/dist/index.js.map +1 -1
- package/dist/information-theory/index.d.ts +29 -0
- package/dist/information-theory/index.d.ts.map +1 -0
- package/dist/information-theory/index.js +323 -0
- package/dist/information-theory/index.js.map +1 -0
- package/dist/namespaces/logic.d.ts +42 -0
- package/dist/namespaces/logic.d.ts.map +1 -0
- package/dist/namespaces/logic.js +112 -0
- package/dist/namespaces/logic.js.map +1 -0
- package/dist/namespaces/proof-systems.d.ts +18 -0
- package/dist/namespaces/proof-systems.d.ts.map +1 -0
- package/dist/namespaces/proof-systems.js +59 -0
- package/dist/namespaces/proof-systems.js.map +1 -0
- package/dist/namespaces/reasoning.d.ts +26 -0
- package/dist/namespaces/reasoning.d.ts.map +1 -0
- package/dist/namespaces/reasoning.js +72 -0
- package/dist/namespaces/reasoning.js.map +1 -0
- package/dist/namespaces/semantics.d.ts +21 -0
- package/dist/namespaces/semantics.d.ts.map +1 -0
- package/dist/namespaces/semantics.js +64 -0
- package/dist/namespaces/semantics.js.map +1 -0
- package/dist/namespaces/solvers.d.ts +22 -0
- package/dist/namespaces/solvers.d.ts.map +1 -0
- package/dist/namespaces/solvers.js +66 -0
- package/dist/namespaces/solvers.js.map +1 -0
- package/dist/namespaces/type-theory.d.ts +22 -0
- package/dist/namespaces/type-theory.d.ts.map +1 -0
- package/dist/namespaces/type-theory.js +65 -0
- package/dist/namespaces/type-theory.js.map +1 -0
- package/dist/optimization/branch-and-bound.d.ts +11 -0
- package/dist/optimization/branch-and-bound.d.ts.map +1 -0
- package/dist/optimization/branch-and-bound.js +311 -0
- package/dist/optimization/branch-and-bound.js.map +1 -0
- package/dist/optimization/index.d.ts +5 -0
- package/dist/optimization/index.d.ts.map +1 -0
- package/dist/optimization/index.js +20 -0
- package/dist/optimization/index.js.map +1 -0
- package/dist/optimization/simplex.d.ts +8 -0
- package/dist/optimization/simplex.d.ts.map +1 -0
- package/dist/optimization/simplex.js +408 -0
- package/dist/optimization/simplex.js.map +1 -0
- package/dist/optimization/standard-form.d.ts +11 -0
- package/dist/optimization/standard-form.d.ts.map +1 -0
- package/dist/optimization/standard-form.js +112 -0
- package/dist/optimization/standard-form.js.map +1 -0
- package/dist/optimization/types.d.ts +44 -0
- package/dist/optimization/types.d.ts.map +1 -0
- package/dist/optimization/types.js +15 -0
- package/dist/optimization/types.js.map +1 -0
- package/dist/profiles/hol/connectives.d.ts +46 -0
- package/dist/profiles/hol/connectives.d.ts.map +1 -0
- package/dist/profiles/hol/connectives.js +104 -0
- package/dist/profiles/hol/connectives.js.map +1 -0
- package/dist/profiles/hol/index.d.ts +7 -0
- package/dist/profiles/hol/index.d.ts.map +1 -0
- package/dist/profiles/hol/index.js +77 -0
- package/dist/profiles/hol/index.js.map +1 -0
- package/dist/profiles/hol/rules.d.ts +31 -0
- package/dist/profiles/hol/rules.d.ts.map +1 -0
- package/dist/profiles/hol/rules.js +258 -0
- package/dist/profiles/hol/rules.js.map +1 -0
- package/dist/profiles/hol/term.d.ts +52 -0
- package/dist/profiles/hol/term.d.ts.map +1 -0
- package/dist/profiles/hol/term.js +345 -0
- package/dist/profiles/hol/term.js.map +1 -0
- package/dist/profiles/hol/type-system.d.ts +38 -0
- package/dist/profiles/hol/type-system.d.ts.map +1 -0
- package/dist/profiles/hol/type-system.js +133 -0
- package/dist/profiles/hol/type-system.js.map +1 -0
- package/dist/profiles/hol/types.d.ts +59 -0
- package/dist/profiles/hol/types.d.ts.map +1 -0
- package/dist/profiles/hol/types.js +26 -0
- package/dist/profiles/hol/types.js.map +1 -0
- package/dist/smt-lib/ast.d.ts +138 -0
- package/dist/smt-lib/ast.d.ts.map +1 -0
- package/dist/smt-lib/ast.js +73 -0
- package/dist/smt-lib/ast.js.map +1 -0
- package/dist/smt-lib/emitter.d.ts +12 -0
- package/dist/smt-lib/emitter.d.ts.map +1 -0
- package/dist/smt-lib/emitter.js +174 -0
- package/dist/smt-lib/emitter.js.map +1 -0
- package/dist/smt-lib/index.d.ts +6 -0
- package/dist/smt-lib/index.d.ts.map +1 -0
- package/dist/smt-lib/index.js +31 -0
- package/dist/smt-lib/index.js.map +1 -0
- package/dist/smt-lib/parser.d.ts +13 -0
- package/dist/smt-lib/parser.d.ts.map +1 -0
- package/dist/smt-lib/parser.js +614 -0
- package/dist/smt-lib/parser.js.map +1 -0
- package/dist/smt-lib/tokenizer.d.ts +16 -0
- package/dist/smt-lib/tokenizer.d.ts.map +1 -0
- package/dist/smt-lib/tokenizer.js +234 -0
- package/dist/smt-lib/tokenizer.js.map +1 -0
- package/dist/tests/api/namespaces.test.d.ts +9 -0
- package/dist/tests/api/namespaces.test.d.ts.map +1 -0
- package/dist/tests/api/namespaces.test.js +218 -0
- package/dist/tests/api/namespaces.test.js.map +1 -0
- package/dist/tests/bdd/manager.test.d.ts +2 -0
- package/dist/tests/bdd/manager.test.d.ts.map +1 -0
- package/dist/tests/bdd/manager.test.js +472 -0
- package/dist/tests/bdd/manager.test.js.map +1 -0
- package/dist/tests/game-theory/game-theory.test.d.ts +2 -0
- package/dist/tests/game-theory/game-theory.test.d.ts.map +1 -0
- package/dist/tests/game-theory/game-theory.test.js +252 -0
- package/dist/tests/game-theory/game-theory.test.js.map +1 -0
- package/dist/tests/hol/hol.test.d.ts +2 -0
- package/dist/tests/hol/hol.test.d.ts.map +1 -0
- package/dist/tests/hol/hol.test.js +340 -0
- package/dist/tests/hol/hol.test.js.map +1 -0
- package/dist/tests/information-theory/information-theory.test.d.ts +2 -0
- package/dist/tests/information-theory/information-theory.test.d.ts.map +1 -0
- package/dist/tests/information-theory/information-theory.test.js +291 -0
- package/dist/tests/information-theory/information-theory.test.js.map +1 -0
- package/dist/tests/optimization/ilp.test.d.ts +2 -0
- package/dist/tests/optimization/ilp.test.d.ts.map +1 -0
- package/dist/tests/optimization/ilp.test.js +204 -0
- package/dist/tests/optimization/ilp.test.js.map +1 -0
- package/dist/tests/optimization/lp.test.d.ts +2 -0
- package/dist/tests/optimization/lp.test.d.ts.map +1 -0
- package/dist/tests/optimization/lp.test.js +224 -0
- package/dist/tests/optimization/lp.test.js.map +1 -0
- package/dist/tests/properties/agm.property.test.d.ts +2 -0
- package/dist/tests/properties/agm.property.test.d.ts.map +1 -0
- package/dist/tests/properties/agm.property.test.js +75 -0
- package/dist/tests/properties/agm.property.test.js.map +1 -0
- package/dist/tests/properties/anti-unification.property.test.d.ts +2 -0
- package/dist/tests/properties/anti-unification.property.test.d.ts.map +1 -0
- package/dist/tests/properties/anti-unification.property.test.js +43 -0
- package/dist/tests/properties/anti-unification.property.test.js.map +1 -0
- package/dist/tests/properties/argumentation.property.test.d.ts +2 -0
- package/dist/tests/properties/argumentation.property.test.d.ts.map +1 -0
- package/dist/tests/properties/argumentation.property.test.js +51 -0
- package/dist/tests/properties/argumentation.property.test.js.map +1 -0
- package/dist/tests/properties/bayesian.property.test.d.ts +2 -0
- package/dist/tests/properties/bayesian.property.test.d.ts.map +1 -0
- package/dist/tests/properties/bayesian.property.test.js +32 -0
- package/dist/tests/properties/bayesian.property.test.js.map +1 -0
- package/dist/tests/properties/bisimulation.property.test.d.ts +2 -0
- package/dist/tests/properties/bisimulation.property.test.d.ts.map +1 -0
- package/dist/tests/properties/bisimulation.property.test.js +50 -0
- package/dist/tests/properties/bisimulation.property.test.js.map +1 -0
- package/dist/tests/properties/cdcl.property.test.d.ts +2 -0
- package/dist/tests/properties/cdcl.property.test.d.ts.map +1 -0
- package/dist/tests/properties/cdcl.property.test.js +70 -0
- package/dist/tests/properties/cdcl.property.test.js.map +1 -0
- package/dist/tests/properties/coinduction.property.test.d.ts +2 -0
- package/dist/tests/properties/coinduction.property.test.d.ts.map +1 -0
- package/dist/tests/properties/coinduction.property.test.js +34 -0
- package/dist/tests/properties/coinduction.property.test.js.map +1 -0
- package/dist/tests/properties/constructive-reals.property.test.d.ts +2 -0
- package/dist/tests/properties/constructive-reals.property.test.d.ts.map +1 -0
- package/dist/tests/properties/constructive-reals.property.test.js +59 -0
- package/dist/tests/properties/constructive-reals.property.test.js.map +1 -0
- package/dist/tests/properties/csp.property.test.d.ts +2 -0
- package/dist/tests/properties/csp.property.test.d.ts.map +1 -0
- package/dist/tests/properties/csp.property.test.js +58 -0
- package/dist/tests/properties/csp.property.test.js.map +1 -0
- package/dist/tests/properties/generators.d.ts +78 -0
- package/dist/tests/properties/generators.d.ts.map +1 -0
- package/dist/tests/properties/generators.js +348 -0
- package/dist/tests/properties/generators.js.map +1 -0
- package/dist/tests/properties/ho-unify.property.test.d.ts +2 -0
- package/dist/tests/properties/ho-unify.property.test.d.ts.map +1 -0
- package/dist/tests/properties/ho-unify.property.test.js +46 -0
- package/dist/tests/properties/ho-unify.property.test.js.map +1 -0
- package/dist/tests/properties/hyperreal.property.test.d.ts +2 -0
- package/dist/tests/properties/hyperreal.property.test.d.ts.map +1 -0
- package/dist/tests/properties/hyperreal.property.test.js +33 -0
- package/dist/tests/properties/hyperreal.property.test.js.map +1 -0
- package/dist/tests/properties/intuit-nj.property.test.d.ts +2 -0
- package/dist/tests/properties/intuit-nj.property.test.d.ts.map +1 -0
- package/dist/tests/properties/intuit-nj.property.test.js +57 -0
- package/dist/tests/properties/intuit-nj.property.test.js.map +1 -0
- package/dist/tests/properties/lambda-calc.property.test.d.ts +2 -0
- package/dist/tests/properties/lambda-calc.property.test.d.ts.map +1 -0
- package/dist/tests/properties/lambda-calc.property.test.js +35 -0
- package/dist/tests/properties/lambda-calc.property.test.js.map +1 -0
- package/dist/tests/properties/mln.property.test.d.ts +2 -0
- package/dist/tests/properties/mln.property.test.d.ts.map +1 -0
- package/dist/tests/properties/mln.property.test.js +41 -0
- package/dist/tests/properties/mln.property.test.js.map +1 -0
- package/dist/tests/properties/mltt.property.test.d.ts +2 -0
- package/dist/tests/properties/mltt.property.test.d.ts.map +1 -0
- package/dist/tests/properties/mltt.property.test.js +33 -0
- package/dist/tests/properties/mltt.property.test.js.map +1 -0
- package/dist/tests/properties/nbe.property.test.d.ts +2 -0
- package/dist/tests/properties/nbe.property.test.d.ts.map +1 -0
- package/dist/tests/properties/nbe.property.test.js +44 -0
- package/dist/tests/properties/nbe.property.test.js.map +1 -0
- package/dist/tests/properties/planning.property.test.d.ts +2 -0
- package/dist/tests/properties/planning.property.test.d.ts.map +1 -0
- package/dist/tests/properties/planning.property.test.js +51 -0
- package/dist/tests/properties/planning.property.test.js.map +1 -0
- package/dist/tests/properties/profile-bridge.property.test.d.ts +2 -0
- package/dist/tests/properties/profile-bridge.property.test.d.ts.map +1 -0
- package/dist/tests/properties/profile-bridge.property.test.js +71 -0
- package/dist/tests/properties/profile-bridge.property.test.js.map +1 -0
- package/dist/tests/properties/refinement-types.property.test.d.ts +2 -0
- package/dist/tests/properties/refinement-types.property.test.d.ts.map +1 -0
- package/dist/tests/properties/refinement-types.property.test.js +37 -0
- package/dist/tests/properties/refinement-types.property.test.js.map +1 -0
- package/dist/tests/properties/sequent-g3.property.test.d.ts +2 -0
- package/dist/tests/properties/sequent-g3.property.test.d.ts.map +1 -0
- package/dist/tests/properties/sequent-g3.property.test.js +34 -0
- package/dist/tests/properties/sequent-g3.property.test.js.map +1 -0
- package/dist/tests/properties/symbolic-diff.property.test.d.ts +2 -0
- package/dist/tests/properties/symbolic-diff.property.test.d.ts.map +1 -0
- package/dist/tests/properties/symbolic-diff.property.test.js +49 -0
- package/dist/tests/properties/symbolic-diff.property.test.js.map +1 -0
- package/dist/tests/properties/system-f.property.test.d.ts +2 -0
- package/dist/tests/properties/system-f.property.test.d.ts.map +1 -0
- package/dist/tests/properties/system-f.property.test.js +37 -0
- package/dist/tests/properties/system-f.property.test.js.map +1 -0
- package/dist/tests/properties/theorem-cache.property.test.d.ts +2 -0
- package/dist/tests/properties/theorem-cache.property.test.d.ts.map +1 -0
- package/dist/tests/properties/theorem-cache.property.test.js +38 -0
- package/dist/tests/properties/theorem-cache.property.test.js.map +1 -0
- package/dist/tests/properties/trs.property.test.d.ts +2 -0
- package/dist/tests/properties/trs.property.test.d.ts.map +1 -0
- package/dist/tests/properties/trs.property.test.js +34 -0
- package/dist/tests/properties/trs.property.test.js.map +1 -0
- package/dist/tests/properties/unification.property.test.d.ts +2 -0
- package/dist/tests/properties/unification.property.test.d.ts.map +1 -0
- package/dist/tests/properties/unification.property.test.js +42 -0
- package/dist/tests/properties/unification.property.test.js.map +1 -0
- package/dist/tests/smt-lib/emitter.test.d.ts +2 -0
- package/dist/tests/smt-lib/emitter.test.d.ts.map +1 -0
- package/dist/tests/smt-lib/emitter.test.js +155 -0
- package/dist/tests/smt-lib/emitter.test.js.map +1 -0
- package/dist/tests/smt-lib/parser.test.d.ts +2 -0
- package/dist/tests/smt-lib/parser.test.d.ts.map +1 -0
- package/dist/tests/smt-lib/parser.test.js +164 -0
- package/dist/tests/smt-lib/parser.test.js.map +1 -0
- package/dist/tests/smt-lib/tokenizer.test.d.ts +2 -0
- package/dist/tests/smt-lib/tokenizer.test.d.ts.map +1 -0
- package/dist/tests/smt-lib/tokenizer.test.js +59 -0
- package/dist/tests/smt-lib/tokenizer.test.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// HOL — Operaciones sobre términos
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Type inference, α-equivalencia, sustitución capture-free,
|
|
7
|
+
// detección de variables libres, etc.
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.mkAbs = exports.mkComb = exports.mkConst = exports.mkVar = void 0;
|
|
10
|
+
exports.typeOf = typeOf;
|
|
11
|
+
exports.alphaEq = alphaEq;
|
|
12
|
+
exports.freeVars = freeVars;
|
|
13
|
+
exports.occursFree = occursFree;
|
|
14
|
+
exports.freshName = freshName;
|
|
15
|
+
exports.substTerm = substTerm;
|
|
16
|
+
exports.instTypeInTerm = instTypeInTerm;
|
|
17
|
+
exports.termToString = termToString;
|
|
18
|
+
exports.eqConst = eqConst;
|
|
19
|
+
exports.mkEq = mkEq;
|
|
20
|
+
exports.destEq = destEq;
|
|
21
|
+
exports.isEq = isEq;
|
|
22
|
+
exports.isIff = isIff;
|
|
23
|
+
const type_system_1 = require("./type-system");
|
|
24
|
+
// Constructores ergonómicos ------------------------------------
|
|
25
|
+
const mkVar = (name, type) => ({ kind: 'var', name, type });
|
|
26
|
+
exports.mkVar = mkVar;
|
|
27
|
+
const mkConst = (name, type) => ({ kind: 'const', name, type });
|
|
28
|
+
exports.mkConst = mkConst;
|
|
29
|
+
const mkComb = (fn, arg) => {
|
|
30
|
+
// Bien-formado: el tipo de `fn` debe ser `T(arg) → ?` y los
|
|
31
|
+
// dominios deben coincidir.
|
|
32
|
+
const fnType = typeOf(fn);
|
|
33
|
+
const argType = typeOf(arg);
|
|
34
|
+
if (!(0, type_system_1.isFunType)(fnType)) {
|
|
35
|
+
throw new Error(`mkComb: el lado izquierdo no es función: ${termToString(fn)} : ${(0, type_system_1.typeToString)(fnType)}`);
|
|
36
|
+
}
|
|
37
|
+
if (!(0, type_system_1.typeEq)((0, type_system_1.funDomain)(fnType), argType)) {
|
|
38
|
+
throw new Error(`mkComb: tipos incompatibles. esperaba ${(0, type_system_1.typeToString)((0, type_system_1.funDomain)(fnType))}, ` +
|
|
39
|
+
`recibido ${(0, type_system_1.typeToString)(argType)}`);
|
|
40
|
+
}
|
|
41
|
+
return { kind: 'comb', fn, arg };
|
|
42
|
+
};
|
|
43
|
+
exports.mkComb = mkComb;
|
|
44
|
+
const mkAbs = (param, paramType, body) => ({
|
|
45
|
+
kind: 'abs',
|
|
46
|
+
param,
|
|
47
|
+
paramType,
|
|
48
|
+
body,
|
|
49
|
+
});
|
|
50
|
+
exports.mkAbs = mkAbs;
|
|
51
|
+
// Type inference -----------------------------------------------
|
|
52
|
+
/**
|
|
53
|
+
* Calcula el tipo de un término bien formado. Lanza si el
|
|
54
|
+
* término está mal tipado (combinación con dominios disjuntos).
|
|
55
|
+
*/
|
|
56
|
+
function typeOf(t) {
|
|
57
|
+
switch (t.kind) {
|
|
58
|
+
case 'var':
|
|
59
|
+
case 'const':
|
|
60
|
+
return t.type;
|
|
61
|
+
case 'abs':
|
|
62
|
+
return (0, type_system_1.funTy)(t.paramType, typeOf(t.body));
|
|
63
|
+
case 'comb': {
|
|
64
|
+
const fnType = typeOf(t.fn);
|
|
65
|
+
const argType = typeOf(t.arg);
|
|
66
|
+
if (!(0, type_system_1.isFunType)(fnType)) {
|
|
67
|
+
throw new Error(`typeOf: aplicación sobre no-función: ${termToString(t.fn)} : ${(0, type_system_1.typeToString)(fnType)}`);
|
|
68
|
+
}
|
|
69
|
+
if (!(0, type_system_1.typeEq)((0, type_system_1.funDomain)(fnType), argType)) {
|
|
70
|
+
throw new Error(`typeOf: tipos incompatibles en aplicación: ` +
|
|
71
|
+
`${(0, type_system_1.typeToString)((0, type_system_1.funDomain)(fnType))} vs ${(0, type_system_1.typeToString)(argType)}`);
|
|
72
|
+
}
|
|
73
|
+
return (0, type_system_1.funCodomain)(fnType);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// α-equivalencia ----------------------------------------------
|
|
78
|
+
/**
|
|
79
|
+
* Igualdad estructural módulo α-renaming. Implementación con
|
|
80
|
+
* dos mapas de profundidad (de Bruijn implícito sobre nombres).
|
|
81
|
+
*/
|
|
82
|
+
function alphaEq(a, b) {
|
|
83
|
+
return alphaEqAux(a, b, new Map(), new Map(), 0);
|
|
84
|
+
}
|
|
85
|
+
function alphaEqAux(a, b, envA, envB, depth) {
|
|
86
|
+
if (a.kind !== b.kind)
|
|
87
|
+
return false;
|
|
88
|
+
switch (a.kind) {
|
|
89
|
+
case 'var': {
|
|
90
|
+
const bb = b;
|
|
91
|
+
// Misma variable: o ambas ligadas a la misma profundidad,
|
|
92
|
+
// o ambas libres con mismo nombre y mismo tipo.
|
|
93
|
+
const da = envA.get(a.name);
|
|
94
|
+
const db = envB.get(bb.name);
|
|
95
|
+
if (da !== undefined && db !== undefined) {
|
|
96
|
+
return da === db && (0, type_system_1.typeEq)(a.type, bb.type);
|
|
97
|
+
}
|
|
98
|
+
if (da === undefined && db === undefined) {
|
|
99
|
+
return a.name === bb.name && (0, type_system_1.typeEq)(a.type, bb.type);
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
case 'const': {
|
|
104
|
+
const bb = b;
|
|
105
|
+
return a.name === bb.name && (0, type_system_1.typeEq)(a.type, bb.type);
|
|
106
|
+
}
|
|
107
|
+
case 'comb': {
|
|
108
|
+
const bb = b;
|
|
109
|
+
return (alphaEqAux(a.fn, bb.fn, envA, envB, depth) && alphaEqAux(a.arg, bb.arg, envA, envB, depth));
|
|
110
|
+
}
|
|
111
|
+
case 'abs': {
|
|
112
|
+
const bb = b;
|
|
113
|
+
if (!(0, type_system_1.typeEq)(a.paramType, bb.paramType))
|
|
114
|
+
return false;
|
|
115
|
+
// Sombreamos en ambos environments con la misma profundidad
|
|
116
|
+
// para que las ocurrencias del binder coincidan.
|
|
117
|
+
const nextA = new Map(envA);
|
|
118
|
+
const nextB = new Map(envB);
|
|
119
|
+
nextA.set(a.param, depth);
|
|
120
|
+
nextB.set(bb.param, depth);
|
|
121
|
+
return alphaEqAux(a.body, bb.body, nextA, nextB, depth + 1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Devuelve las variables libres de `t` con su tipo. Una variable
|
|
127
|
+
* con mismo nombre pero distinto tipo aparece dos veces.
|
|
128
|
+
*/
|
|
129
|
+
function freeVars(t, out = []) {
|
|
130
|
+
const seen = new Set();
|
|
131
|
+
const collect = (term, bound) => {
|
|
132
|
+
switch (term.kind) {
|
|
133
|
+
case 'var': {
|
|
134
|
+
const boundType = bound.get(term.name);
|
|
135
|
+
if (boundType !== undefined && (0, type_system_1.typeEq)(boundType, term.type))
|
|
136
|
+
return;
|
|
137
|
+
const key = `${term.name}::${(0, type_system_1.typeToString)(term.type)}`;
|
|
138
|
+
if (seen.has(key))
|
|
139
|
+
return;
|
|
140
|
+
seen.add(key);
|
|
141
|
+
out.push({ name: term.name, type: term.type });
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
case 'const':
|
|
145
|
+
return;
|
|
146
|
+
case 'comb':
|
|
147
|
+
collect(term.fn, bound);
|
|
148
|
+
collect(term.arg, bound);
|
|
149
|
+
return;
|
|
150
|
+
case 'abs': {
|
|
151
|
+
const next = new Map(bound);
|
|
152
|
+
next.set(term.param, term.paramType);
|
|
153
|
+
collect(term.body, next);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
collect(t, new Map());
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Devuelve true si `name` aparece libre en `term` con tipo `ty`.
|
|
163
|
+
*/
|
|
164
|
+
function occursFree(name, ty, term) {
|
|
165
|
+
return freeVars(term).some((v) => v.name === name && (0, type_system_1.typeEq)(v.type, ty));
|
|
166
|
+
}
|
|
167
|
+
/** Genera un nombre fresco respecto a un conjunto de nombres prohibidos. */
|
|
168
|
+
function freshName(base, forbidden) {
|
|
169
|
+
if (!forbidden.has(base))
|
|
170
|
+
return base;
|
|
171
|
+
let i = 0;
|
|
172
|
+
while (forbidden.has(`${base}'${i}`))
|
|
173
|
+
i++;
|
|
174
|
+
return `${base}'${i}`;
|
|
175
|
+
}
|
|
176
|
+
// Sustitución capture-free -----------------------------------
|
|
177
|
+
/**
|
|
178
|
+
* Sustituye [v := value] en `term`. Renombra binders si haría
|
|
179
|
+
* falta para evitar captura. `v` se identifica por nombre + tipo.
|
|
180
|
+
*/
|
|
181
|
+
function substTerm(name, ty, value, term) {
|
|
182
|
+
if (!(0, type_system_1.typeEq)(typeOf(value), ty)) {
|
|
183
|
+
throw new Error(`substTerm: el valor tiene tipo ${(0, type_system_1.typeToString)(typeOf(value))}, esperaba ${(0, type_system_1.typeToString)(ty)}`);
|
|
184
|
+
}
|
|
185
|
+
return substTermAux(name, ty, value, term, collectAllVarNames(value));
|
|
186
|
+
}
|
|
187
|
+
function substTermAux(name, ty, value, term, valueVars) {
|
|
188
|
+
switch (term.kind) {
|
|
189
|
+
case 'var':
|
|
190
|
+
if (term.name === name && (0, type_system_1.typeEq)(term.type, ty))
|
|
191
|
+
return value;
|
|
192
|
+
return term;
|
|
193
|
+
case 'const':
|
|
194
|
+
return term;
|
|
195
|
+
case 'comb':
|
|
196
|
+
return {
|
|
197
|
+
kind: 'comb',
|
|
198
|
+
fn: substTermAux(name, ty, value, term.fn, valueVars),
|
|
199
|
+
arg: substTermAux(name, ty, value, term.arg, valueVars),
|
|
200
|
+
};
|
|
201
|
+
case 'abs': {
|
|
202
|
+
// Si el binder shadowsa exactamente la variable objetivo,
|
|
203
|
+
// la sustitución es identidad dentro del body.
|
|
204
|
+
if (term.param === name && (0, type_system_1.typeEq)(term.paramType, ty))
|
|
205
|
+
return term;
|
|
206
|
+
// Captura: el binder coincide con una variable libre de `value`.
|
|
207
|
+
if (valueVars.has(term.param) && occursFree(name, ty, term.body)) {
|
|
208
|
+
const forbidden = new Set([...valueVars, ...collectAllVarNames(term.body), name]);
|
|
209
|
+
const fresh = freshName(term.param, forbidden);
|
|
210
|
+
const renamedBody = renameBoundVar(term.param, term.paramType, fresh, term.body);
|
|
211
|
+
return {
|
|
212
|
+
kind: 'abs',
|
|
213
|
+
param: fresh,
|
|
214
|
+
paramType: term.paramType,
|
|
215
|
+
body: substTermAux(name, ty, value, renamedBody, valueVars),
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
kind: 'abs',
|
|
220
|
+
param: term.param,
|
|
221
|
+
paramType: term.paramType,
|
|
222
|
+
body: substTermAux(name, ty, value, term.body, valueVars),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/** Renombra ocurrencias libres de `(from : ty)` por `to` en `term`. */
|
|
228
|
+
function renameBoundVar(from, ty, to, term) {
|
|
229
|
+
switch (term.kind) {
|
|
230
|
+
case 'var':
|
|
231
|
+
if (term.name === from && (0, type_system_1.typeEq)(term.type, ty)) {
|
|
232
|
+
return { kind: 'var', name: to, type: term.type };
|
|
233
|
+
}
|
|
234
|
+
return term;
|
|
235
|
+
case 'const':
|
|
236
|
+
return term;
|
|
237
|
+
case 'comb':
|
|
238
|
+
return {
|
|
239
|
+
kind: 'comb',
|
|
240
|
+
fn: renameBoundVar(from, ty, to, term.fn),
|
|
241
|
+
arg: renameBoundVar(from, ty, to, term.arg),
|
|
242
|
+
};
|
|
243
|
+
case 'abs': {
|
|
244
|
+
if (term.param === from && (0, type_system_1.typeEq)(term.paramType, ty))
|
|
245
|
+
return term;
|
|
246
|
+
return {
|
|
247
|
+
kind: 'abs',
|
|
248
|
+
param: term.param,
|
|
249
|
+
paramType: term.paramType,
|
|
250
|
+
body: renameBoundVar(from, ty, to, term.body),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function collectAllVarNames(term, out = new Set()) {
|
|
256
|
+
switch (term.kind) {
|
|
257
|
+
case 'var':
|
|
258
|
+
out.add(term.name);
|
|
259
|
+
return out;
|
|
260
|
+
case 'const':
|
|
261
|
+
return out;
|
|
262
|
+
case 'comb':
|
|
263
|
+
collectAllVarNames(term.fn, out);
|
|
264
|
+
return collectAllVarNames(term.arg, out);
|
|
265
|
+
case 'abs':
|
|
266
|
+
out.add(term.param);
|
|
267
|
+
return collectAllVarNames(term.body, out);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// Sustitución de variables de tipo en términos ----------------
|
|
271
|
+
function instTypeInTerm(subst, term) {
|
|
272
|
+
switch (term.kind) {
|
|
273
|
+
case 'var':
|
|
274
|
+
return { kind: 'var', name: term.name, type: (0, type_system_1.substType)(subst, term.type) };
|
|
275
|
+
case 'const':
|
|
276
|
+
return { kind: 'const', name: term.name, type: (0, type_system_1.substType)(subst, term.type) };
|
|
277
|
+
case 'comb':
|
|
278
|
+
return {
|
|
279
|
+
kind: 'comb',
|
|
280
|
+
fn: instTypeInTerm(subst, term.fn),
|
|
281
|
+
arg: instTypeInTerm(subst, term.arg),
|
|
282
|
+
};
|
|
283
|
+
case 'abs':
|
|
284
|
+
return {
|
|
285
|
+
kind: 'abs',
|
|
286
|
+
param: term.param,
|
|
287
|
+
paramType: (0, type_system_1.substType)(subst, term.paramType),
|
|
288
|
+
body: instTypeInTerm(subst, term.body),
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Pretty-printing --------------------------------------------
|
|
293
|
+
function termToString(t) {
|
|
294
|
+
switch (t.kind) {
|
|
295
|
+
case 'var':
|
|
296
|
+
return t.name;
|
|
297
|
+
case 'const':
|
|
298
|
+
return t.name;
|
|
299
|
+
case 'comb':
|
|
300
|
+
return `(${termToString(t.fn)} ${termToString(t.arg)})`;
|
|
301
|
+
case 'abs':
|
|
302
|
+
return `(λ${t.param}:${(0, type_system_1.typeToString)(t.paramType)}. ${termToString(t.body)})`;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// Igualdad como aplicación primitiva --------------------------
|
|
306
|
+
/**
|
|
307
|
+
* Constructor de igualdad polimórfica `= : α → α → bool`.
|
|
308
|
+
* Devuelve la `const` `=` instanciada al tipo del término.
|
|
309
|
+
*/
|
|
310
|
+
function eqConst(ty) {
|
|
311
|
+
return (0, exports.mkConst)('=', (0, type_system_1.funTy)(ty, (0, type_system_1.funTy)(ty, type_system_1.TyBool)));
|
|
312
|
+
}
|
|
313
|
+
/** Construye el término `l = r` (chequea que sus tipos coincidan). */
|
|
314
|
+
function mkEq(l, r) {
|
|
315
|
+
const ty = typeOf(l);
|
|
316
|
+
if (!(0, type_system_1.typeEq)(ty, typeOf(r))) {
|
|
317
|
+
throw new Error(`mkEq: tipos diferentes — ${(0, type_system_1.typeToString)(ty)} vs ${(0, type_system_1.typeToString)(typeOf(r))}`);
|
|
318
|
+
}
|
|
319
|
+
return (0, exports.mkComb)((0, exports.mkComb)(eqConst(ty), l), r);
|
|
320
|
+
}
|
|
321
|
+
/** Descompone `l = r` en `[l, r]` o null si no es igualdad. */
|
|
322
|
+
function destEq(t) {
|
|
323
|
+
// Forma: ((= ty) l) r
|
|
324
|
+
if (t.kind !== 'comb')
|
|
325
|
+
return null;
|
|
326
|
+
if (t.fn.kind !== 'comb')
|
|
327
|
+
return null;
|
|
328
|
+
const head = t.fn.fn;
|
|
329
|
+
if (head.kind !== 'const' || head.name !== '=')
|
|
330
|
+
return null;
|
|
331
|
+
return [t.fn.arg, t.arg];
|
|
332
|
+
}
|
|
333
|
+
/** True si `t` es una igualdad de la forma `l = r`. */
|
|
334
|
+
function isEq(t) {
|
|
335
|
+
return destEq(t) !== null;
|
|
336
|
+
}
|
|
337
|
+
/** True si `t` es una bi-implicación bool ↔ bool (sintácticamente `=` sobre bool). */
|
|
338
|
+
function isIff(t) {
|
|
339
|
+
const parts = destEq(t);
|
|
340
|
+
if (parts === null)
|
|
341
|
+
return false;
|
|
342
|
+
// El término-igualdad tiene tipo bool si los lados son bool.
|
|
343
|
+
return (0, type_system_1.typeEq)(typeOf(parts[0]), type_system_1.TyBool);
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=term.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"term.js","sourceRoot":"","sources":["../../../src/profiles/hol/term.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { HOLType } from './types';
|
|
2
|
+
/** Construye una variable de tipo `α`, `β`, etc. */
|
|
3
|
+
export declare const tvar: (name: string) => HOLType;
|
|
4
|
+
/** Constante de tipo: `bool`, `ind`, ... */
|
|
5
|
+
export declare const tconst: (name: string) => HOLType;
|
|
6
|
+
/** Aplicación de constructor de tipo (e.g. `fun`, `prod`). */
|
|
7
|
+
export declare const tapp: (fn: string, args: HOLType[]) => HOLType;
|
|
8
|
+
export declare const TyBool: HOLType;
|
|
9
|
+
export declare const TyInd: HOLType;
|
|
10
|
+
/** `A → B` */
|
|
11
|
+
export declare const funTy: (from: HOLType, to: HOLType) => HOLType;
|
|
12
|
+
/** Empareja `A → B → ...` de derecha a izquierda. */
|
|
13
|
+
export declare const funTyN: (...types: HOLType[]) => HOLType;
|
|
14
|
+
/**
|
|
15
|
+
* Igualdad estructural de tipos. Las variables de tipo se
|
|
16
|
+
* comparan por nombre (no hay α-renaming sobre tipos en HOL).
|
|
17
|
+
*/
|
|
18
|
+
export declare function typeEq(a: HOLType, b: HOLType): boolean;
|
|
19
|
+
/** Devuelve true si `t` es una flecha `A → B`. */
|
|
20
|
+
export declare function isFunType(t: HOLType): t is {
|
|
21
|
+
kind: 'tapp';
|
|
22
|
+
fn: 'fun';
|
|
23
|
+
args: HOLType[];
|
|
24
|
+
};
|
|
25
|
+
/** Dominio de una flecha. Lanza si el tipo no es flecha. */
|
|
26
|
+
export declare function funDomain(t: HOLType): HOLType;
|
|
27
|
+
/** Codominio de una flecha. Lanza si el tipo no es flecha. */
|
|
28
|
+
export declare function funCodomain(t: HOLType): HOLType;
|
|
29
|
+
/** Pretty-printer; útil para mensajes de error y tests. */
|
|
30
|
+
export declare function typeToString(t: HOLType): string;
|
|
31
|
+
/**
|
|
32
|
+
* Sustitución sobre variables de tipo. Aplica `subst` a `t`
|
|
33
|
+
* de manera capture-free (los tipos no tienen binders).
|
|
34
|
+
*/
|
|
35
|
+
export declare function substType(subst: Record<string, HOLType>, t: HOLType): HOLType;
|
|
36
|
+
/** Recolecta los nombres de las variables de tipo libres en `t`. */
|
|
37
|
+
export declare function freeTypeVars(t: HOLType, out?: Set<string>): Set<string>;
|
|
38
|
+
//# sourceMappingURL=type-system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-system.d.ts","sourceRoot":"","sources":["../../../src/profiles/hol/type-system.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,oDAAoD;AACpD,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,KAAG,OAAmC,CAAC;AAExE,4CAA4C;AAC5C,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,KAAG,OAAqC,CAAC;AAE5E,8DAA8D;AAC9D,eAAO,MAAM,IAAI,GAAI,IAAI,MAAM,EAAE,MAAM,OAAO,EAAE,KAAG,OAAuC,CAAC;AAI3F,eAAO,MAAM,MAAM,EAAE,OAAwB,CAAC;AAC9C,eAAO,MAAM,KAAK,EAAE,OAAuB,CAAC;AAE5C,cAAc;AACd,eAAO,MAAM,KAAK,GAAI,MAAM,OAAO,EAAE,IAAI,OAAO,KAAG,OAAkC,CAAC;AAEtF,qDAAqD;AACrD,eAAO,MAAM,MAAM,GAAI,GAAG,OAAO,OAAO,EAAE,KAAG,OAY5C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAiBtD;AAED,kDAAkD;AAClD,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,CAEvF;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAK7C;AAED,8DAA8D;AAC9D,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAK/C;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAY/C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAY7E;AAED,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAWlF"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// HOL — Sistema de tipos
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Tipos simples polimórficos: variables de tipo, constantes y
|
|
7
|
+
// aplicaciones. La función `fun(A, B)` representa el flecha.
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.funTyN = exports.funTy = exports.TyInd = exports.TyBool = exports.tapp = exports.tconst = exports.tvar = void 0;
|
|
10
|
+
exports.typeEq = typeEq;
|
|
11
|
+
exports.isFunType = isFunType;
|
|
12
|
+
exports.funDomain = funDomain;
|
|
13
|
+
exports.funCodomain = funCodomain;
|
|
14
|
+
exports.typeToString = typeToString;
|
|
15
|
+
exports.substType = substType;
|
|
16
|
+
exports.freeTypeVars = freeTypeVars;
|
|
17
|
+
/** Construye una variable de tipo `α`, `β`, etc. */
|
|
18
|
+
const tvar = (name) => ({ kind: 'tvar', name });
|
|
19
|
+
exports.tvar = tvar;
|
|
20
|
+
/** Constante de tipo: `bool`, `ind`, ... */
|
|
21
|
+
const tconst = (name) => ({ kind: 'tconst', name });
|
|
22
|
+
exports.tconst = tconst;
|
|
23
|
+
/** Aplicación de constructor de tipo (e.g. `fun`, `prod`). */
|
|
24
|
+
const tapp = (fn, args) => ({ kind: 'tapp', fn, args });
|
|
25
|
+
exports.tapp = tapp;
|
|
26
|
+
// Constantes predefinidas ------------------------------------
|
|
27
|
+
exports.TyBool = (0, exports.tconst)('bool');
|
|
28
|
+
exports.TyInd = (0, exports.tconst)('ind');
|
|
29
|
+
/** `A → B` */
|
|
30
|
+
const funTy = (from, to) => (0, exports.tapp)('fun', [from, to]);
|
|
31
|
+
exports.funTy = funTy;
|
|
32
|
+
/** Empareja `A → B → ...` de derecha a izquierda. */
|
|
33
|
+
const funTyN = (...types) => {
|
|
34
|
+
if (types.length === 0) {
|
|
35
|
+
throw new Error('funTyN: necesita al menos un tipo');
|
|
36
|
+
}
|
|
37
|
+
if (types.length === 1) {
|
|
38
|
+
return types[0];
|
|
39
|
+
}
|
|
40
|
+
let acc = types[types.length - 1];
|
|
41
|
+
for (let i = types.length - 2; i >= 0; i--) {
|
|
42
|
+
acc = (0, exports.funTy)(types[i], acc);
|
|
43
|
+
}
|
|
44
|
+
return acc;
|
|
45
|
+
};
|
|
46
|
+
exports.funTyN = funTyN;
|
|
47
|
+
/**
|
|
48
|
+
* Igualdad estructural de tipos. Las variables de tipo se
|
|
49
|
+
* comparan por nombre (no hay α-renaming sobre tipos en HOL).
|
|
50
|
+
*/
|
|
51
|
+
function typeEq(a, b) {
|
|
52
|
+
if (a.kind !== b.kind)
|
|
53
|
+
return false;
|
|
54
|
+
switch (a.kind) {
|
|
55
|
+
case 'tvar':
|
|
56
|
+
return a.name === b.name;
|
|
57
|
+
case 'tconst':
|
|
58
|
+
return a.name === b.name;
|
|
59
|
+
case 'tapp': {
|
|
60
|
+
const bb = b;
|
|
61
|
+
if (a.fn !== bb.fn)
|
|
62
|
+
return false;
|
|
63
|
+
if (a.args.length !== bb.args.length)
|
|
64
|
+
return false;
|
|
65
|
+
for (let i = 0; i < a.args.length; i++) {
|
|
66
|
+
if (!typeEq(a.args[i], bb.args[i]))
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Devuelve true si `t` es una flecha `A → B`. */
|
|
74
|
+
function isFunType(t) {
|
|
75
|
+
return t.kind === 'tapp' && t.fn === 'fun' && t.args.length === 2;
|
|
76
|
+
}
|
|
77
|
+
/** Dominio de una flecha. Lanza si el tipo no es flecha. */
|
|
78
|
+
function funDomain(t) {
|
|
79
|
+
if (!isFunType(t)) {
|
|
80
|
+
throw new Error(`funDomain: el tipo no es una función: ${typeToString(t)}`);
|
|
81
|
+
}
|
|
82
|
+
return t.args[0];
|
|
83
|
+
}
|
|
84
|
+
/** Codominio de una flecha. Lanza si el tipo no es flecha. */
|
|
85
|
+
function funCodomain(t) {
|
|
86
|
+
if (!isFunType(t)) {
|
|
87
|
+
throw new Error(`funCodomain: el tipo no es una función: ${typeToString(t)}`);
|
|
88
|
+
}
|
|
89
|
+
return t.args[1];
|
|
90
|
+
}
|
|
91
|
+
/** Pretty-printer; útil para mensajes de error y tests. */
|
|
92
|
+
function typeToString(t) {
|
|
93
|
+
switch (t.kind) {
|
|
94
|
+
case 'tvar':
|
|
95
|
+
return t.name;
|
|
96
|
+
case 'tconst':
|
|
97
|
+
return t.name;
|
|
98
|
+
case 'tapp':
|
|
99
|
+
if (t.fn === 'fun' && t.args.length === 2) {
|
|
100
|
+
return `(${typeToString(t.args[0])} → ${typeToString(t.args[1])})`;
|
|
101
|
+
}
|
|
102
|
+
return `${t.fn}(${t.args.map(typeToString).join(', ')})`;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Sustitución sobre variables de tipo. Aplica `subst` a `t`
|
|
107
|
+
* de manera capture-free (los tipos no tienen binders).
|
|
108
|
+
*/
|
|
109
|
+
function substType(subst, t) {
|
|
110
|
+
switch (t.kind) {
|
|
111
|
+
case 'tvar':
|
|
112
|
+
return Object.prototype.hasOwnProperty.call(subst, t.name) ? subst[t.name] : t;
|
|
113
|
+
case 'tconst':
|
|
114
|
+
return t;
|
|
115
|
+
case 'tapp':
|
|
116
|
+
return (0, exports.tapp)(t.fn, t.args.map((a) => substType(subst, a)));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** Recolecta los nombres de las variables de tipo libres en `t`. */
|
|
120
|
+
function freeTypeVars(t, out = new Set()) {
|
|
121
|
+
switch (t.kind) {
|
|
122
|
+
case 'tvar':
|
|
123
|
+
out.add(t.name);
|
|
124
|
+
return out;
|
|
125
|
+
case 'tconst':
|
|
126
|
+
return out;
|
|
127
|
+
case 'tapp':
|
|
128
|
+
for (const a of t.args)
|
|
129
|
+
freeTypeVars(a, out);
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=type-system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-system.js","sourceRoot":"","sources":["../../../src/profiles/hol/type-system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tipos en HOL: variables de tipo, constantes (`bool`, `ind`,
|
|
3
|
+
* ...) y aplicaciones de constructores de tipo (`fun(α, β)`,
|
|
4
|
+
* `prod(α, β)`, ...).
|
|
5
|
+
*/
|
|
6
|
+
export type HOLType = {
|
|
7
|
+
kind: 'tvar';
|
|
8
|
+
name: string;
|
|
9
|
+
} | {
|
|
10
|
+
kind: 'tconst';
|
|
11
|
+
name: string;
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'tapp';
|
|
14
|
+
fn: string;
|
|
15
|
+
args: HOLType[];
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Términos HOL. Polimorfismo via `tvar` en los tipos de
|
|
19
|
+
* variables/constantes. `comb` es aplicación; `abs` es
|
|
20
|
+
* λ-abstracción con el tipo del parámetro registrado.
|
|
21
|
+
*/
|
|
22
|
+
export type HOLTerm = {
|
|
23
|
+
kind: 'var';
|
|
24
|
+
name: string;
|
|
25
|
+
type: HOLType;
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'const';
|
|
28
|
+
name: string;
|
|
29
|
+
type: HOLType;
|
|
30
|
+
} | {
|
|
31
|
+
kind: 'comb';
|
|
32
|
+
fn: HOLTerm;
|
|
33
|
+
arg: HOLTerm;
|
|
34
|
+
} | {
|
|
35
|
+
kind: 'abs';
|
|
36
|
+
param: string;
|
|
37
|
+
paramType: HOLType;
|
|
38
|
+
body: HOLTerm;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Secuente abstracto. Las hipótesis son una multiset modelada
|
|
42
|
+
* como array; la igualdad se chequea por α-equivalencia.
|
|
43
|
+
*/
|
|
44
|
+
export interface HOLSequent {
|
|
45
|
+
hyps: HOLTerm[];
|
|
46
|
+
concl: HOLTerm;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Teorema HOL: hipótesis + conclusión + huella de la regla
|
|
50
|
+
* usada y los teoremas-premisa. Solo se obtiene aplicando una
|
|
51
|
+
* regla primitiva — no hay constructor público.
|
|
52
|
+
*/
|
|
53
|
+
export interface HOLTheorem {
|
|
54
|
+
readonly hyps: HOLTerm[];
|
|
55
|
+
readonly concl: HOLTerm;
|
|
56
|
+
readonly rule: string;
|
|
57
|
+
readonly derived?: HOLTheorem[];
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/profiles/hol/types.ts"],"names":[],"mappings":"AAwBA;;;;GAIG;AACH,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC;AAElD;;;;GAIG;AACH,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtE;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;CACjC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Higher-Order Logic (HOL Light style) — Tipos
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// HOL = lógica de tipos simples + λ-binding + igualdad primitiva.
|
|
7
|
+
// Inspirado en HOL Light / Isabelle/HOL: un núcleo deductivo
|
|
8
|
+
// minimal con 10 reglas primitivas; el resto del aparato lógico
|
|
9
|
+
// (conectivas, cuantificadores) se define en términos de la
|
|
10
|
+
// igualdad polimórfica.
|
|
11
|
+
//
|
|
12
|
+
// Convención de typing: `bool` es el tipo de proposiciones,
|
|
13
|
+
// `ind` el tipo de individuos. Los tipos compuestos se forman
|
|
14
|
+
// con `fun(A, B)` que corresponde a `A → B`. Las variables de
|
|
15
|
+
// tipo (`tvar`) permiten polimorfismo paramétrico (let-style).
|
|
16
|
+
//
|
|
17
|
+
// Convención de terms (siguiendo HOL Light):
|
|
18
|
+
// - `var` variable libre de un tipo
|
|
19
|
+
// - `const` constante (igualdad, conectivas definidas, etc.)
|
|
20
|
+
// - `comb f x` aplicación de funciones (f x)
|
|
21
|
+
// - `abs x.t` λ-abstracción
|
|
22
|
+
//
|
|
23
|
+
// Nota sobre nombres de variables: dos `var` con el mismo
|
|
24
|
+
// nombre PERO distinto tipo son variables distintas (HOL Light).
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/profiles/hol/types.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,+CAA+C;AAC/C,+DAA+D;AAC/D,EAAE;AACF,kEAAkE;AAClE,6DAA6D;AAC7D,gEAAgE;AAChE,4DAA4D;AAC5D,wBAAwB;AACxB,EAAE;AACF,4DAA4D;AAC5D,8DAA8D;AAC9D,8DAA8D;AAC9D,+DAA+D;AAC/D,EAAE;AACF,6CAA6C;AAC7C,uCAAuC;AACvC,+DAA+D;AAC/D,+CAA+C;AAC/C,8BAA8B;AAC9B,EAAE;AACF,0DAA0D;AAC1D,iEAAiE"}
|