@stevenvo780/st-lang 4.14.1 → 4.15.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/format/stnb/__tests__/executor.test.d.ts +2 -0
- package/dist/format/stnb/__tests__/executor.test.d.ts.map +1 -0
- package/dist/format/stnb/__tests__/executor.test.js +140 -0
- package/dist/format/stnb/__tests__/executor.test.js.map +1 -0
- package/dist/format/stnb/__tests__/parser.test.d.ts +2 -0
- package/dist/format/stnb/__tests__/parser.test.d.ts.map +1 -0
- package/dist/format/stnb/__tests__/parser.test.js +119 -0
- package/dist/format/stnb/__tests__/parser.test.js.map +1 -0
- package/dist/format/stnb/__tests__/renderer.test.d.ts +2 -0
- package/dist/format/stnb/__tests__/renderer.test.d.ts.map +1 -0
- package/dist/format/stnb/__tests__/renderer.test.js +109 -0
- package/dist/format/stnb/__tests__/renderer.test.js.map +1 -0
- package/dist/format/stnb/__tests__/roundtrip.test.d.ts +2 -0
- package/dist/format/stnb/__tests__/roundtrip.test.d.ts.map +1 -0
- package/dist/format/stnb/__tests__/roundtrip.test.js +91 -0
- package/dist/format/stnb/__tests__/roundtrip.test.js.map +1 -0
- package/dist/format/stnb/__tests__/serializer.test.d.ts +2 -0
- package/dist/format/stnb/__tests__/serializer.test.d.ts.map +1 -0
- package/dist/format/stnb/__tests__/serializer.test.js +60 -0
- package/dist/format/stnb/__tests__/serializer.test.js.map +1 -0
- package/dist/format/stnb/executor.d.ts +29 -0
- package/dist/format/stnb/executor.d.ts.map +1 -0
- package/dist/format/stnb/executor.js +139 -0
- package/dist/format/stnb/executor.js.map +1 -0
- package/dist/format/stnb/index.d.ts +19 -0
- package/dist/format/stnb/index.d.ts.map +1 -0
- package/dist/format/stnb/index.js +28 -0
- package/dist/format/stnb/index.js.map +1 -0
- package/dist/format/stnb/renderer-html.d.ts +11 -0
- package/dist/format/stnb/renderer-html.d.ts.map +1 -0
- package/dist/format/stnb/renderer-html.js +180 -0
- package/dist/format/stnb/renderer-html.js.map +1 -0
- package/dist/format/stnb/renderer-markdown.d.ts +13 -0
- package/dist/format/stnb/renderer-markdown.d.ts.map +1 -0
- package/dist/format/stnb/renderer-markdown.js +92 -0
- package/dist/format/stnb/renderer-markdown.js.map +1 -0
- package/dist/format/stnb/serializer.d.ts +14 -0
- package/dist/format/stnb/serializer.d.ts.map +1 -0
- package/dist/format/stnb/serializer.js +21 -0
- package/dist/format/stnb/serializer.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/logic/profiles/dl-hybrid/__tests__/differential.test.d.ts +2 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/differential.test.d.ts.map +1 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/differential.test.js +141 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/differential.test.js.map +1 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/examples.test.d.ts +2 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/examples.test.d.ts.map +1 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/examples.test.js +55 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/examples.test.js.map +1 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/parser.test.d.ts +2 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/parser.test.d.ts.map +1 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/parser.test.js +149 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/parser.test.js.map +1 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/tableau.test.d.ts +2 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/tableau.test.d.ts.map +1 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/tableau.test.js +105 -0
- package/dist/logic/profiles/dl-hybrid/__tests__/tableau.test.js.map +1 -0
- package/dist/logic/profiles/dl-hybrid/ast.d.ts +160 -0
- package/dist/logic/profiles/dl-hybrid/ast.d.ts.map +1 -0
- package/dist/logic/profiles/dl-hybrid/ast.js +261 -0
- package/dist/logic/profiles/dl-hybrid/ast.js.map +1 -0
- package/dist/logic/profiles/dl-hybrid/differential.d.ts +61 -0
- package/dist/logic/profiles/dl-hybrid/differential.d.ts.map +1 -0
- package/dist/logic/profiles/dl-hybrid/differential.js +291 -0
- package/dist/logic/profiles/dl-hybrid/differential.js.map +1 -0
- package/dist/logic/profiles/dl-hybrid/index.d.ts +10 -0
- package/dist/logic/profiles/dl-hybrid/index.d.ts.map +1 -0
- package/dist/logic/profiles/dl-hybrid/index.js +90 -0
- package/dist/logic/profiles/dl-hybrid/index.js.map +1 -0
- package/dist/logic/profiles/dl-hybrid/parser.d.ts +8 -0
- package/dist/logic/profiles/dl-hybrid/parser.d.ts.map +1 -0
- package/dist/logic/profiles/dl-hybrid/parser.js +410 -0
- package/dist/logic/profiles/dl-hybrid/parser.js.map +1 -0
- package/dist/logic/profiles/dl-hybrid/profile.d.ts +23 -0
- package/dist/logic/profiles/dl-hybrid/profile.d.ts.map +1 -0
- package/dist/logic/profiles/dl-hybrid/profile.js +122 -0
- package/dist/logic/profiles/dl-hybrid/profile.js.map +1 -0
- package/dist/logic/profiles/dl-hybrid/semantics.d.ts +16 -0
- package/dist/logic/profiles/dl-hybrid/semantics.d.ts.map +1 -0
- package/dist/logic/profiles/dl-hybrid/semantics.js +181 -0
- package/dist/logic/profiles/dl-hybrid/semantics.js.map +1 -0
- package/dist/logic/profiles/dl-hybrid/tableau.d.ts +38 -0
- package/dist/logic/profiles/dl-hybrid/tableau.d.ts.map +1 -0
- package/dist/logic/profiles/dl-hybrid/tableau.js +289 -0
- package/dist/logic/profiles/dl-hybrid/tableau.js.map +1 -0
- package/dist/reasoning/dl-hybrid/__tests__/invariant.test.d.ts +2 -0
- package/dist/reasoning/dl-hybrid/__tests__/invariant.test.d.ts.map +1 -0
- package/dist/reasoning/dl-hybrid/__tests__/invariant.test.js +74 -0
- package/dist/reasoning/dl-hybrid/__tests__/invariant.test.js.map +1 -0
- package/dist/reasoning/dl-hybrid/index.d.ts +3 -0
- package/dist/reasoning/dl-hybrid/index.d.ts.map +1 -0
- package/dist/reasoning/dl-hybrid/index.js +16 -0
- package/dist/reasoning/dl-hybrid/index.js.map +1 -0
- package/dist/reasoning/dl-hybrid/invariant-search.d.ts +39 -0
- package/dist/reasoning/dl-hybrid/invariant-search.d.ts.map +1 -0
- package/dist/reasoning/dl-hybrid/invariant-search.js +188 -0
- package/dist/reasoning/dl-hybrid/invariant-search.js.map +1 -0
- package/dist/reasoning/lemma-rag/__tests__/benchmarks.test.d.ts +2 -0
- package/dist/reasoning/lemma-rag/__tests__/benchmarks.test.d.ts.map +1 -0
- package/dist/reasoning/lemma-rag/__tests__/benchmarks.test.js +72 -0
- package/dist/reasoning/lemma-rag/__tests__/benchmarks.test.js.map +1 -0
- package/dist/reasoning/lemma-rag/__tests__/embedding.test.d.ts +2 -0
- package/dist/reasoning/lemma-rag/__tests__/embedding.test.d.ts.map +1 -0
- package/dist/reasoning/lemma-rag/__tests__/embedding.test.js +102 -0
- package/dist/reasoning/lemma-rag/__tests__/embedding.test.js.map +1 -0
- package/dist/reasoning/lemma-rag/__tests__/integration.test.d.ts +2 -0
- package/dist/reasoning/lemma-rag/__tests__/integration.test.d.ts.map +1 -0
- package/dist/reasoning/lemma-rag/__tests__/integration.test.js +40 -0
- package/dist/reasoning/lemma-rag/__tests__/integration.test.js.map +1 -0
- package/dist/reasoning/lemma-rag/__tests__/query.test.d.ts +2 -0
- package/dist/reasoning/lemma-rag/__tests__/query.test.d.ts.map +1 -0
- package/dist/reasoning/lemma-rag/__tests__/query.test.js +136 -0
- package/dist/reasoning/lemma-rag/__tests__/query.test.js.map +1 -0
- package/dist/reasoning/lemma-rag/__tests__/retrieval.test.d.ts +2 -0
- package/dist/reasoning/lemma-rag/__tests__/retrieval.test.d.ts.map +1 -0
- package/dist/reasoning/lemma-rag/__tests__/retrieval.test.js +147 -0
- package/dist/reasoning/lemma-rag/__tests__/retrieval.test.js.map +1 -0
- package/dist/reasoning/lemma-rag/benchmarks.d.ts +30 -0
- package/dist/reasoning/lemma-rag/benchmarks.d.ts.map +1 -0
- package/dist/reasoning/lemma-rag/benchmarks.js +177 -0
- package/dist/reasoning/lemma-rag/benchmarks.js.map +1 -0
- package/dist/reasoning/lemma-rag/embedding.d.ts +26 -0
- package/dist/reasoning/lemma-rag/embedding.d.ts.map +1 -0
- package/dist/reasoning/lemma-rag/embedding.js +243 -0
- package/dist/reasoning/lemma-rag/embedding.js.map +1 -0
- package/dist/reasoning/lemma-rag/index-store.d.ts +35 -0
- package/dist/reasoning/lemma-rag/index-store.d.ts.map +1 -0
- package/dist/reasoning/lemma-rag/index-store.js +105 -0
- package/dist/reasoning/lemma-rag/index-store.js.map +1 -0
- package/dist/reasoning/lemma-rag/index.d.ts +9 -0
- package/dist/reasoning/lemma-rag/index.d.ts.map +1 -0
- package/dist/reasoning/lemma-rag/index.js +34 -0
- package/dist/reasoning/lemma-rag/index.js.map +1 -0
- package/dist/reasoning/lemma-rag/query.d.ts +48 -0
- package/dist/reasoning/lemma-rag/query.d.ts.map +1 -0
- package/dist/reasoning/lemma-rag/query.js +92 -0
- package/dist/reasoning/lemma-rag/query.js.map +1 -0
- package/dist/reasoning/lemma-rag/retrieval.d.ts +33 -0
- package/dist/reasoning/lemma-rag/retrieval.d.ts.map +1 -0
- package/dist/reasoning/lemma-rag/retrieval.js +123 -0
- package/dist/reasoning/lemma-rag/retrieval.js.map +1 -0
- package/dist/reasoning/lemma-rag/types.d.ts +52 -0
- package/dist/reasoning/lemma-rag/types.d.ts.map +1 -0
- package/dist/reasoning/lemma-rag/types.js +13 -0
- package/dist/reasoning/lemma-rag/types.js.map +1 -0
- package/dist/reasoning/proof-mining/__tests__/extractor.test.d.ts +2 -0
- package/dist/reasoning/proof-mining/__tests__/extractor.test.d.ts.map +1 -0
- package/dist/reasoning/proof-mining/__tests__/extractor.test.js +263 -0
- package/dist/reasoning/proof-mining/__tests__/extractor.test.js.map +1 -0
- package/dist/reasoning/proof-mining/__tests__/generalizer.test.d.ts +2 -0
- package/dist/reasoning/proof-mining/__tests__/generalizer.test.d.ts.map +1 -0
- package/dist/reasoning/proof-mining/__tests__/generalizer.test.js +123 -0
- package/dist/reasoning/proof-mining/__tests__/generalizer.test.js.map +1 -0
- package/dist/reasoning/proof-mining/__tests__/integration.test.d.ts +2 -0
- package/dist/reasoning/proof-mining/__tests__/integration.test.d.ts.map +1 -0
- package/dist/reasoning/proof-mining/__tests__/integration.test.js +128 -0
- package/dist/reasoning/proof-mining/__tests__/integration.test.js.map +1 -0
- package/dist/reasoning/proof-mining/__tests__/persistence.test.d.ts +2 -0
- package/dist/reasoning/proof-mining/__tests__/persistence.test.d.ts.map +1 -0
- package/dist/reasoning/proof-mining/__tests__/persistence.test.js +119 -0
- package/dist/reasoning/proof-mining/__tests__/persistence.test.js.map +1 -0
- package/dist/reasoning/proof-mining/__tests__/ranker.test.d.ts +2 -0
- package/dist/reasoning/proof-mining/__tests__/ranker.test.d.ts.map +1 -0
- package/dist/reasoning/proof-mining/__tests__/ranker.test.js +93 -0
- package/dist/reasoning/proof-mining/__tests__/ranker.test.js.map +1 -0
- package/dist/reasoning/proof-mining/extractor.d.ts +73 -0
- package/dist/reasoning/proof-mining/extractor.d.ts.map +1 -0
- package/dist/reasoning/proof-mining/extractor.js +170 -0
- package/dist/reasoning/proof-mining/extractor.js.map +1 -0
- package/dist/reasoning/proof-mining/generalizer.d.ts +46 -0
- package/dist/reasoning/proof-mining/generalizer.d.ts.map +1 -0
- package/dist/reasoning/proof-mining/generalizer.js +245 -0
- package/dist/reasoning/proof-mining/generalizer.js.map +1 -0
- package/dist/reasoning/proof-mining/index.d.ts +62 -0
- package/dist/reasoning/proof-mining/index.d.ts.map +1 -0
- package/dist/reasoning/proof-mining/index.js +235 -0
- package/dist/reasoning/proof-mining/index.js.map +1 -0
- package/dist/reasoning/proof-mining/persistence.d.ts +35 -0
- package/dist/reasoning/proof-mining/persistence.d.ts.map +1 -0
- package/dist/reasoning/proof-mining/persistence.js +126 -0
- package/dist/reasoning/proof-mining/persistence.js.map +1 -0
- package/dist/reasoning/proof-mining/ranker.d.ts +29 -0
- package/dist/reasoning/proof-mining/ranker.d.ts.map +1 -0
- package/dist/reasoning/proof-mining/ranker.js +71 -0
- package/dist/reasoning/proof-mining/ranker.js.map +1 -0
- package/dist/reasoning/proof-mining/statistics.d.ts +11 -0
- package/dist/reasoning/proof-mining/statistics.d.ts.map +1 -0
- package/dist/reasoning/proof-mining/statistics.js +44 -0
- package/dist/reasoning/proof-mining/statistics.js.map +1 -0
- package/dist/reasoning/proof-mining/types.d.ts +117 -0
- package/dist/reasoning/proof-mining/types.d.ts.map +1 -0
- package/dist/reasoning/proof-mining/types.js +24 -0
- package/dist/reasoning/proof-mining/types.js.map +1 -0
- package/package.json +26 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrieval.d.ts","sourceRoot":"","sources":["../../../src/reasoning/lemma-rag/retrieval.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAOhD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAQnE;AAUD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CA6B1F;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,MAAM,CAGR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,SAAS,EACnB,KAAK,EAAE,UAAU,EACjB,CAAC,EAAE,MAAM,EACT,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,SAAI,GACX,WAAW,EAAE,CAoCf"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Retrieval — cosine similarity + BM25 hybrid scoring
|
|
4
|
+
//
|
|
5
|
+
// Implementa:
|
|
6
|
+
// - cosineSimilarity(a, b): dot product de vectores ya normalizados
|
|
7
|
+
// - bm25Score(query, doc, store): BM25 Okapi sobre el inverted index
|
|
8
|
+
// - hybridScore: 0.7 * cosine + 0.3 * bm25_normalizado
|
|
9
|
+
// ============================================================
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.cosineSimilarity = cosineSimilarity;
|
|
12
|
+
exports.bm25Score = bm25Score;
|
|
13
|
+
exports.hybridScore = hybridScore;
|
|
14
|
+
exports.retrieveTopK = retrieveTopK;
|
|
15
|
+
const tokenize_1 = require("../../tooling/lemma-library/tokenize");
|
|
16
|
+
// BM25 parámetros estándar
|
|
17
|
+
const BM25_K1 = 1.5;
|
|
18
|
+
const BM25_B = 0.75;
|
|
19
|
+
/**
|
|
20
|
+
* Cosine similarity entre dos vectores NORMALIZADOS (norma L2 = 1).
|
|
21
|
+
* En ese caso, es simplemente el producto punto.
|
|
22
|
+
* Devuelve un valor en [-1, 1], saturado a [0, 1] para usarse como score.
|
|
23
|
+
*/
|
|
24
|
+
function cosineSimilarity(a, b) {
|
|
25
|
+
if (a.length !== b.length)
|
|
26
|
+
return 0;
|
|
27
|
+
let dot = 0;
|
|
28
|
+
for (let i = 0; i < a.length; i++) {
|
|
29
|
+
dot += (a[i] ?? 0) * (b[i] ?? 0);
|
|
30
|
+
}
|
|
31
|
+
// saturar a [0, 1] — embeddings de texto raramente son negativos
|
|
32
|
+
return Math.max(0, Math.min(1, dot));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* IDF suavizado estándar: log((N - df + 0.5) / (df + 0.5) + 1)
|
|
36
|
+
* Siempre positivo.
|
|
37
|
+
*/
|
|
38
|
+
function idf(df, N) {
|
|
39
|
+
return Math.log((N - df + 0.5) / (df + 0.5) + 1);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* BM25 Okapi score de una query contra un documento en el store.
|
|
43
|
+
* Devuelve un score ≥ 0.
|
|
44
|
+
*/
|
|
45
|
+
function bm25Score(queryText, doc, store) {
|
|
46
|
+
const queryTokens = (0, tokenize_1.tokenize)(queryText);
|
|
47
|
+
if (queryTokens.length === 0)
|
|
48
|
+
return 0;
|
|
49
|
+
const N = store.totalDocs();
|
|
50
|
+
if (N === 0)
|
|
51
|
+
return 0;
|
|
52
|
+
const avgdl = store.avgDocLength();
|
|
53
|
+
const dl = doc.docLength;
|
|
54
|
+
let score = 0;
|
|
55
|
+
const seen = new Set();
|
|
56
|
+
for (const tok of queryTokens) {
|
|
57
|
+
if (seen.has(tok))
|
|
58
|
+
continue;
|
|
59
|
+
seen.add(tok);
|
|
60
|
+
const tf = doc.termFreq.get(tok) ?? 0;
|
|
61
|
+
if (tf === 0)
|
|
62
|
+
continue;
|
|
63
|
+
const df = store.getDocFreq(tok);
|
|
64
|
+
const termIdf = idf(df, N);
|
|
65
|
+
// BM25 TF component: tf * (k1 + 1) / (tf + k1 * (1 - b + b * dl/avgdl))
|
|
66
|
+
const tfComp = (tf * (BM25_K1 + 1)) / (tf + BM25_K1 * (1 - BM25_B + BM25_B * (dl / avgdl)));
|
|
67
|
+
score += termIdf * tfComp;
|
|
68
|
+
}
|
|
69
|
+
return score;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Score híbrido: `cosineWeight * cosine + (1 - cosineWeight) * bm25_norm`.
|
|
73
|
+
*
|
|
74
|
+
* BM25 se normaliza dividiendo por `maxBm25` (máximo observado en el batch).
|
|
75
|
+
* Si maxBm25 === 0, el componente BM25 aporta 0.
|
|
76
|
+
*/
|
|
77
|
+
function hybridScore(cosine, bm25, maxBm25, cosineWeight) {
|
|
78
|
+
const bm25Norm = maxBm25 > 0 ? bm25 / maxBm25 : 0;
|
|
79
|
+
return cosineWeight * cosine + (1 - cosineWeight) * bm25Norm;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Recupera los top-k lemas del store para una query dada.
|
|
83
|
+
*
|
|
84
|
+
* @param queryText - Texto de la query (fórmula o descripción)
|
|
85
|
+
* @param queryVec - Embedding pre-calculado de queryText
|
|
86
|
+
* @param store - IndexStore con los lemas indexados
|
|
87
|
+
* @param k - Número de resultados
|
|
88
|
+
* @param cosineWeight - Peso del componente cosine (default 0.7)
|
|
89
|
+
* @param domain - Filtro opcional de dominio
|
|
90
|
+
* @param minScore - Score mínimo para incluir
|
|
91
|
+
*/
|
|
92
|
+
function retrieveTopK(queryText, queryVec, store, k, cosineWeight, domain, minScore = 0) {
|
|
93
|
+
const candidates = domain ? store.byDomain(domain) : store.all();
|
|
94
|
+
if (candidates.length === 0)
|
|
95
|
+
return [];
|
|
96
|
+
// Paso 1: calcular scores individuales
|
|
97
|
+
const intermediate = [];
|
|
98
|
+
let maxBm25 = 0;
|
|
99
|
+
for (const entry of candidates) {
|
|
100
|
+
const cos = cosineSimilarity(queryVec, entry.embedding);
|
|
101
|
+
const bm = bm25Score(queryText, entry, store);
|
|
102
|
+
if (bm > maxBm25)
|
|
103
|
+
maxBm25 = bm;
|
|
104
|
+
intermediate.push({ entry, cosine: cos, bm25: bm });
|
|
105
|
+
}
|
|
106
|
+
// Paso 2: calcular score híbrido y filtrar
|
|
107
|
+
const results = [];
|
|
108
|
+
for (const { entry, cosine, bm25: bm } of intermediate) {
|
|
109
|
+
const score = hybridScore(cosine, bm, maxBm25, cosineWeight);
|
|
110
|
+
if (score >= minScore) {
|
|
111
|
+
results.push({
|
|
112
|
+
lemma: entry.lemma,
|
|
113
|
+
score,
|
|
114
|
+
cosineScore: cosine,
|
|
115
|
+
bm25Score: bm,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Paso 3: ordenar por score desc, desempate por id
|
|
120
|
+
results.sort((a, b) => b.score - a.score || a.lemma.id.localeCompare(b.lemma.id));
|
|
121
|
+
return results.slice(0, k);
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=retrieval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrieval.js","sourceRoot":"","sources":["../../../src/reasoning/lemma-rag/retrieval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { CuratedLemma } from '../../tooling/lemma-library/types';
|
|
2
|
+
/** Dimensión del espacio de embedding (R^DIM). */
|
|
3
|
+
export declare const EMBEDDING_DIM = 256;
|
|
4
|
+
/**
|
|
5
|
+
* Vector de embedding: arreglo de DIM floats en R^DIM.
|
|
6
|
+
* Siempre normalizado a norma 1 (L2) antes de ser usado en comparaciones.
|
|
7
|
+
*/
|
|
8
|
+
export type Embedding = Float32Array;
|
|
9
|
+
/** Lema con su embedding pre-calculado. */
|
|
10
|
+
export interface EmbeddedLemma {
|
|
11
|
+
lemma: CuratedLemma;
|
|
12
|
+
embedding: Embedding;
|
|
13
|
+
/** BM25 token bag para el componente léxico del scoring híbrido. */
|
|
14
|
+
termFreq: Map<string, number>;
|
|
15
|
+
/** Total de tokens en este documento (para BM25). */
|
|
16
|
+
docLength: number;
|
|
17
|
+
}
|
|
18
|
+
/** Un resultado de búsqueda con scores desglosados. */
|
|
19
|
+
export interface QueryResult {
|
|
20
|
+
lemma: CuratedLemma;
|
|
21
|
+
/** Score híbrido final: 0.7 * cosine + 0.3 * bm25 (normalizado). */
|
|
22
|
+
score: number;
|
|
23
|
+
/** Score cosine (0..1). */
|
|
24
|
+
cosineScore: number;
|
|
25
|
+
/** Score BM25 antes de normalización (≥ 0). */
|
|
26
|
+
bm25Score: number;
|
|
27
|
+
}
|
|
28
|
+
/** Opciones para la búsqueda RAG. */
|
|
29
|
+
export interface RAGOptions {
|
|
30
|
+
/** Top-k resultados a devolver (default 5). */
|
|
31
|
+
k?: number;
|
|
32
|
+
/** Peso del componente cosine en el score híbrido (default 0.7). */
|
|
33
|
+
cosineWeight?: number;
|
|
34
|
+
/** Filtrar por dominio antes de buscar. */
|
|
35
|
+
domain?: string;
|
|
36
|
+
/** Score mínimo para incluir un resultado (default 0). */
|
|
37
|
+
minScore?: number;
|
|
38
|
+
}
|
|
39
|
+
/** Provider de embeddings (interface para Stage 2). */
|
|
40
|
+
export interface EmbeddingProvider {
|
|
41
|
+
embed(text: string): Embedding;
|
|
42
|
+
dim: number;
|
|
43
|
+
}
|
|
44
|
+
/** Resultado del benchmark de recall. */
|
|
45
|
+
export interface RecallResult {
|
|
46
|
+
method: 'keyword' | 'embedding' | 'hybrid';
|
|
47
|
+
recallAt1: number;
|
|
48
|
+
recallAt3: number;
|
|
49
|
+
recallAt5: number;
|
|
50
|
+
totalPairs: number;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/reasoning/lemma-rag/types.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEtE,kDAAkD;AAClD,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,YAAY,CAAC;AAErC,2CAA2C;AAC3C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,oEAAoE;IACpE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,uDAAuD;AACvD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,+CAA+C;IAC/C,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// lemma-rag — Tipos públicos
|
|
4
|
+
//
|
|
5
|
+
// Tipos para el sistema RAG semántico sobre la biblioteca de lemas.
|
|
6
|
+
// Embeddings determinísticos basados en AST features (Stage 1).
|
|
7
|
+
// Stage 2 (ONNX transformers) pendiente de aprobación.
|
|
8
|
+
// ============================================================
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.EMBEDDING_DIM = void 0;
|
|
11
|
+
/** Dimensión del espacio de embedding (R^DIM). */
|
|
12
|
+
exports.EMBEDDING_DIM = 256;
|
|
13
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/reasoning/lemma-rag/types.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,6BAA6B;AAC7B,EAAE;AACF,oEAAoE;AACpE,gEAAgE;AAChE,uDAAuD;AACvD,+DAA+D;;;AAI/D,kDAAkD;AACrC,QAAA,aAAa,GAAG,GAAG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.test.d.ts","sourceRoot":"","sources":["../../../../src/reasoning/proof-mining/__tests__/extractor.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const extractor_1 = require("../extractor");
|
|
5
|
+
function trace(conclusion, steps, cost = 10, profile = 'classical', premises = []) {
|
|
6
|
+
return {
|
|
7
|
+
conclusion,
|
|
8
|
+
premises,
|
|
9
|
+
profile,
|
|
10
|
+
cost,
|
|
11
|
+
steps: steps.map(([rule, inputs, output, depth]) => ({
|
|
12
|
+
rule,
|
|
13
|
+
inputs,
|
|
14
|
+
output,
|
|
15
|
+
depth,
|
|
16
|
+
})),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
(0, vitest_1.describe)('extractSubtrees', () => {
|
|
20
|
+
(0, vitest_1.it)('devuelve array vacío si el proof no tiene pasos', () => {
|
|
21
|
+
const p = trace('X', []);
|
|
22
|
+
(0, vitest_1.expect)((0, extractor_1.extractSubtrees)(p, 'p1')).toEqual([]);
|
|
23
|
+
});
|
|
24
|
+
(0, vitest_1.it)('genera un sub-tree por paso del proof', () => {
|
|
25
|
+
const p = trace('X', [
|
|
26
|
+
['MP', ['A->B', 'A'], 'B', 0],
|
|
27
|
+
['axiom', [], 'A->B', 1],
|
|
28
|
+
['axiom', [], 'A', 1],
|
|
29
|
+
]);
|
|
30
|
+
const subs = (0, extractor_1.extractSubtrees)(p, 'p1');
|
|
31
|
+
(0, vitest_1.expect)(subs).toHaveLength(3);
|
|
32
|
+
});
|
|
33
|
+
(0, vitest_1.it)('el sub-tree raíz cubre todos los pasos', () => {
|
|
34
|
+
const p = trace('X', [
|
|
35
|
+
['MP', ['A->B', 'A'], 'B', 0],
|
|
36
|
+
['axiom', [], 'A->B', 1],
|
|
37
|
+
['axiom', [], 'A', 1],
|
|
38
|
+
]);
|
|
39
|
+
const root = (0, extractor_1.extractSubtrees)(p, 'p1')[0];
|
|
40
|
+
(0, vitest_1.expect)(root).toBeDefined();
|
|
41
|
+
(0, vitest_1.expect)(root?.steps).toHaveLength(3);
|
|
42
|
+
});
|
|
43
|
+
(0, vitest_1.it)('un sub-tree de hoja solo contiene un paso', () => {
|
|
44
|
+
const p = trace('X', [
|
|
45
|
+
['MP', ['A->B', 'A'], 'B', 0],
|
|
46
|
+
['axiom', [], 'A->B', 1],
|
|
47
|
+
['axiom', [], 'A', 1],
|
|
48
|
+
]);
|
|
49
|
+
const subs = (0, extractor_1.extractSubtrees)(p, 'p1');
|
|
50
|
+
const leaf = subs[2];
|
|
51
|
+
(0, vitest_1.expect)(leaf?.steps).toHaveLength(1);
|
|
52
|
+
(0, vitest_1.expect)(leaf?.steps[0]?.rule).toBe('axiom');
|
|
53
|
+
});
|
|
54
|
+
(0, vitest_1.it)('respeta el corte por depth cuando hay hermanos', () => {
|
|
55
|
+
// Árbol: A tiene hijos B y C; B tiene hijo D
|
|
56
|
+
// A(0)
|
|
57
|
+
// ├ B(1)
|
|
58
|
+
// │ └ D(2)
|
|
59
|
+
// └ C(1)
|
|
60
|
+
const p = trace('A', [
|
|
61
|
+
['rA', ['B', 'C'], 'A', 0],
|
|
62
|
+
['rB', ['D'], 'B', 1],
|
|
63
|
+
['rD', [], 'D', 2],
|
|
64
|
+
['rC', [], 'C', 1],
|
|
65
|
+
]);
|
|
66
|
+
const subs = (0, extractor_1.extractSubtrees)(p, 'p1');
|
|
67
|
+
// sub raíz en B: incluye B y D, no C
|
|
68
|
+
const subB = subs[1];
|
|
69
|
+
(0, vitest_1.expect)(subB?.steps.map((s) => s.output)).toEqual(['B', 'D']);
|
|
70
|
+
// sub raíz en C: solo C
|
|
71
|
+
const subC = subs[3];
|
|
72
|
+
(0, vitest_1.expect)(subC?.steps).toHaveLength(1);
|
|
73
|
+
(0, vitest_1.expect)(subC?.steps[0]?.output).toBe('C');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
(0, vitest_1.describe)('subtreeKey', () => {
|
|
77
|
+
(0, vitest_1.it)('asigna la misma clave a sub-trees estructuralmente idénticos', () => {
|
|
78
|
+
const p1 = trace('X', [
|
|
79
|
+
['MP', ['P->P', 'P'], 'P', 0],
|
|
80
|
+
['axiom', [], 'P->P', 1],
|
|
81
|
+
['axiom', [], 'P', 1],
|
|
82
|
+
]);
|
|
83
|
+
const p2 = trace('X', [
|
|
84
|
+
['MP', ['Q->Q', 'Q'], 'Q', 0],
|
|
85
|
+
['axiom', [], 'Q->Q', 1],
|
|
86
|
+
['axiom', [], 'Q', 1],
|
|
87
|
+
]);
|
|
88
|
+
const sub1 = (0, extractor_1.extractSubtrees)(p1, 'p1')[0];
|
|
89
|
+
const sub2 = (0, extractor_1.extractSubtrees)(p2, 'p2')[0];
|
|
90
|
+
(0, vitest_1.expect)(sub1).toBeDefined();
|
|
91
|
+
(0, vitest_1.expect)(sub2).toBeDefined();
|
|
92
|
+
(0, vitest_1.expect)((0, extractor_1.subtreeKey)(sub1)).toBe((0, extractor_1.subtreeKey)(sub2));
|
|
93
|
+
});
|
|
94
|
+
(0, vitest_1.it)('asigna distinta clave a sub-trees con distinta regla', () => {
|
|
95
|
+
const p1 = trace('X', [
|
|
96
|
+
['MP', ['A->B', 'A'], 'B', 0],
|
|
97
|
+
['axiom', [], 'A->B', 1],
|
|
98
|
+
['axiom', [], 'A', 1],
|
|
99
|
+
]);
|
|
100
|
+
const p2 = trace('X', [
|
|
101
|
+
['andI', ['A', 'B'], 'A and B', 0],
|
|
102
|
+
['axiom', [], 'A', 1],
|
|
103
|
+
['axiom', [], 'B', 1],
|
|
104
|
+
]);
|
|
105
|
+
(0, vitest_1.expect)((0, extractor_1.subtreeKey)((0, extractor_1.extractSubtrees)(p1, 'p1')[0])).not.toBe((0, extractor_1.subtreeKey)((0, extractor_1.extractSubtrees)(p2, 'p2')[0]));
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
(0, vitest_1.describe)('groupSubtrees', () => {
|
|
109
|
+
(0, vitest_1.it)('agrupa por clave canónica', () => {
|
|
110
|
+
const p1 = trace('X', [
|
|
111
|
+
['MP', ['P->P', 'P'], 'P', 0],
|
|
112
|
+
['axiom', [], 'P->P', 1],
|
|
113
|
+
['axiom', [], 'P', 1],
|
|
114
|
+
]);
|
|
115
|
+
const p2 = trace('X', [
|
|
116
|
+
['MP', ['R->R', 'R'], 'R', 0],
|
|
117
|
+
['axiom', [], 'R->R', 1],
|
|
118
|
+
['axiom', [], 'R', 1],
|
|
119
|
+
]);
|
|
120
|
+
const sub1 = (0, extractor_1.extractSubtrees)(p1, 'p1');
|
|
121
|
+
const sub2 = (0, extractor_1.extractSubtrees)(p2, 'p2');
|
|
122
|
+
const groups = (0, extractor_1.groupSubtrees)([...sub1, ...sub2]);
|
|
123
|
+
// los 3 sub-trees de p1 deberían tener al menos 1 par equivalente en p2
|
|
124
|
+
const sized3 = groups.filter((g) => g.members.length >= 2);
|
|
125
|
+
(0, vitest_1.expect)(sized3.length).toBeGreaterThan(0);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
(0, vitest_1.describe)('extractAuxiliaryLemmas', () => {
|
|
129
|
+
(0, vitest_1.it)('encuentra lemmas comunes a 2 proofs con misma estructura', () => {
|
|
130
|
+
const p1 = trace('X', [
|
|
131
|
+
['MP', ['P->P', 'P'], 'P', 0],
|
|
132
|
+
['axiom', [], 'P->P', 1],
|
|
133
|
+
['axiom', [], 'P', 1],
|
|
134
|
+
]);
|
|
135
|
+
const p2 = trace('Y', [
|
|
136
|
+
['MP', ['Q->Q', 'Q'], 'Q', 0],
|
|
137
|
+
['axiom', [], 'Q->Q', 1],
|
|
138
|
+
['axiom', [], 'Q', 1],
|
|
139
|
+
]);
|
|
140
|
+
const groups = (0, extractor_1.extractAuxiliaryLemmas)([p1, p2]);
|
|
141
|
+
(0, vitest_1.expect)(groups.length).toBeGreaterThan(0);
|
|
142
|
+
const root = groups.find((g) => g.members.some((m) => m.steps.length === 3));
|
|
143
|
+
(0, vitest_1.expect)(root).toBeDefined();
|
|
144
|
+
(0, vitest_1.expect)(root?.members.length).toBe(2);
|
|
145
|
+
});
|
|
146
|
+
(0, vitest_1.it)('respeta minReuseThreshold = 3 (no extrae si solo aparece 2 veces)', () => {
|
|
147
|
+
const p1 = trace('X', [
|
|
148
|
+
['MP', ['P->P', 'P'], 'P', 0],
|
|
149
|
+
['axiom', [], 'P->P', 1],
|
|
150
|
+
['axiom', [], 'P', 1],
|
|
151
|
+
]);
|
|
152
|
+
const p2 = trace('Y', [
|
|
153
|
+
['MP', ['Q->Q', 'Q'], 'Q', 0],
|
|
154
|
+
['axiom', [], 'Q->Q', 1],
|
|
155
|
+
['axiom', [], 'Q', 1],
|
|
156
|
+
]);
|
|
157
|
+
const groups = (0, extractor_1.extractAuxiliaryLemmas)([p1, p2], { minReuseThreshold: 3 });
|
|
158
|
+
(0, vitest_1.expect)(groups).toHaveLength(0);
|
|
159
|
+
});
|
|
160
|
+
(0, vitest_1.it)('respeta minSubtreeSize = 3 (filtra sub-trees pequeños)', () => {
|
|
161
|
+
const p1 = trace('X', [
|
|
162
|
+
['MP', ['A->B', 'A'], 'B', 0],
|
|
163
|
+
['axiom', [], 'A->B', 1],
|
|
164
|
+
]);
|
|
165
|
+
const p2 = trace('Y', [
|
|
166
|
+
['MP', ['C->D', 'C'], 'D', 0],
|
|
167
|
+
['axiom', [], 'C->D', 1],
|
|
168
|
+
]);
|
|
169
|
+
// Ningún sub-tree tiene >= 3 pasos.
|
|
170
|
+
const groups = (0, extractor_1.extractAuxiliaryLemmas)([p1, p2], { minSubtreeSize: 3 });
|
|
171
|
+
(0, vitest_1.expect)(groups).toHaveLength(0);
|
|
172
|
+
});
|
|
173
|
+
(0, vitest_1.it)('cuenta proofs distintos, no ocurrencias múltiples dentro del mismo proof', () => {
|
|
174
|
+
// Dos sub-trees idénticos dentro del MISMO proof no califican.
|
|
175
|
+
const p1 = trace('X', [
|
|
176
|
+
['andI', ['A=A', 'A=A'], '(A=A) and (A=A)', 0],
|
|
177
|
+
['refl', [], 'A=A', 1],
|
|
178
|
+
['refl', [], 'A=A', 1],
|
|
179
|
+
]);
|
|
180
|
+
const groups = (0, extractor_1.extractAuxiliaryLemmas)([p1], { minReuseThreshold: 2 });
|
|
181
|
+
(0, vitest_1.expect)(groups).toHaveLength(0);
|
|
182
|
+
});
|
|
183
|
+
(0, vitest_1.it)('extrae con 1 proof si minReuseThreshold = 1', () => {
|
|
184
|
+
const p1 = trace('X', [
|
|
185
|
+
['MP', ['A->B', 'A'], 'B', 0],
|
|
186
|
+
['axiom', [], 'A->B', 1],
|
|
187
|
+
['axiom', [], 'A', 1],
|
|
188
|
+
]);
|
|
189
|
+
const groups = (0, extractor_1.extractAuxiliaryLemmas)([p1], {
|
|
190
|
+
minReuseThreshold: 1,
|
|
191
|
+
minSubtreeSize: 2,
|
|
192
|
+
});
|
|
193
|
+
(0, vitest_1.expect)(groups.length).toBeGreaterThanOrEqual(1);
|
|
194
|
+
});
|
|
195
|
+
(0, vitest_1.it)('agrupa correctamente cuando 3 proofs comparten un sub-tree', () => {
|
|
196
|
+
const makeP = (label) => trace(label, [
|
|
197
|
+
['MP', [`${label}->${label}`, label], label, 0],
|
|
198
|
+
['axiom', [], `${label}->${label}`, 1],
|
|
199
|
+
['axiom', [], label, 1],
|
|
200
|
+
]);
|
|
201
|
+
const groups = (0, extractor_1.extractAuxiliaryLemmas)([makeP('P'), makeP('Q'), makeP('R')]);
|
|
202
|
+
// El sub-tree raíz debería tener 3 miembros (uno por proof).
|
|
203
|
+
const root = groups.find((g) => g.members.some((m) => m.steps.length === 3));
|
|
204
|
+
(0, vitest_1.expect)(root?.members.length).toBe(3);
|
|
205
|
+
});
|
|
206
|
+
(0, vitest_1.it)('proofs sin solapamiento estructural no producen lemmas', () => {
|
|
207
|
+
const p1 = trace('X', [
|
|
208
|
+
['MP', ['A->B', 'A'], 'B', 0],
|
|
209
|
+
['axiom', [], 'A->B', 1],
|
|
210
|
+
['axiom', [], 'A', 1],
|
|
211
|
+
]);
|
|
212
|
+
const p2 = trace('Y', [
|
|
213
|
+
['andE', ['A and B'], 'A', 0],
|
|
214
|
+
['axiom', [], 'A and B', 1],
|
|
215
|
+
]);
|
|
216
|
+
(0, vitest_1.expect)((0, extractor_1.extractAuxiliaryLemmas)([p1, p2])).toHaveLength(0);
|
|
217
|
+
});
|
|
218
|
+
(0, vitest_1.it)('asigna proofId automáticamente cuando el trace no trae id', () => {
|
|
219
|
+
const p1 = trace('X', [
|
|
220
|
+
['MP', ['P->P', 'P'], 'P', 0],
|
|
221
|
+
['axiom', [], 'P->P', 1],
|
|
222
|
+
['axiom', [], 'P', 1],
|
|
223
|
+
]);
|
|
224
|
+
const p2 = trace('Y', [
|
|
225
|
+
['MP', ['Q->Q', 'Q'], 'Q', 0],
|
|
226
|
+
['axiom', [], 'Q->Q', 1],
|
|
227
|
+
['axiom', [], 'Q', 1],
|
|
228
|
+
]);
|
|
229
|
+
const groups = (0, extractor_1.extractAuxiliaryLemmas)([p1, p2]);
|
|
230
|
+
const allIds = new Set();
|
|
231
|
+
for (const g of groups)
|
|
232
|
+
for (const m of g.members)
|
|
233
|
+
allIds.add(m.proofId);
|
|
234
|
+
(0, vitest_1.expect)(allIds.has('proof-0')).toBe(true);
|
|
235
|
+
(0, vitest_1.expect)(allIds.has('proof-1')).toBe(true);
|
|
236
|
+
});
|
|
237
|
+
(0, vitest_1.it)('respeta proofId explícito cuando se provee', () => {
|
|
238
|
+
const p1 = {
|
|
239
|
+
id: 'my-proof-A',
|
|
240
|
+
...trace('X', [
|
|
241
|
+
['MP', ['P->P', 'P'], 'P', 0],
|
|
242
|
+
['axiom', [], 'P->P', 1],
|
|
243
|
+
['axiom', [], 'P', 1],
|
|
244
|
+
]),
|
|
245
|
+
};
|
|
246
|
+
const p2 = {
|
|
247
|
+
id: 'my-proof-B',
|
|
248
|
+
...trace('Y', [
|
|
249
|
+
['MP', ['Q->Q', 'Q'], 'Q', 0],
|
|
250
|
+
['axiom', [], 'Q->Q', 1],
|
|
251
|
+
['axiom', [], 'Q', 1],
|
|
252
|
+
]),
|
|
253
|
+
};
|
|
254
|
+
const groups = (0, extractor_1.extractAuxiliaryLemmas)([p1, p2]);
|
|
255
|
+
const allIds = new Set();
|
|
256
|
+
for (const g of groups)
|
|
257
|
+
for (const m of g.members)
|
|
258
|
+
allIds.add(m.proofId);
|
|
259
|
+
(0, vitest_1.expect)(allIds.has('my-proof-A')).toBe(true);
|
|
260
|
+
(0, vitest_1.expect)(allIds.has('my-proof-B')).toBe(true);
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
//# sourceMappingURL=extractor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.test.js","sourceRoot":"","sources":["../../../../src/reasoning/proof-mining/__tests__/extractor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generalizer.test.d.ts","sourceRoot":"","sources":["../../../../src/reasoning/proof-mining/__tests__/generalizer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const generalizer_1 = require("../generalizer");
|
|
5
|
+
(0, vitest_1.describe)('generalizeFormulas', () => {
|
|
6
|
+
(0, vitest_1.it)('para 0 instancias devuelve string vacío', () => {
|
|
7
|
+
(0, vitest_1.expect)((0, generalizer_1.generalizeFormulas)([])).toEqual({
|
|
8
|
+
statement: '',
|
|
9
|
+
abstractionLevel: 0,
|
|
10
|
+
nonTrivial: false,
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
(0, vitest_1.it)('para 1 instancia devuelve el original sin abstracción', () => {
|
|
14
|
+
const r = (0, generalizer_1.generalizeFormulas)(['P -> P']);
|
|
15
|
+
(0, vitest_1.expect)(r.statement).toBe('P -> P');
|
|
16
|
+
(0, vitest_1.expect)(r.abstractionLevel).toBe(0);
|
|
17
|
+
(0, vitest_1.expect)(r.nonTrivial).toBe(false);
|
|
18
|
+
});
|
|
19
|
+
(0, vitest_1.it)('P->P y Q->Q producen ?0 -> ?0', () => {
|
|
20
|
+
const r = (0, generalizer_1.generalizeFormulas)(['P -> P', 'Q -> Q']);
|
|
21
|
+
(0, vitest_1.expect)(r.abstractionLevel).toBe(1);
|
|
22
|
+
(0, vitest_1.expect)(r.nonTrivial).toBe(true);
|
|
23
|
+
(0, vitest_1.expect)(r.statement).toContain('->');
|
|
24
|
+
// Debería contener el mismo placeholder dos veces (reflexividad).
|
|
25
|
+
const matches = r.statement.match(/\?0/g);
|
|
26
|
+
(0, vitest_1.expect)(matches?.length).toBe(2);
|
|
27
|
+
});
|
|
28
|
+
(0, vitest_1.it)('P->Q y R->S producen ?0 -> ?1', () => {
|
|
29
|
+
const r = (0, generalizer_1.generalizeFormulas)(['P -> Q', 'R -> S']);
|
|
30
|
+
(0, vitest_1.expect)(r.abstractionLevel).toBe(2);
|
|
31
|
+
(0, vitest_1.expect)(r.nonTrivial).toBe(true);
|
|
32
|
+
(0, vitest_1.expect)(r.statement).toMatch(/\?0/);
|
|
33
|
+
(0, vitest_1.expect)(r.statement).toMatch(/\?1/);
|
|
34
|
+
});
|
|
35
|
+
(0, vitest_1.it)('instancias idénticas no introducen abstracción', () => {
|
|
36
|
+
const r = (0, generalizer_1.generalizeFormulas)(['P -> P', 'P -> P']);
|
|
37
|
+
(0, vitest_1.expect)(r.abstractionLevel).toBe(0);
|
|
38
|
+
(0, vitest_1.expect)(r.nonTrivial).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.it)('desacuerdos en operadores no son generalizables (fallback al literal)', () => {
|
|
41
|
+
const r = (0, generalizer_1.generalizeFormulas)(['P and Q', 'P or Q']);
|
|
42
|
+
(0, vitest_1.expect)(r.nonTrivial).toBe(false);
|
|
43
|
+
(0, vitest_1.expect)(r.statement).toBe('P and Q');
|
|
44
|
+
});
|
|
45
|
+
(0, vitest_1.it)('arrays de tokens de distinta longitud caen al primer literal', () => {
|
|
46
|
+
const r = (0, generalizer_1.generalizeFormulas)(['P', 'P -> P']);
|
|
47
|
+
(0, vitest_1.expect)(r.nonTrivial).toBe(false);
|
|
48
|
+
(0, vitest_1.expect)(r.statement).toBe('P');
|
|
49
|
+
});
|
|
50
|
+
(0, vitest_1.it)('mantiene operadores como tokens literales en el patrón', () => {
|
|
51
|
+
const r = (0, generalizer_1.generalizeFormulas)(['P -> Q', 'A -> B']);
|
|
52
|
+
(0, vitest_1.expect)(r.statement).toContain('->');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.describe)('generalizeLemma', () => {
|
|
56
|
+
(0, vitest_1.it)('respeta maxAbstractionLevel', () => {
|
|
57
|
+
const r = (0, generalizer_1.generalizeLemma)(['f(a, b, c)', 'f(x, y, z)'], { maxAbstractionLevel: 2 });
|
|
58
|
+
// Necesitaríamos 3 fresh vars; con cap = 2 cae al literal.
|
|
59
|
+
(0, vitest_1.expect)(r.abstractionLevel).toBe(0);
|
|
60
|
+
(0, vitest_1.expect)(r.statement).toBe('f(a, b, c)');
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.it)('preserveSemantic = true no rechaza generalizaciones válidas', () => {
|
|
63
|
+
const r = (0, generalizer_1.generalizeLemma)(['P -> P', 'Q -> Q'], {
|
|
64
|
+
preserveSemantic: true,
|
|
65
|
+
maxAbstractionLevel: 5,
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.expect)(r.nonTrivial).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
(0, vitest_1.it)('opciones por defecto producen abstracción si es no-trivial', () => {
|
|
70
|
+
const r = (0, generalizer_1.generalizeLemma)(['P -> P', 'Q -> Q']);
|
|
71
|
+
(0, vitest_1.expect)(r.abstractionLevel).toBeGreaterThan(0);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
(0, vitest_1.describe)('generalizeTerms', () => {
|
|
75
|
+
(0, vitest_1.it)('para 0 terms devuelve vacío', () => {
|
|
76
|
+
(0, vitest_1.expect)((0, generalizer_1.generalizeTerms)([])).toEqual({
|
|
77
|
+
statement: '',
|
|
78
|
+
abstractionLevel: 0,
|
|
79
|
+
nonTrivial: false,
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
(0, vitest_1.it)('para 1 term devuelve el original sin abstracción', () => {
|
|
83
|
+
const t = { kind: 'const', name: 'a' };
|
|
84
|
+
const r = (0, generalizer_1.generalizeTerms)([t]);
|
|
85
|
+
(0, vitest_1.expect)(r.statement).toBe('a');
|
|
86
|
+
(0, vitest_1.expect)(r.abstractionLevel).toBe(0);
|
|
87
|
+
});
|
|
88
|
+
(0, vitest_1.it)('lgg de p(a) y p(b) introduce variable fresca', () => {
|
|
89
|
+
const t1 = { kind: 'func', name: 'p', args: [{ kind: 'const', name: 'a' }] };
|
|
90
|
+
const t2 = { kind: 'func', name: 'p', args: [{ kind: 'const', name: 'b' }] };
|
|
91
|
+
const r = (0, generalizer_1.generalizeTerms)([t1, t2]);
|
|
92
|
+
(0, vitest_1.expect)(r.abstractionLevel).toBe(1);
|
|
93
|
+
(0, vitest_1.expect)(r.statement).toMatch(/^p\(/);
|
|
94
|
+
});
|
|
95
|
+
(0, vitest_1.it)('lgg de términos idénticos no introduce abstracción', () => {
|
|
96
|
+
const t1 = { kind: 'const', name: 'a' };
|
|
97
|
+
const t2 = { kind: 'const', name: 'a' };
|
|
98
|
+
const r = (0, generalizer_1.generalizeTerms)([t1, t2]);
|
|
99
|
+
(0, vitest_1.expect)(r.abstractionLevel).toBe(0);
|
|
100
|
+
});
|
|
101
|
+
(0, vitest_1.it)('lgg de p(a,a) y p(b,b) reusa la misma fresh var', () => {
|
|
102
|
+
const t1 = {
|
|
103
|
+
kind: 'func',
|
|
104
|
+
name: 'p',
|
|
105
|
+
args: [
|
|
106
|
+
{ kind: 'const', name: 'a' },
|
|
107
|
+
{ kind: 'const', name: 'a' },
|
|
108
|
+
],
|
|
109
|
+
};
|
|
110
|
+
const t2 = {
|
|
111
|
+
kind: 'func',
|
|
112
|
+
name: 'p',
|
|
113
|
+
args: [
|
|
114
|
+
{ kind: 'const', name: 'b' },
|
|
115
|
+
{ kind: 'const', name: 'b' },
|
|
116
|
+
],
|
|
117
|
+
};
|
|
118
|
+
const r = (0, generalizer_1.generalizeTerms)([t1, t2]);
|
|
119
|
+
// Idealmente abstractionLevel = 1 (una sola fresh var reusada).
|
|
120
|
+
(0, vitest_1.expect)(r.abstractionLevel).toBe(1);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=generalizer.test.js.map
|