@stevenvo780/st-lang 4.4.0 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/coinduction/index.d.ts +136 -0
- package/dist/coinduction/index.d.ts.map +1 -0
- package/dist/coinduction/index.js +318 -0
- package/dist/coinduction/index.js.map +1 -0
- package/dist/combinators-ski/abstract.d.ts +5 -0
- package/dist/combinators-ski/abstract.d.ts.map +1 -0
- package/dist/combinators-ski/abstract.js +88 -0
- package/dist/combinators-ski/abstract.js.map +1 -0
- package/dist/combinators-ski/index.d.ts +6 -0
- package/dist/combinators-ski/index.d.ts.map +1 -0
- package/dist/combinators-ski/index.js +30 -0
- package/dist/combinators-ski/index.js.map +1 -0
- package/dist/combinators-ski/reduce.d.ts +10 -0
- package/dist/combinators-ski/reduce.d.ts.map +1 -0
- package/dist/combinators-ski/reduce.js +118 -0
- package/dist/combinators-ski/reduce.js.map +1 -0
- package/dist/combinators-ski/types.d.ts +23 -0
- package/dist/combinators-ski/types.d.ts.map +1 -0
- package/dist/combinators-ski/types.js +102 -0
- package/dist/combinators-ski/types.js.map +1 -0
- package/dist/constructive-reals/index.d.ts +132 -0
- package/dist/constructive-reals/index.d.ts.map +1 -0
- package/dist/constructive-reals/index.js +723 -0
- package/dist/constructive-reals/index.js.map +1 -0
- package/dist/game-semantics/convert.d.ts +4 -0
- package/dist/game-semantics/convert.d.ts.map +1 -0
- package/dist/game-semantics/convert.js +28 -0
- package/dist/game-semantics/convert.js.map +1 -0
- package/dist/game-semantics/index.d.ts +6 -0
- package/dist/game-semantics/index.d.ts.map +1 -0
- package/dist/game-semantics/index.js +28 -0
- package/dist/game-semantics/index.js.map +1 -0
- package/dist/game-semantics/strategy.d.ts +34 -0
- package/dist/game-semantics/strategy.d.ts.map +1 -0
- package/dist/game-semantics/strategy.js +336 -0
- package/dist/game-semantics/strategy.js.map +1 -0
- package/dist/game-semantics/types.d.ts +64 -0
- package/dist/game-semantics/types.d.ts.map +1 -0
- package/dist/game-semantics/types.js +78 -0
- package/dist/game-semantics/types.js.map +1 -0
- package/dist/higher-order-unify/index.d.ts +5 -0
- package/dist/higher-order-unify/index.d.ts.map +1 -0
- package/dist/higher-order-unify/index.js +27 -0
- package/dist/higher-order-unify/index.js.map +1 -0
- package/dist/higher-order-unify/normalize.d.ts +14 -0
- package/dist/higher-order-unify/normalize.d.ts.map +1 -0
- package/dist/higher-order-unify/normalize.js +191 -0
- package/dist/higher-order-unify/normalize.js.map +1 -0
- package/dist/higher-order-unify/pattern.d.ts +4 -0
- package/dist/higher-order-unify/pattern.d.ts.map +1 -0
- package/dist/higher-order-unify/pattern.js +70 -0
- package/dist/higher-order-unify/pattern.js.map +1 -0
- package/dist/higher-order-unify/types.d.ts +19 -0
- package/dist/higher-order-unify/types.d.ts.map +1 -0
- package/dist/higher-order-unify/types.js +14 -0
- package/dist/higher-order-unify/types.js.map +1 -0
- package/dist/higher-order-unify/unify.d.ts +5 -0
- package/dist/higher-order-unify/unify.d.ts.map +1 -0
- package/dist/higher-order-unify/unify.js +306 -0
- package/dist/higher-order-unify/unify.js.map +1 -0
- package/dist/nbe/index.d.ts +3 -0
- package/dist/nbe/index.d.ts.map +1 -0
- package/dist/nbe/index.js +25 -0
- package/dist/nbe/index.js.map +1 -0
- package/dist/nbe/nbe.d.ts +7 -0
- package/dist/nbe/nbe.d.ts.map +1 -0
- package/dist/nbe/nbe.js +118 -0
- package/dist/nbe/nbe.js.map +1 -0
- package/dist/nbe/types.d.ts +54 -0
- package/dist/nbe/types.d.ts.map +1 -0
- package/dist/nbe/types.js +117 -0
- package/dist/nbe/types.js.map +1 -0
- package/dist/profile-bridge/index.d.ts +64 -0
- package/dist/profile-bridge/index.d.ts.map +1 -0
- package/dist/profile-bridge/index.js +328 -0
- package/dist/profile-bridge/index.js.map +1 -0
- package/dist/proof-nets/construct.d.ts +3 -0
- package/dist/proof-nets/construct.d.ts.map +1 -0
- package/dist/proof-nets/construct.js +85 -0
- package/dist/proof-nets/construct.js.map +1 -0
- package/dist/proof-nets/correctness.d.ts +3 -0
- package/dist/proof-nets/correctness.d.ts.map +1 -0
- package/dist/proof-nets/correctness.js +213 -0
- package/dist/proof-nets/correctness.js.map +1 -0
- package/dist/proof-nets/cut-elim.d.ts +9 -0
- package/dist/proof-nets/cut-elim.d.ts.map +1 -0
- package/dist/proof-nets/cut-elim.js +149 -0
- package/dist/proof-nets/cut-elim.js.map +1 -0
- package/dist/proof-nets/index.d.ts +6 -0
- package/dist/proof-nets/index.d.ts.map +1 -0
- package/dist/proof-nets/index.js +33 -0
- package/dist/proof-nets/index.js.map +1 -0
- package/dist/proof-nets/types.d.ts +36 -0
- package/dist/proof-nets/types.d.ts.map +1 -0
- package/dist/proof-nets/types.js +89 -0
- package/dist/proof-nets/types.js.map +1 -0
- package/dist/tableau-framework/TableauProver.d.ts +10 -0
- package/dist/tableau-framework/TableauProver.d.ts.map +1 -0
- package/dist/tableau-framework/TableauProver.js +118 -0
- package/dist/tableau-framework/TableauProver.js.map +1 -0
- package/dist/tableau-framework/index.d.ts +5 -0
- package/dist/tableau-framework/index.d.ts.map +1 -0
- package/dist/tableau-framework/index.js +11 -0
- package/dist/tableau-framework/index.js.map +1 -0
- package/dist/tableau-framework/propositional.d.ts +11 -0
- package/dist/tableau-framework/propositional.d.ts.map +1 -0
- package/dist/tableau-framework/propositional.js +143 -0
- package/dist/tableau-framework/propositional.js.map +1 -0
- package/dist/tableau-framework/types.d.ts +32 -0
- package/dist/tableau-framework/types.d.ts.map +1 -0
- package/dist/tableau-framework/types.js +6 -0
- package/dist/tableau-framework/types.js.map +1 -0
- package/dist/tests/coinduction/coinduction.test.d.ts +2 -0
- package/dist/tests/coinduction/coinduction.test.d.ts.map +1 -0
- package/dist/tests/coinduction/coinduction.test.js +217 -0
- package/dist/tests/coinduction/coinduction.test.js.map +1 -0
- package/dist/tests/combinators-ski/combinators-ski.test.d.ts +2 -0
- package/dist/tests/combinators-ski/combinators-ski.test.d.ts.map +1 -0
- package/dist/tests/combinators-ski/combinators-ski.test.js +211 -0
- package/dist/tests/combinators-ski/combinators-ski.test.js.map +1 -0
- package/dist/tests/constructive-reals/constructive-reals.test.d.ts +2 -0
- package/dist/tests/constructive-reals/constructive-reals.test.d.ts.map +1 -0
- package/dist/tests/constructive-reals/constructive-reals.test.js +357 -0
- package/dist/tests/constructive-reals/constructive-reals.test.js.map +1 -0
- package/dist/tests/game-semantics/game-semantics.test.d.ts +2 -0
- package/dist/tests/game-semantics/game-semantics.test.d.ts.map +1 -0
- package/dist/tests/game-semantics/game-semantics.test.js +143 -0
- package/dist/tests/game-semantics/game-semantics.test.js.map +1 -0
- package/dist/tests/higher-order-unify/ho-unify.test.d.ts +2 -0
- package/dist/tests/higher-order-unify/ho-unify.test.d.ts.map +1 -0
- package/dist/tests/higher-order-unify/ho-unify.test.js +264 -0
- package/dist/tests/higher-order-unify/ho-unify.test.js.map +1 -0
- package/dist/tests/integration/cross-modules.test.d.ts +8 -0
- package/dist/tests/integration/cross-modules.test.d.ts.map +1 -0
- package/dist/tests/integration/cross-modules.test.js +668 -0
- package/dist/tests/integration/cross-modules.test.js.map +1 -0
- package/dist/tests/nbe/nbe.test.d.ts +2 -0
- package/dist/tests/nbe/nbe.test.d.ts.map +1 -0
- package/dist/tests/nbe/nbe.test.js +121 -0
- package/dist/tests/nbe/nbe.test.js.map +1 -0
- package/dist/tests/profile-bridge/translations.test.d.ts +2 -0
- package/dist/tests/profile-bridge/translations.test.d.ts.map +1 -0
- package/dist/tests/profile-bridge/translations.test.js +266 -0
- package/dist/tests/profile-bridge/translations.test.js.map +1 -0
- package/dist/tests/proof-nets/proof-nets.test.d.ts +2 -0
- package/dist/tests/proof-nets/proof-nets.test.d.ts.map +1 -0
- package/dist/tests/proof-nets/proof-nets.test.js +263 -0
- package/dist/tests/proof-nets/proof-nets.test.js.map +1 -0
- package/dist/tests/tableau-framework/tableau.test.d.ts +2 -0
- package/dist/tests/tableau-framework/tableau.test.d.ts.map +1 -0
- package/dist/tests/tableau-framework/tableau.test.js +196 -0
- package/dist/tests/tableau-framework/tableau.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
export interface Stream<T> {
|
|
2
|
+
head: T;
|
|
3
|
+
tail: () => Stream<T>;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Cons explícito: crea un stream con cabeza `h` y cola perezosa
|
|
7
|
+
* `t` (una función que produce el resto cuando se evalúa).
|
|
8
|
+
*/
|
|
9
|
+
export declare function cons<T>(h: T, t: () => Stream<T>): Stream<T>;
|
|
10
|
+
/**
|
|
11
|
+
* `repeat(x)` = x, x, x, ... (stream constante)
|
|
12
|
+
*
|
|
13
|
+
* Definición corecursiva clásica: repeat(x) = cons(x, () => repeat(x)).
|
|
14
|
+
* El thunk evita la recursión infinita en tiempo de construcción.
|
|
15
|
+
*/
|
|
16
|
+
export declare function repeat<T>(x: T): Stream<T>;
|
|
17
|
+
/**
|
|
18
|
+
* `iterate(f, x)` = x, f(x), f(f(x)), ...
|
|
19
|
+
*
|
|
20
|
+
* Definición corecursiva: iterate(f, x) = cons(x, () => iterate(f, f(x))).
|
|
21
|
+
*/
|
|
22
|
+
export declare function iterate<T>(f: (x: T) => T, x: T): Stream<T>;
|
|
23
|
+
/**
|
|
24
|
+
* `unfold(seed, step)`: anamorfismo genérico. `step(s)` devuelve
|
|
25
|
+
* el siguiente par `[valor, próximaSemilla]` o `null` para terminar.
|
|
26
|
+
* Para streams infinitos, `step` nunca debe devolver `null`. Si
|
|
27
|
+
* devuelve `null` durante una iteración, devolvemos un stream que
|
|
28
|
+
* cicla la última cabeza producida (decisión: streams totales).
|
|
29
|
+
*/
|
|
30
|
+
export declare function unfold<S, T>(seed: S, step: (s: S) => readonly [T, S] | null): Stream<T>;
|
|
31
|
+
/**
|
|
32
|
+
* `take(s, n)`: extrae los primeros n elementos de un stream.
|
|
33
|
+
* Observación finita; es la única forma de "ver" un stream.
|
|
34
|
+
*/
|
|
35
|
+
export declare function take<T>(s: Stream<T>, n: number): T[];
|
|
36
|
+
/**
|
|
37
|
+
* `drop(s, n)`: descarta los primeros n elementos.
|
|
38
|
+
*/
|
|
39
|
+
export declare function drop<T>(s: Stream<T>, n: number): Stream<T>;
|
|
40
|
+
/**
|
|
41
|
+
* `nth(s, i)`: i-ésimo elemento (0-indexed).
|
|
42
|
+
*/
|
|
43
|
+
export declare function nth<T>(s: Stream<T>, i: number): T;
|
|
44
|
+
/**
|
|
45
|
+
* `map(f, s)`: aplica `f` a cada elemento.
|
|
46
|
+
*
|
|
47
|
+
* Definición corecursiva: map(f, s) = cons(f(head s), () => map(f, tail s)).
|
|
48
|
+
*/
|
|
49
|
+
export declare function map<T, U>(f: (x: T) => U, s: Stream<T>): Stream<U>;
|
|
50
|
+
/**
|
|
51
|
+
* `zipWith(f, a, b)`: combina dos streams elemento a elemento.
|
|
52
|
+
*
|
|
53
|
+
* zipWith(f, a, b) = cons(f(head a, head b), () => zipWith(f, tail a, tail b))
|
|
54
|
+
*/
|
|
55
|
+
export declare function zipWith<A, B, C>(f: (a: A, b: B) => C, a: Stream<A>, b: Stream<B>): Stream<C>;
|
|
56
|
+
/**
|
|
57
|
+
* `zip(a, b)`: par-zip estándar.
|
|
58
|
+
*/
|
|
59
|
+
export declare function zip<A, B>(a: Stream<A>, b: Stream<B>): Stream<[A, B]>;
|
|
60
|
+
/**
|
|
61
|
+
* `filter(pred, s)`: PRECONDICIÓN — el predicado debe ser satisfecho
|
|
62
|
+
* infinitas veces, de lo contrario el stream resultante se "atasca".
|
|
63
|
+
* No protegemos contra eso porque coinductivamente no es decidible.
|
|
64
|
+
*/
|
|
65
|
+
export declare function filter<T>(pred: (x: T) => boolean, s: Stream<T>): Stream<T>;
|
|
66
|
+
/**
|
|
67
|
+
* naturals = 0, 1, 2, 3, ...
|
|
68
|
+
*/
|
|
69
|
+
export declare const naturals: Stream<number>;
|
|
70
|
+
export declare const fibonacci: Stream<number>;
|
|
71
|
+
export interface BisimulationProof<T> {
|
|
72
|
+
/** Par inicial cuyo membership en la bisimulación queremos probar. */
|
|
73
|
+
initial: [Stream<T>, Stream<T>];
|
|
74
|
+
/**
|
|
75
|
+
* Relación candidata R. Por bisimulación, basta que R sea una
|
|
76
|
+
* "bisimulación up-to": cerrada bajo los destructores en el sentido
|
|
77
|
+
* de que R(s,t) ⇒ R(tail s, tail t).
|
|
78
|
+
*/
|
|
79
|
+
relation: (a: Stream<T>, b: Stream<T>) => boolean;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* `isBisimilar(a, b, depth)`: chequeo de bisimilaridad acotado.
|
|
83
|
+
* Compara cabezas hasta profundidad `depth`. Retorna `false` apenas
|
|
84
|
+
* encuentra una divergencia (refutación constructiva); retorna `true`
|
|
85
|
+
* si los primeros `depth` elementos coinciden (evidencia positiva
|
|
86
|
+
* acotada — para una prueba real de bisimilaridad, usar `prove`).
|
|
87
|
+
*
|
|
88
|
+
* Usa `Object.is` para comparar primitivos. Para tipos compuestos
|
|
89
|
+
* el caller debería envolver con un equality explícito (no hacemos
|
|
90
|
+
* deep-equals porque tendría costo no obvio y semántica ambigua).
|
|
91
|
+
*/
|
|
92
|
+
export declare function isBisimilar<T>(a: Stream<T>, b: Stream<T>, depth?: number): boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Igualdad observacional para elementos de un stream. Soportamos:
|
|
95
|
+
* • primitivos (===, con Object.is para NaN/+0/-0)
|
|
96
|
+
* • arrays y tuplas (recursión elemento a elemento)
|
|
97
|
+
* • objetos planos por keys propias
|
|
98
|
+
* No hace circular-detection: si pasás un grafo cíclico, va a colgar.
|
|
99
|
+
*/
|
|
100
|
+
declare function equal(x: unknown, y: unknown): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* `prove(claim, depth)`: aplica la técnica de bisimulación up-to.
|
|
103
|
+
*
|
|
104
|
+
* Algoritmo: empieza con el par inicial, y para cada paso i ∈ [0, depth):
|
|
105
|
+
* 1. Verifica que la relación R sostenga el par actual (a_i, b_i).
|
|
106
|
+
* 2. Verifica que las cabezas sean iguales: head(a_i) = head(b_i).
|
|
107
|
+
* 3. Avanza: a_{i+1} = tail(a_i), b_{i+1} = tail(b_i).
|
|
108
|
+
*
|
|
109
|
+
* Si la relación R es genuinamente una bisimulación (clausurada bajo
|
|
110
|
+
* tail), todos los pasos pasarán para cualquier `depth`. El método
|
|
111
|
+
* es completo "en el límite": probar para `depth = ∞` ≡ probar bisim.
|
|
112
|
+
* En la práctica devolvemos true si depth pasos pasaron sin error.
|
|
113
|
+
*
|
|
114
|
+
* Si la relación falla en algún paso, retornamos false (evidencia de
|
|
115
|
+
* que R no es una bisimulación, o de que (a, b) no es bisimilar).
|
|
116
|
+
*/
|
|
117
|
+
export declare function prove<T>(claim: BisimulationProof<T>, depth?: number): boolean;
|
|
118
|
+
/**
|
|
119
|
+
* `interleave(a, b)`: intercala a, b, a, b, ... toma 1 de a luego 1 de b.
|
|
120
|
+
*
|
|
121
|
+
* interleave(a, b) = cons(head a, () => interleave(b, tail a))
|
|
122
|
+
*
|
|
123
|
+
* Nota: el "switch" entre a y b se hace por el truco clásico:
|
|
124
|
+
* llamar recursivamente con los argumentos invertidos.
|
|
125
|
+
*/
|
|
126
|
+
export declare function interleave<T>(a: Stream<T>, b: Stream<T>): Stream<T>;
|
|
127
|
+
/**
|
|
128
|
+
* `scan(f, init, s)`: prefijos acumulados; análogo a Array.prototype.reduce
|
|
129
|
+
* pero coinductivo. scan(+, 0, naturals) = 0, 0, 1, 3, 6, 10, ...
|
|
130
|
+
*/
|
|
131
|
+
export declare function scan<T, U>(f: (acc: U, x: T) => U, init: U, s: Stream<T>): Stream<U>;
|
|
132
|
+
export declare const __internals: {
|
|
133
|
+
equal: typeof equal;
|
|
134
|
+
};
|
|
135
|
+
export {};
|
|
136
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/coinduction/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ST Coinduction — Streams + corecursion + bisimulación up-to
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Streams coinductivos definidos por destructores (head, tail).
|
|
6
|
+
// Construcción corecursiva via thunks perezosos (la cola es una
|
|
7
|
+
// función `() => Stream<T>` para evitar evaluación infinita).
|
|
8
|
+
//
|
|
9
|
+
// Bisimulación: la noción natural de igualdad para streams. Dos
|
|
10
|
+
// streams `s, t` son bisimilares si existe una relación R tal que
|
|
11
|
+
// • R(s, t) ⇒ head(s) = head(t)
|
|
12
|
+
// • R(s, t) ⇒ R(tail(s), tail(t))
|
|
13
|
+
// La igualdad sintáctica falla (dos streams pueden generar la
|
|
14
|
+
// misma secuencia con thunks distintos); la bisimulación es la
|
|
15
|
+
// clausura coinductiva apropiada.
|
|
16
|
+
//
|
|
17
|
+
// Como las secuencias son infinitas no podemos verificar
|
|
18
|
+
// bisimilaridad en general (semi-decidible). Por eso ofrecemos:
|
|
19
|
+
// • isBisimilar(a, b, depth): chequeo "hasta profundidad", suficiente
|
|
20
|
+
// para refutación (encontrar el primer prefijo divergente) y para
|
|
21
|
+
// evidencia computacional positiva acotada.
|
|
22
|
+
// • prove(claim, depth): técnica "bisimulación up-to". El usuario
|
|
23
|
+
// provee una relación R; chequeamos por `depth` pasos que
|
|
24
|
+
// R(a,b) ⇒ head(a)=head(b) ∧ R(tail a, tail b).
|
|
25
|
+
// Si la relación es realmente una bisimulación, ningún paso falla;
|
|
26
|
+
// si depth pasos pasaron sin fallar, tenemos alta confianza
|
|
27
|
+
// (en el caso límite, todos los pasos válidos = bisimulación).
|
|
28
|
+
// ============================================================
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.__internals = exports.fibonacci = exports.naturals = void 0;
|
|
31
|
+
exports.cons = cons;
|
|
32
|
+
exports.repeat = repeat;
|
|
33
|
+
exports.iterate = iterate;
|
|
34
|
+
exports.unfold = unfold;
|
|
35
|
+
exports.take = take;
|
|
36
|
+
exports.drop = drop;
|
|
37
|
+
exports.nth = nth;
|
|
38
|
+
exports.map = map;
|
|
39
|
+
exports.zipWith = zipWith;
|
|
40
|
+
exports.zip = zip;
|
|
41
|
+
exports.filter = filter;
|
|
42
|
+
exports.isBisimilar = isBisimilar;
|
|
43
|
+
exports.prove = prove;
|
|
44
|
+
exports.interleave = interleave;
|
|
45
|
+
exports.scan = scan;
|
|
46
|
+
// ── Constructores ───────────────────────────────────────────
|
|
47
|
+
/**
|
|
48
|
+
* Cons explícito: crea un stream con cabeza `h` y cola perezosa
|
|
49
|
+
* `t` (una función que produce el resto cuando se evalúa).
|
|
50
|
+
*/
|
|
51
|
+
function cons(h, t) {
|
|
52
|
+
return { head: h, tail: t };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* `repeat(x)` = x, x, x, ... (stream constante)
|
|
56
|
+
*
|
|
57
|
+
* Definición corecursiva clásica: repeat(x) = cons(x, () => repeat(x)).
|
|
58
|
+
* El thunk evita la recursión infinita en tiempo de construcción.
|
|
59
|
+
*/
|
|
60
|
+
function repeat(x) {
|
|
61
|
+
// Truco para evitar reconstruir el objeto en cada `tail`: usamos
|
|
62
|
+
// un nodo que se referencia a sí mismo. Esto preserva la semántica
|
|
63
|
+
// (tail(repeat x) = repeat x) y además garantiza punto-fijo.
|
|
64
|
+
const node = { head: x, tail: () => node };
|
|
65
|
+
return node;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* `iterate(f, x)` = x, f(x), f(f(x)), ...
|
|
69
|
+
*
|
|
70
|
+
* Definición corecursiva: iterate(f, x) = cons(x, () => iterate(f, f(x))).
|
|
71
|
+
*/
|
|
72
|
+
function iterate(f, x) {
|
|
73
|
+
return { head: x, tail: () => iterate(f, f(x)) };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* `unfold(seed, step)`: anamorfismo genérico. `step(s)` devuelve
|
|
77
|
+
* el siguiente par `[valor, próximaSemilla]` o `null` para terminar.
|
|
78
|
+
* Para streams infinitos, `step` nunca debe devolver `null`. Si
|
|
79
|
+
* devuelve `null` durante una iteración, devolvemos un stream que
|
|
80
|
+
* cicla la última cabeza producida (decisión: streams totales).
|
|
81
|
+
*/
|
|
82
|
+
function unfold(seed, step) {
|
|
83
|
+
const next = step(seed);
|
|
84
|
+
if (next === null) {
|
|
85
|
+
// Streams en este módulo son totales; si el cliente decide terminar,
|
|
86
|
+
// estabilizamos en un punto fijo trivial usando undefined.
|
|
87
|
+
// En la práctica, los callers no deberían llamar unfold con un step
|
|
88
|
+
// que puede devolver null si esperan un stream infinito.
|
|
89
|
+
throw new Error('unfold: step returned null on infinite stream');
|
|
90
|
+
}
|
|
91
|
+
const [value, nextSeed] = next;
|
|
92
|
+
return { head: value, tail: () => unfold(nextSeed, step) };
|
|
93
|
+
}
|
|
94
|
+
// ── Destructores y observaciones ────────────────────────────
|
|
95
|
+
/**
|
|
96
|
+
* `take(s, n)`: extrae los primeros n elementos de un stream.
|
|
97
|
+
* Observación finita; es la única forma de "ver" un stream.
|
|
98
|
+
*/
|
|
99
|
+
function take(s, n) {
|
|
100
|
+
if (!Number.isInteger(n) || n < 0) {
|
|
101
|
+
throw new Error(`take: n debe ser entero no-negativo, recibido ${n}`);
|
|
102
|
+
}
|
|
103
|
+
const out = [];
|
|
104
|
+
let cur = s;
|
|
105
|
+
for (let i = 0; i < n; i++) {
|
|
106
|
+
out.push(cur.head);
|
|
107
|
+
cur = cur.tail();
|
|
108
|
+
}
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* `drop(s, n)`: descarta los primeros n elementos.
|
|
113
|
+
*/
|
|
114
|
+
function drop(s, n) {
|
|
115
|
+
if (!Number.isInteger(n) || n < 0) {
|
|
116
|
+
throw new Error(`drop: n debe ser entero no-negativo, recibido ${n}`);
|
|
117
|
+
}
|
|
118
|
+
let cur = s;
|
|
119
|
+
for (let i = 0; i < n; i++)
|
|
120
|
+
cur = cur.tail();
|
|
121
|
+
return cur;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* `nth(s, i)`: i-ésimo elemento (0-indexed).
|
|
125
|
+
*/
|
|
126
|
+
function nth(s, i) {
|
|
127
|
+
return drop(s, i).head;
|
|
128
|
+
}
|
|
129
|
+
// ── Functor / aplicativos ───────────────────────────────────
|
|
130
|
+
/**
|
|
131
|
+
* `map(f, s)`: aplica `f` a cada elemento.
|
|
132
|
+
*
|
|
133
|
+
* Definición corecursiva: map(f, s) = cons(f(head s), () => map(f, tail s)).
|
|
134
|
+
*/
|
|
135
|
+
function map(f, s) {
|
|
136
|
+
return { head: f(s.head), tail: () => map(f, s.tail()) };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* `zipWith(f, a, b)`: combina dos streams elemento a elemento.
|
|
140
|
+
*
|
|
141
|
+
* zipWith(f, a, b) = cons(f(head a, head b), () => zipWith(f, tail a, tail b))
|
|
142
|
+
*/
|
|
143
|
+
function zipWith(f, a, b) {
|
|
144
|
+
return {
|
|
145
|
+
head: f(a.head, b.head),
|
|
146
|
+
tail: () => zipWith(f, a.tail(), b.tail()),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* `zip(a, b)`: par-zip estándar.
|
|
151
|
+
*/
|
|
152
|
+
function zip(a, b) {
|
|
153
|
+
return zipWith((x, y) => [x, y], a, b);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* `filter(pred, s)`: PRECONDICIÓN — el predicado debe ser satisfecho
|
|
157
|
+
* infinitas veces, de lo contrario el stream resultante se "atasca".
|
|
158
|
+
* No protegemos contra eso porque coinductivamente no es decidible.
|
|
159
|
+
*/
|
|
160
|
+
function filter(pred, s) {
|
|
161
|
+
let cur = s;
|
|
162
|
+
while (!pred(cur.head)) {
|
|
163
|
+
cur = cur.tail();
|
|
164
|
+
}
|
|
165
|
+
const advanced = cur;
|
|
166
|
+
return {
|
|
167
|
+
head: advanced.head,
|
|
168
|
+
tail: () => filter(pred, advanced.tail()),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// ── Streams notables ────────────────────────────────────────
|
|
172
|
+
/**
|
|
173
|
+
* naturals = 0, 1, 2, 3, ...
|
|
174
|
+
*/
|
|
175
|
+
exports.naturals = iterate((n) => n + 1, 0);
|
|
176
|
+
/**
|
|
177
|
+
* fibonacci = 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
|
|
178
|
+
*
|
|
179
|
+
* Definición clásica corecursiva (Hinze):
|
|
180
|
+
* fib = 0 :: 1 :: zipWith(+, fib, tail fib)
|
|
181
|
+
*
|
|
182
|
+
* En TypeScript necesitamos un thunk que se autorreferencie. Lo
|
|
183
|
+
* implementamos con una closure que devuelve siempre el mismo nodo.
|
|
184
|
+
*/
|
|
185
|
+
function makeFibonacci() {
|
|
186
|
+
// fib(n) clásico vía iterate sobre el par (a, b) = (fib n, fib (n+1)).
|
|
187
|
+
// Equivalente computacionalmente a la definición zipWith pero sin
|
|
188
|
+
// requerir auto-referencia en TS (que generaría thunks anidados
|
|
189
|
+
// exponencialmente sin memoización).
|
|
190
|
+
return map(([a, _b]) => a, iterate(([a, b]) => [b, a + b], [0, 1]));
|
|
191
|
+
}
|
|
192
|
+
exports.fibonacci = makeFibonacci();
|
|
193
|
+
const DEFAULT_DEPTH = 64;
|
|
194
|
+
/**
|
|
195
|
+
* `isBisimilar(a, b, depth)`: chequeo de bisimilaridad acotado.
|
|
196
|
+
* Compara cabezas hasta profundidad `depth`. Retorna `false` apenas
|
|
197
|
+
* encuentra una divergencia (refutación constructiva); retorna `true`
|
|
198
|
+
* si los primeros `depth` elementos coinciden (evidencia positiva
|
|
199
|
+
* acotada — para una prueba real de bisimilaridad, usar `prove`).
|
|
200
|
+
*
|
|
201
|
+
* Usa `Object.is` para comparar primitivos. Para tipos compuestos
|
|
202
|
+
* el caller debería envolver con un equality explícito (no hacemos
|
|
203
|
+
* deep-equals porque tendría costo no obvio y semántica ambigua).
|
|
204
|
+
*/
|
|
205
|
+
function isBisimilar(a, b, depth = DEFAULT_DEPTH) {
|
|
206
|
+
if (!Number.isInteger(depth) || depth < 0) {
|
|
207
|
+
throw new Error(`isBisimilar: depth debe ser entero no-negativo, recibido ${depth}`);
|
|
208
|
+
}
|
|
209
|
+
let curA = a;
|
|
210
|
+
let curB = b;
|
|
211
|
+
for (let i = 0; i < depth; i++) {
|
|
212
|
+
if (!equal(curA.head, curB.head))
|
|
213
|
+
return false;
|
|
214
|
+
curA = curA.tail();
|
|
215
|
+
curB = curB.tail();
|
|
216
|
+
}
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Igualdad observacional para elementos de un stream. Soportamos:
|
|
221
|
+
* • primitivos (===, con Object.is para NaN/+0/-0)
|
|
222
|
+
* • arrays y tuplas (recursión elemento a elemento)
|
|
223
|
+
* • objetos planos por keys propias
|
|
224
|
+
* No hace circular-detection: si pasás un grafo cíclico, va a colgar.
|
|
225
|
+
*/
|
|
226
|
+
function equal(x, y) {
|
|
227
|
+
if (Object.is(x, y))
|
|
228
|
+
return true;
|
|
229
|
+
if (typeof x !== typeof y)
|
|
230
|
+
return false;
|
|
231
|
+
if (x === null || y === null)
|
|
232
|
+
return false;
|
|
233
|
+
if (typeof x !== 'object')
|
|
234
|
+
return false;
|
|
235
|
+
if (Array.isArray(x) !== Array.isArray(y))
|
|
236
|
+
return false;
|
|
237
|
+
if (Array.isArray(x) && Array.isArray(y)) {
|
|
238
|
+
if (x.length !== y.length)
|
|
239
|
+
return false;
|
|
240
|
+
for (let i = 0; i < x.length; i++) {
|
|
241
|
+
if (!equal(x[i], y[i]))
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
const ox = x;
|
|
247
|
+
const oy = y;
|
|
248
|
+
const kx = Object.keys(ox);
|
|
249
|
+
const ky = Object.keys(oy);
|
|
250
|
+
if (kx.length !== ky.length)
|
|
251
|
+
return false;
|
|
252
|
+
for (const k of kx) {
|
|
253
|
+
if (!Object.prototype.hasOwnProperty.call(oy, k))
|
|
254
|
+
return false;
|
|
255
|
+
if (!equal(ox[k], oy[k]))
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* `prove(claim, depth)`: aplica la técnica de bisimulación up-to.
|
|
262
|
+
*
|
|
263
|
+
* Algoritmo: empieza con el par inicial, y para cada paso i ∈ [0, depth):
|
|
264
|
+
* 1. Verifica que la relación R sostenga el par actual (a_i, b_i).
|
|
265
|
+
* 2. Verifica que las cabezas sean iguales: head(a_i) = head(b_i).
|
|
266
|
+
* 3. Avanza: a_{i+1} = tail(a_i), b_{i+1} = tail(b_i).
|
|
267
|
+
*
|
|
268
|
+
* Si la relación R es genuinamente una bisimulación (clausurada bajo
|
|
269
|
+
* tail), todos los pasos pasarán para cualquier `depth`. El método
|
|
270
|
+
* es completo "en el límite": probar para `depth = ∞` ≡ probar bisim.
|
|
271
|
+
* En la práctica devolvemos true si depth pasos pasaron sin error.
|
|
272
|
+
*
|
|
273
|
+
* Si la relación falla en algún paso, retornamos false (evidencia de
|
|
274
|
+
* que R no es una bisimulación, o de que (a, b) no es bisimilar).
|
|
275
|
+
*/
|
|
276
|
+
function prove(claim, depth = DEFAULT_DEPTH) {
|
|
277
|
+
if (!Number.isInteger(depth) || depth < 0) {
|
|
278
|
+
throw new Error(`prove: depth debe ser entero no-negativo, recibido ${depth}`);
|
|
279
|
+
}
|
|
280
|
+
let [curA, curB] = claim.initial;
|
|
281
|
+
for (let i = 0; i < depth; i++) {
|
|
282
|
+
if (!claim.relation(curA, curB))
|
|
283
|
+
return false;
|
|
284
|
+
if (!equal(curA.head, curB.head))
|
|
285
|
+
return false;
|
|
286
|
+
curA = curA.tail();
|
|
287
|
+
curB = curB.tail();
|
|
288
|
+
}
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
// ── Utilidades para combinar streams (Hinze classics) ──────
|
|
292
|
+
/**
|
|
293
|
+
* `interleave(a, b)`: intercala a, b, a, b, ... toma 1 de a luego 1 de b.
|
|
294
|
+
*
|
|
295
|
+
* interleave(a, b) = cons(head a, () => interleave(b, tail a))
|
|
296
|
+
*
|
|
297
|
+
* Nota: el "switch" entre a y b se hace por el truco clásico:
|
|
298
|
+
* llamar recursivamente con los argumentos invertidos.
|
|
299
|
+
*/
|
|
300
|
+
function interleave(a, b) {
|
|
301
|
+
return {
|
|
302
|
+
head: a.head,
|
|
303
|
+
tail: () => interleave(b, a.tail()),
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* `scan(f, init, s)`: prefijos acumulados; análogo a Array.prototype.reduce
|
|
308
|
+
* pero coinductivo. scan(+, 0, naturals) = 0, 0, 1, 3, 6, 10, ...
|
|
309
|
+
*/
|
|
310
|
+
function scan(f, init, s) {
|
|
311
|
+
return {
|
|
312
|
+
head: init,
|
|
313
|
+
tail: () => scan(f, f(init, s.head), s.tail()),
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
// ── Exports auxiliares para tests ───────────────────────────
|
|
317
|
+
exports.__internals = { equal };
|
|
318
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/coinduction/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstract.d.ts","sourceRoot":"","sources":["../../src/combinators-ski/abstract.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAIrC,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,UAAU,GAAG,KAAK,CAYvD;AA+BD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,UAAU,CAmB7C"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Bracket abstraction: λ-cálculo → SKI
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Algoritmo clásico de Curry para eliminar λ-abstracciones, traducido
|
|
7
|
+
// como `lambda x . T ≡ [x] T` con las reglas:
|
|
8
|
+
//
|
|
9
|
+
// [x] x = I
|
|
10
|
+
// [x] M = K M si x ∉ FV(M)
|
|
11
|
+
// [x] (M N) = S ([x] M) ([x] N)
|
|
12
|
+
//
|
|
13
|
+
// Es el llamado "algoritmo (abc)" — simple, no optimizado: produce
|
|
14
|
+
// términos grandes pero correctos. Hay variantes que aprovechan
|
|
15
|
+
// patrones como `[x] (M x) = M` (η) o introducen B, C, W, T, K' para
|
|
16
|
+
// reducir tamaño; aquí elegimos la canónica por claridad pedagógica.
|
|
17
|
+
//
|
|
18
|
+
// `toLambda` hace el camino inverso: codifica S, K, I como las
|
|
19
|
+
// λ-abstracciones que los definen. No pretende invertir
|
|
20
|
+
// `abstractFromLambda` exactamente — el round-trip es semántico
|
|
21
|
+
// (alpha/beta-eta equivalente), no sintáctico.
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.abstractFromLambda = abstractFromLambda;
|
|
24
|
+
exports.toLambda = toLambda;
|
|
25
|
+
const types_1 = require("../lambda-calc/types");
|
|
26
|
+
const types_2 = require("./types");
|
|
27
|
+
// Convierte un λ-término a SKI puro (sólo S, K, I y variables libres).
|
|
28
|
+
function abstractFromLambda(t) {
|
|
29
|
+
switch (t.kind) {
|
|
30
|
+
case 'var':
|
|
31
|
+
return (0, types_2.cvar)(t.name);
|
|
32
|
+
case 'app':
|
|
33
|
+
return { kind: 'app', fn: abstractFromLambda(t.fn), arg: abstractFromLambda(t.arg) };
|
|
34
|
+
case 'abs': {
|
|
35
|
+
// [param] body
|
|
36
|
+
const inner = abstractFromLambda(t.body);
|
|
37
|
+
return bracket(t.param, inner);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// [x] T con T ya en SKI.
|
|
42
|
+
function bracket(x, t) {
|
|
43
|
+
// [x] x = I
|
|
44
|
+
if (t.kind === 'var' && t.name === x)
|
|
45
|
+
return (0, types_2.I)();
|
|
46
|
+
// [x] M = K M si x ∉ FV(M)
|
|
47
|
+
if (!(0, types_2.freeVars)(t).has(x))
|
|
48
|
+
return (0, types_2.app)((0, types_2.K)(), t);
|
|
49
|
+
// En este punto t es necesariamente una aplicación: si fuese una
|
|
50
|
+
// constante S/K/I no tendría FV, y si fuese `var` su nombre ≠ x ya
|
|
51
|
+
// habría caído en la rama K. Mantengo el switch para que TS
|
|
52
|
+
// narrowee y queden cubiertas las ramas restantes.
|
|
53
|
+
switch (t.kind) {
|
|
54
|
+
case 'app':
|
|
55
|
+
// [x] (M N) = S ([x] M) ([x] N)
|
|
56
|
+
return (0, types_2.app)((0, types_2.S)(), bracket(x, t.fn), bracket(x, t.arg));
|
|
57
|
+
case 'var':
|
|
58
|
+
case 'S':
|
|
59
|
+
case 'K':
|
|
60
|
+
case 'I':
|
|
61
|
+
// Inalcanzable por las guardas previas; reproducimos K-rule
|
|
62
|
+
// por defensa para no caer en undefined.
|
|
63
|
+
return (0, types_2.app)((0, types_2.K)(), t);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// SKI → λ-cálculo. Codifica S, K, I como sus definiciones lambda
|
|
67
|
+
// canónicas y deja las variables libres como variables. Útil para
|
|
68
|
+
// round-trip: el resultado, normalizado en λ, debe ser
|
|
69
|
+
// alpha-equivalente al término original aplicado a los mismos
|
|
70
|
+
// argumentos (la equivalencia es semántica, no sintáctica).
|
|
71
|
+
function toLambda(c) {
|
|
72
|
+
switch (c.kind) {
|
|
73
|
+
case 'I':
|
|
74
|
+
// I = λx.x
|
|
75
|
+
return (0, types_1.lam)('x', (0, types_1.v)('x'));
|
|
76
|
+
case 'K':
|
|
77
|
+
// K = λx.λy.x
|
|
78
|
+
return (0, types_1.lam)('x', (0, types_1.lam)('y', (0, types_1.v)('x')));
|
|
79
|
+
case 'S':
|
|
80
|
+
// S = λx.λy.λz. x z (y z)
|
|
81
|
+
return (0, types_1.lam)('x', (0, types_1.lam)('y', (0, types_1.lam)('z', (0, types_1.apN)((0, types_1.v)('x'), (0, types_1.v)('z'), (0, types_1.ap)((0, types_1.v)('y'), (0, types_1.v)('z'))))));
|
|
82
|
+
case 'var':
|
|
83
|
+
return (0, types_1.v)(c.name);
|
|
84
|
+
case 'app':
|
|
85
|
+
return (0, types_1.ap)(toLambda(c.fn), toLambda(c.arg));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=abstract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstract.js","sourceRoot":"","sources":["../../src/combinators-ski/abstract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { CTerm } from './types';
|
|
2
|
+
export { S, K, I, cvar, app, ctermEq, freeVars, termToString } from './types';
|
|
3
|
+
export { reduceStep, normalize, isNormalForm } from './reduce';
|
|
4
|
+
export type { NormalizeResult } from './reduce';
|
|
5
|
+
export { abstractFromLambda, toLambda } from './abstract';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/combinators-ski/index.ts"],"names":[],"mappings":"AAWA,YAAY,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE9E,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC/D,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// SKI combinatory logic — Punto de entrada público
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// API:
|
|
7
|
+
// - Tipos: CTerm
|
|
8
|
+
// - Constructores: S(), K(), I(), cvar, app
|
|
9
|
+
// - Estructura: ctermEq, freeVars, termToString
|
|
10
|
+
// - Reducción: reduceStep, normalize, isNormalForm, NormalizeResult
|
|
11
|
+
// - Bracket abstraction: abstractFromLambda, toLambda
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.toLambda = exports.abstractFromLambda = exports.isNormalForm = exports.normalize = exports.reduceStep = exports.termToString = exports.freeVars = exports.ctermEq = exports.app = exports.cvar = exports.I = exports.K = exports.S = void 0;
|
|
14
|
+
var types_1 = require("./types");
|
|
15
|
+
Object.defineProperty(exports, "S", { enumerable: true, get: function () { return types_1.S; } });
|
|
16
|
+
Object.defineProperty(exports, "K", { enumerable: true, get: function () { return types_1.K; } });
|
|
17
|
+
Object.defineProperty(exports, "I", { enumerable: true, get: function () { return types_1.I; } });
|
|
18
|
+
Object.defineProperty(exports, "cvar", { enumerable: true, get: function () { return types_1.cvar; } });
|
|
19
|
+
Object.defineProperty(exports, "app", { enumerable: true, get: function () { return types_1.app; } });
|
|
20
|
+
Object.defineProperty(exports, "ctermEq", { enumerable: true, get: function () { return types_1.ctermEq; } });
|
|
21
|
+
Object.defineProperty(exports, "freeVars", { enumerable: true, get: function () { return types_1.freeVars; } });
|
|
22
|
+
Object.defineProperty(exports, "termToString", { enumerable: true, get: function () { return types_1.termToString; } });
|
|
23
|
+
var reduce_1 = require("./reduce");
|
|
24
|
+
Object.defineProperty(exports, "reduceStep", { enumerable: true, get: function () { return reduce_1.reduceStep; } });
|
|
25
|
+
Object.defineProperty(exports, "normalize", { enumerable: true, get: function () { return reduce_1.normalize; } });
|
|
26
|
+
Object.defineProperty(exports, "isNormalForm", { enumerable: true, get: function () { return reduce_1.isNormalForm; } });
|
|
27
|
+
var abstract_1 = require("./abstract");
|
|
28
|
+
Object.defineProperty(exports, "abstractFromLambda", { enumerable: true, get: function () { return abstract_1.abstractFromLambda; } });
|
|
29
|
+
Object.defineProperty(exports, "toLambda", { enumerable: true, get: function () { return abstract_1.toLambda; } });
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/combinators-ski/index.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,mDAAmD;AACnD,+DAA+D;AAC/D,EAAE;AACF,OAAO;AACP,mBAAmB;AACnB,8CAA8C;AAC9C,kDAAkD;AAClD,sEAAsE;AACtE,wDAAwD;;;AAGxD,iCAA8E;AAArE,0FAAA,CAAC,OAAA;AAAE,0FAAA,CAAC,OAAA;AAAE,0FAAA,CAAC,OAAA;AAAE,6FAAA,IAAI,OAAA;AAAE,4FAAA,GAAG,OAAA;AAAE,gGAAA,OAAO,OAAA;AAAE,iGAAA,QAAQ,OAAA;AAAE,qGAAA,YAAY,OAAA;AAE5D,mCAA+D;AAAtD,oGAAA,UAAU,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,sGAAA,YAAY,OAAA;AAG5C,uCAA0D;AAAjD,8GAAA,kBAAkB,OAAA;AAAE,oGAAA,QAAQ,OAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CTerm } from './types';
|
|
2
|
+
export declare function reduceStep(t: CTerm): CTerm | null;
|
|
3
|
+
export interface NormalizeResult {
|
|
4
|
+
result: CTerm;
|
|
5
|
+
steps: number;
|
|
6
|
+
terminated: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function normalize(t: CTerm, maxSteps?: number): NormalizeResult;
|
|
9
|
+
export declare function isNormalForm(t: CTerm): boolean;
|
|
10
|
+
//# sourceMappingURL=reduce.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reduce.d.ts","sourceRoot":"","sources":["../../src/combinators-ski/reduce.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGrC,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,CAgBjD;AA2DD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;CACrB;AAKD,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,SAAO,GAAG,eAAe,CASpE;AAGD,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAE9C"}
|