@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.
Files changed (197) hide show
  1. package/dist/format/stnb/__tests__/executor.test.d.ts +2 -0
  2. package/dist/format/stnb/__tests__/executor.test.d.ts.map +1 -0
  3. package/dist/format/stnb/__tests__/executor.test.js +140 -0
  4. package/dist/format/stnb/__tests__/executor.test.js.map +1 -0
  5. package/dist/format/stnb/__tests__/parser.test.d.ts +2 -0
  6. package/dist/format/stnb/__tests__/parser.test.d.ts.map +1 -0
  7. package/dist/format/stnb/__tests__/parser.test.js +119 -0
  8. package/dist/format/stnb/__tests__/parser.test.js.map +1 -0
  9. package/dist/format/stnb/__tests__/renderer.test.d.ts +2 -0
  10. package/dist/format/stnb/__tests__/renderer.test.d.ts.map +1 -0
  11. package/dist/format/stnb/__tests__/renderer.test.js +109 -0
  12. package/dist/format/stnb/__tests__/renderer.test.js.map +1 -0
  13. package/dist/format/stnb/__tests__/roundtrip.test.d.ts +2 -0
  14. package/dist/format/stnb/__tests__/roundtrip.test.d.ts.map +1 -0
  15. package/dist/format/stnb/__tests__/roundtrip.test.js +91 -0
  16. package/dist/format/stnb/__tests__/roundtrip.test.js.map +1 -0
  17. package/dist/format/stnb/__tests__/serializer.test.d.ts +2 -0
  18. package/dist/format/stnb/__tests__/serializer.test.d.ts.map +1 -0
  19. package/dist/format/stnb/__tests__/serializer.test.js +60 -0
  20. package/dist/format/stnb/__tests__/serializer.test.js.map +1 -0
  21. package/dist/format/stnb/executor.d.ts +29 -0
  22. package/dist/format/stnb/executor.d.ts.map +1 -0
  23. package/dist/format/stnb/executor.js +139 -0
  24. package/dist/format/stnb/executor.js.map +1 -0
  25. package/dist/format/stnb/index.d.ts +19 -0
  26. package/dist/format/stnb/index.d.ts.map +1 -0
  27. package/dist/format/stnb/index.js +28 -0
  28. package/dist/format/stnb/index.js.map +1 -0
  29. package/dist/format/stnb/renderer-html.d.ts +11 -0
  30. package/dist/format/stnb/renderer-html.d.ts.map +1 -0
  31. package/dist/format/stnb/renderer-html.js +180 -0
  32. package/dist/format/stnb/renderer-html.js.map +1 -0
  33. package/dist/format/stnb/renderer-markdown.d.ts +13 -0
  34. package/dist/format/stnb/renderer-markdown.d.ts.map +1 -0
  35. package/dist/format/stnb/renderer-markdown.js +92 -0
  36. package/dist/format/stnb/renderer-markdown.js.map +1 -0
  37. package/dist/format/stnb/serializer.d.ts +14 -0
  38. package/dist/format/stnb/serializer.d.ts.map +1 -0
  39. package/dist/format/stnb/serializer.js +21 -0
  40. package/dist/format/stnb/serializer.js.map +1 -0
  41. package/dist/index.d.ts +5 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +7 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/logic/profiles/dl-hybrid/__tests__/differential.test.d.ts +2 -0
  46. package/dist/logic/profiles/dl-hybrid/__tests__/differential.test.d.ts.map +1 -0
  47. package/dist/logic/profiles/dl-hybrid/__tests__/differential.test.js +141 -0
  48. package/dist/logic/profiles/dl-hybrid/__tests__/differential.test.js.map +1 -0
  49. package/dist/logic/profiles/dl-hybrid/__tests__/examples.test.d.ts +2 -0
  50. package/dist/logic/profiles/dl-hybrid/__tests__/examples.test.d.ts.map +1 -0
  51. package/dist/logic/profiles/dl-hybrid/__tests__/examples.test.js +55 -0
  52. package/dist/logic/profiles/dl-hybrid/__tests__/examples.test.js.map +1 -0
  53. package/dist/logic/profiles/dl-hybrid/__tests__/parser.test.d.ts +2 -0
  54. package/dist/logic/profiles/dl-hybrid/__tests__/parser.test.d.ts.map +1 -0
  55. package/dist/logic/profiles/dl-hybrid/__tests__/parser.test.js +149 -0
  56. package/dist/logic/profiles/dl-hybrid/__tests__/parser.test.js.map +1 -0
  57. package/dist/logic/profiles/dl-hybrid/__tests__/tableau.test.d.ts +2 -0
  58. package/dist/logic/profiles/dl-hybrid/__tests__/tableau.test.d.ts.map +1 -0
  59. package/dist/logic/profiles/dl-hybrid/__tests__/tableau.test.js +105 -0
  60. package/dist/logic/profiles/dl-hybrid/__tests__/tableau.test.js.map +1 -0
  61. package/dist/logic/profiles/dl-hybrid/ast.d.ts +160 -0
  62. package/dist/logic/profiles/dl-hybrid/ast.d.ts.map +1 -0
  63. package/dist/logic/profiles/dl-hybrid/ast.js +261 -0
  64. package/dist/logic/profiles/dl-hybrid/ast.js.map +1 -0
  65. package/dist/logic/profiles/dl-hybrid/differential.d.ts +61 -0
  66. package/dist/logic/profiles/dl-hybrid/differential.d.ts.map +1 -0
  67. package/dist/logic/profiles/dl-hybrid/differential.js +291 -0
  68. package/dist/logic/profiles/dl-hybrid/differential.js.map +1 -0
  69. package/dist/logic/profiles/dl-hybrid/index.d.ts +10 -0
  70. package/dist/logic/profiles/dl-hybrid/index.d.ts.map +1 -0
  71. package/dist/logic/profiles/dl-hybrid/index.js +90 -0
  72. package/dist/logic/profiles/dl-hybrid/index.js.map +1 -0
  73. package/dist/logic/profiles/dl-hybrid/parser.d.ts +8 -0
  74. package/dist/logic/profiles/dl-hybrid/parser.d.ts.map +1 -0
  75. package/dist/logic/profiles/dl-hybrid/parser.js +410 -0
  76. package/dist/logic/profiles/dl-hybrid/parser.js.map +1 -0
  77. package/dist/logic/profiles/dl-hybrid/profile.d.ts +23 -0
  78. package/dist/logic/profiles/dl-hybrid/profile.d.ts.map +1 -0
  79. package/dist/logic/profiles/dl-hybrid/profile.js +122 -0
  80. package/dist/logic/profiles/dl-hybrid/profile.js.map +1 -0
  81. package/dist/logic/profiles/dl-hybrid/semantics.d.ts +16 -0
  82. package/dist/logic/profiles/dl-hybrid/semantics.d.ts.map +1 -0
  83. package/dist/logic/profiles/dl-hybrid/semantics.js +181 -0
  84. package/dist/logic/profiles/dl-hybrid/semantics.js.map +1 -0
  85. package/dist/logic/profiles/dl-hybrid/tableau.d.ts +38 -0
  86. package/dist/logic/profiles/dl-hybrid/tableau.d.ts.map +1 -0
  87. package/dist/logic/profiles/dl-hybrid/tableau.js +289 -0
  88. package/dist/logic/profiles/dl-hybrid/tableau.js.map +1 -0
  89. package/dist/reasoning/dl-hybrid/__tests__/invariant.test.d.ts +2 -0
  90. package/dist/reasoning/dl-hybrid/__tests__/invariant.test.d.ts.map +1 -0
  91. package/dist/reasoning/dl-hybrid/__tests__/invariant.test.js +74 -0
  92. package/dist/reasoning/dl-hybrid/__tests__/invariant.test.js.map +1 -0
  93. package/dist/reasoning/dl-hybrid/index.d.ts +3 -0
  94. package/dist/reasoning/dl-hybrid/index.d.ts.map +1 -0
  95. package/dist/reasoning/dl-hybrid/index.js +16 -0
  96. package/dist/reasoning/dl-hybrid/index.js.map +1 -0
  97. package/dist/reasoning/dl-hybrid/invariant-search.d.ts +39 -0
  98. package/dist/reasoning/dl-hybrid/invariant-search.d.ts.map +1 -0
  99. package/dist/reasoning/dl-hybrid/invariant-search.js +188 -0
  100. package/dist/reasoning/dl-hybrid/invariant-search.js.map +1 -0
  101. package/dist/reasoning/lemma-rag/__tests__/benchmarks.test.d.ts +2 -0
  102. package/dist/reasoning/lemma-rag/__tests__/benchmarks.test.d.ts.map +1 -0
  103. package/dist/reasoning/lemma-rag/__tests__/benchmarks.test.js +72 -0
  104. package/dist/reasoning/lemma-rag/__tests__/benchmarks.test.js.map +1 -0
  105. package/dist/reasoning/lemma-rag/__tests__/embedding.test.d.ts +2 -0
  106. package/dist/reasoning/lemma-rag/__tests__/embedding.test.d.ts.map +1 -0
  107. package/dist/reasoning/lemma-rag/__tests__/embedding.test.js +102 -0
  108. package/dist/reasoning/lemma-rag/__tests__/embedding.test.js.map +1 -0
  109. package/dist/reasoning/lemma-rag/__tests__/integration.test.d.ts +2 -0
  110. package/dist/reasoning/lemma-rag/__tests__/integration.test.d.ts.map +1 -0
  111. package/dist/reasoning/lemma-rag/__tests__/integration.test.js +40 -0
  112. package/dist/reasoning/lemma-rag/__tests__/integration.test.js.map +1 -0
  113. package/dist/reasoning/lemma-rag/__tests__/query.test.d.ts +2 -0
  114. package/dist/reasoning/lemma-rag/__tests__/query.test.d.ts.map +1 -0
  115. package/dist/reasoning/lemma-rag/__tests__/query.test.js +136 -0
  116. package/dist/reasoning/lemma-rag/__tests__/query.test.js.map +1 -0
  117. package/dist/reasoning/lemma-rag/__tests__/retrieval.test.d.ts +2 -0
  118. package/dist/reasoning/lemma-rag/__tests__/retrieval.test.d.ts.map +1 -0
  119. package/dist/reasoning/lemma-rag/__tests__/retrieval.test.js +147 -0
  120. package/dist/reasoning/lemma-rag/__tests__/retrieval.test.js.map +1 -0
  121. package/dist/reasoning/lemma-rag/benchmarks.d.ts +30 -0
  122. package/dist/reasoning/lemma-rag/benchmarks.d.ts.map +1 -0
  123. package/dist/reasoning/lemma-rag/benchmarks.js +177 -0
  124. package/dist/reasoning/lemma-rag/benchmarks.js.map +1 -0
  125. package/dist/reasoning/lemma-rag/embedding.d.ts +26 -0
  126. package/dist/reasoning/lemma-rag/embedding.d.ts.map +1 -0
  127. package/dist/reasoning/lemma-rag/embedding.js +243 -0
  128. package/dist/reasoning/lemma-rag/embedding.js.map +1 -0
  129. package/dist/reasoning/lemma-rag/index-store.d.ts +35 -0
  130. package/dist/reasoning/lemma-rag/index-store.d.ts.map +1 -0
  131. package/dist/reasoning/lemma-rag/index-store.js +105 -0
  132. package/dist/reasoning/lemma-rag/index-store.js.map +1 -0
  133. package/dist/reasoning/lemma-rag/index.d.ts +9 -0
  134. package/dist/reasoning/lemma-rag/index.d.ts.map +1 -0
  135. package/dist/reasoning/lemma-rag/index.js +34 -0
  136. package/dist/reasoning/lemma-rag/index.js.map +1 -0
  137. package/dist/reasoning/lemma-rag/query.d.ts +48 -0
  138. package/dist/reasoning/lemma-rag/query.d.ts.map +1 -0
  139. package/dist/reasoning/lemma-rag/query.js +92 -0
  140. package/dist/reasoning/lemma-rag/query.js.map +1 -0
  141. package/dist/reasoning/lemma-rag/retrieval.d.ts +33 -0
  142. package/dist/reasoning/lemma-rag/retrieval.d.ts.map +1 -0
  143. package/dist/reasoning/lemma-rag/retrieval.js +123 -0
  144. package/dist/reasoning/lemma-rag/retrieval.js.map +1 -0
  145. package/dist/reasoning/lemma-rag/types.d.ts +52 -0
  146. package/dist/reasoning/lemma-rag/types.d.ts.map +1 -0
  147. package/dist/reasoning/lemma-rag/types.js +13 -0
  148. package/dist/reasoning/lemma-rag/types.js.map +1 -0
  149. package/dist/reasoning/proof-mining/__tests__/extractor.test.d.ts +2 -0
  150. package/dist/reasoning/proof-mining/__tests__/extractor.test.d.ts.map +1 -0
  151. package/dist/reasoning/proof-mining/__tests__/extractor.test.js +263 -0
  152. package/dist/reasoning/proof-mining/__tests__/extractor.test.js.map +1 -0
  153. package/dist/reasoning/proof-mining/__tests__/generalizer.test.d.ts +2 -0
  154. package/dist/reasoning/proof-mining/__tests__/generalizer.test.d.ts.map +1 -0
  155. package/dist/reasoning/proof-mining/__tests__/generalizer.test.js +123 -0
  156. package/dist/reasoning/proof-mining/__tests__/generalizer.test.js.map +1 -0
  157. package/dist/reasoning/proof-mining/__tests__/integration.test.d.ts +2 -0
  158. package/dist/reasoning/proof-mining/__tests__/integration.test.d.ts.map +1 -0
  159. package/dist/reasoning/proof-mining/__tests__/integration.test.js +128 -0
  160. package/dist/reasoning/proof-mining/__tests__/integration.test.js.map +1 -0
  161. package/dist/reasoning/proof-mining/__tests__/persistence.test.d.ts +2 -0
  162. package/dist/reasoning/proof-mining/__tests__/persistence.test.d.ts.map +1 -0
  163. package/dist/reasoning/proof-mining/__tests__/persistence.test.js +119 -0
  164. package/dist/reasoning/proof-mining/__tests__/persistence.test.js.map +1 -0
  165. package/dist/reasoning/proof-mining/__tests__/ranker.test.d.ts +2 -0
  166. package/dist/reasoning/proof-mining/__tests__/ranker.test.d.ts.map +1 -0
  167. package/dist/reasoning/proof-mining/__tests__/ranker.test.js +93 -0
  168. package/dist/reasoning/proof-mining/__tests__/ranker.test.js.map +1 -0
  169. package/dist/reasoning/proof-mining/extractor.d.ts +73 -0
  170. package/dist/reasoning/proof-mining/extractor.d.ts.map +1 -0
  171. package/dist/reasoning/proof-mining/extractor.js +170 -0
  172. package/dist/reasoning/proof-mining/extractor.js.map +1 -0
  173. package/dist/reasoning/proof-mining/generalizer.d.ts +46 -0
  174. package/dist/reasoning/proof-mining/generalizer.d.ts.map +1 -0
  175. package/dist/reasoning/proof-mining/generalizer.js +245 -0
  176. package/dist/reasoning/proof-mining/generalizer.js.map +1 -0
  177. package/dist/reasoning/proof-mining/index.d.ts +62 -0
  178. package/dist/reasoning/proof-mining/index.d.ts.map +1 -0
  179. package/dist/reasoning/proof-mining/index.js +235 -0
  180. package/dist/reasoning/proof-mining/index.js.map +1 -0
  181. package/dist/reasoning/proof-mining/persistence.d.ts +35 -0
  182. package/dist/reasoning/proof-mining/persistence.d.ts.map +1 -0
  183. package/dist/reasoning/proof-mining/persistence.js +126 -0
  184. package/dist/reasoning/proof-mining/persistence.js.map +1 -0
  185. package/dist/reasoning/proof-mining/ranker.d.ts +29 -0
  186. package/dist/reasoning/proof-mining/ranker.d.ts.map +1 -0
  187. package/dist/reasoning/proof-mining/ranker.js +71 -0
  188. package/dist/reasoning/proof-mining/ranker.js.map +1 -0
  189. package/dist/reasoning/proof-mining/statistics.d.ts +11 -0
  190. package/dist/reasoning/proof-mining/statistics.d.ts.map +1 -0
  191. package/dist/reasoning/proof-mining/statistics.js +44 -0
  192. package/dist/reasoning/proof-mining/statistics.js.map +1 -0
  193. package/dist/reasoning/proof-mining/types.d.ts +117 -0
  194. package/dist/reasoning/proof-mining/types.d.ts.map +1 -0
  195. package/dist/reasoning/proof-mining/types.js +24 -0
  196. package/dist/reasoning/proof-mining/types.js.map +1 -0
  197. package/package.json +26 -1
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // ST dL-Hybrid — Semántica concreta (interpretación de términos y fórmulas)
4
+ // ============================================================
5
+ // Funciones puras que dan significado a términos y fórmulas dL sobre un
6
+ // estado concreto `State = Map<varName, value: number>`. Esta capa NO
7
+ // decide validez universal; sólo evalúa con valores concretos. La capa
8
+ // `tableau.ts` la usa para chequear contramodelos y propagar estados a
9
+ // través de programas híbridos.
10
+ //
11
+ // Convenciones:
12
+ // • División por cero → NaN (la comparación con NaN cae al lado false).
13
+ // • Comparación = sobre flotantes usa tolerancia EPS = 1e-9.
14
+ // • Una variable no presente en el estado se interpreta como 0.
15
+ // ============================================================
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.evalTerm = evalTerm;
18
+ exports.evalComp = evalComp;
19
+ exports.evalQuantifierFree = evalQuantifierFree;
20
+ exports.substTerm = substTerm;
21
+ exports.substFormula = substFormula;
22
+ const EPS = 1e-9;
23
+ /** Evalúa un término sobre un estado concreto. */
24
+ function evalTerm(t, s) {
25
+ switch (t.kind) {
26
+ case 'num':
27
+ return t.value;
28
+ case 'var':
29
+ return s.get(t.name) ?? 0;
30
+ case 'plus':
31
+ return evalTerm(t.left, s) + evalTerm(t.right, s);
32
+ case 'minus':
33
+ return evalTerm(t.left, s) - evalTerm(t.right, s);
34
+ case 'times':
35
+ return evalTerm(t.left, s) * evalTerm(t.right, s);
36
+ case 'div': {
37
+ const den = evalTerm(t.right, s);
38
+ if (Math.abs(den) < EPS)
39
+ return NaN;
40
+ return evalTerm(t.left, s) / den;
41
+ }
42
+ case 'neg':
43
+ return -evalTerm(t.arg, s);
44
+ case 'pow': {
45
+ const b = evalTerm(t.base, s);
46
+ return Math.pow(b, t.exp);
47
+ }
48
+ }
49
+ }
50
+ /** Evalúa una comparación con tolerancia. */
51
+ function evalComp(op, a, b) {
52
+ if (Number.isNaN(a) || Number.isNaN(b))
53
+ return false;
54
+ switch (op) {
55
+ case '=':
56
+ return Math.abs(a - b) < EPS;
57
+ case '!=':
58
+ return Math.abs(a - b) >= EPS;
59
+ case '<':
60
+ return a < b - EPS;
61
+ case '<=':
62
+ return a <= b + EPS;
63
+ case '>':
64
+ return a > b + EPS;
65
+ case '>=':
66
+ return a >= b - EPS;
67
+ }
68
+ }
69
+ /**
70
+ * Evalúa una fórmula proposicional / aritmética (sin modalidades) sobre
71
+ * un estado concreto. Para fórmulas con [α]/⟨α⟩ se requiere el motor de
72
+ * tableau (`tableau.ts`).
73
+ */
74
+ function evalQuantifierFree(f, s) {
75
+ switch (f.kind) {
76
+ case 'true':
77
+ return true;
78
+ case 'false':
79
+ return false;
80
+ case 'comp':
81
+ return evalComp(f.op, evalTerm(f.left, s), evalTerm(f.right, s));
82
+ case 'not':
83
+ return !evalQuantifierFree(f.arg, s);
84
+ case 'and':
85
+ return evalQuantifierFree(f.left, s) && evalQuantifierFree(f.right, s);
86
+ case 'or':
87
+ return evalQuantifierFree(f.left, s) || evalQuantifierFree(f.right, s);
88
+ case 'implies':
89
+ return !evalQuantifierFree(f.left, s) || evalQuantifierFree(f.right, s);
90
+ case 'iff':
91
+ return evalQuantifierFree(f.left, s) === evalQuantifierFree(f.right, s);
92
+ case 'box':
93
+ case 'diamond':
94
+ throw new Error('evalQuantifierFree no maneja modalidades; usar tableau.');
95
+ }
96
+ }
97
+ /** Substitución de un término por otro dentro de un término. */
98
+ function substTerm(t, varName, replacement) {
99
+ switch (t.kind) {
100
+ case 'num':
101
+ return t;
102
+ case 'var':
103
+ return t.name === varName ? replacement : t;
104
+ case 'plus':
105
+ return {
106
+ kind: 'plus',
107
+ left: substTerm(t.left, varName, replacement),
108
+ right: substTerm(t.right, varName, replacement),
109
+ };
110
+ case 'minus':
111
+ return {
112
+ kind: 'minus',
113
+ left: substTerm(t.left, varName, replacement),
114
+ right: substTerm(t.right, varName, replacement),
115
+ };
116
+ case 'times':
117
+ return {
118
+ kind: 'times',
119
+ left: substTerm(t.left, varName, replacement),
120
+ right: substTerm(t.right, varName, replacement),
121
+ };
122
+ case 'div':
123
+ return {
124
+ kind: 'div',
125
+ left: substTerm(t.left, varName, replacement),
126
+ right: substTerm(t.right, varName, replacement),
127
+ };
128
+ case 'neg':
129
+ return { kind: 'neg', arg: substTerm(t.arg, varName, replacement) };
130
+ case 'pow':
131
+ return { kind: 'pow', base: substTerm(t.base, varName, replacement), exp: t.exp };
132
+ }
133
+ }
134
+ /** Substitución dentro de una fórmula (sólo a través de comparaciones). */
135
+ function substFormula(f, varName, replacement) {
136
+ switch (f.kind) {
137
+ case 'true':
138
+ case 'false':
139
+ return f;
140
+ case 'comp':
141
+ return {
142
+ kind: 'comp',
143
+ op: f.op,
144
+ left: substTerm(f.left, varName, replacement),
145
+ right: substTerm(f.right, varName, replacement),
146
+ };
147
+ case 'not':
148
+ return { kind: 'not', arg: substFormula(f.arg, varName, replacement) };
149
+ case 'and':
150
+ return {
151
+ kind: 'and',
152
+ left: substFormula(f.left, varName, replacement),
153
+ right: substFormula(f.right, varName, replacement),
154
+ };
155
+ case 'or':
156
+ return {
157
+ kind: 'or',
158
+ left: substFormula(f.left, varName, replacement),
159
+ right: substFormula(f.right, varName, replacement),
160
+ };
161
+ case 'implies':
162
+ return {
163
+ kind: 'implies',
164
+ left: substFormula(f.left, varName, replacement),
165
+ right: substFormula(f.right, varName, replacement),
166
+ };
167
+ case 'iff':
168
+ return {
169
+ kind: 'iff',
170
+ left: substFormula(f.left, varName, replacement),
171
+ right: substFormula(f.right, varName, replacement),
172
+ };
173
+ case 'box':
174
+ case 'diamond':
175
+ // No se hace alfa-renaming: si la variable es modificada dentro del
176
+ // programa la substitución podría capturar; el tableau se encarga
177
+ // de no introducir estas situaciones (asigna desde el estado actual).
178
+ return f;
179
+ }
180
+ }
181
+ //# sourceMappingURL=semantics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantics.js","sourceRoot":"","sources":["../../../../src/logic/profiles/dl-hybrid/semantics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { DLFormula, State } from './ast';
2
+ export interface DLOptions {
3
+ /** Profundidad máxima al desenrollar loops `α*`. */
4
+ loopUnfold?: number;
5
+ /** Cantidad de muestras temporales para evaluar ODEs continuas. */
6
+ odeSamples?: number;
7
+ /** Horizonte temporal máximo a explorar en ODEs. */
8
+ odeHorizon?: number;
9
+ /** Cantidad de valores muestrales para `x := *`. */
10
+ nondetSamples?: number[];
11
+ /** Estados iniciales explícitos. Si vacío, se genera una malla cubriendo las variables relevantes. */
12
+ initialStates?: State[];
13
+ /** Valores muestrales por defecto para construir la malla de iniciales. */
14
+ initialMesh?: number[];
15
+ }
16
+ /** Decisión: la fórmula es válida (vale en todo estado muestreado). */
17
+ export interface DLCheckResult {
18
+ status: 'valid' | 'invalid' | 'satisfiable' | 'unsatisfiable' | 'unknown';
19
+ /** Contramodelo o testigo si aplica. */
20
+ witness?: State;
21
+ /** Cantidad de estados muestreados. */
22
+ statesChecked: number;
23
+ }
24
+ /**
25
+ * Decide si `f` es válida sobre toda la malla muestreada (criterio de
26
+ * validez universal acotada). Si encuentra contraejemplo lo retorna.
27
+ */
28
+ export declare function checkValid(f: DLFormula, opts?: DLOptions): DLCheckResult;
29
+ /** Decide si `f` es satisfacible en algún estado muestreado. */
30
+ export declare function checkSatisfiable(f: DLFormula, opts?: DLOptions): DLCheckResult;
31
+ /**
32
+ * Evalúa la fórmula en un estado específico — útil para casos donde el
33
+ * usuario quiere chequear desde una pre-condición concreta.
34
+ */
35
+ export declare function evalInState(f: DLFormula, s: State, opts?: DLOptions): boolean;
36
+ /** Re-export utilitario: lista de variables relevantes en la fórmula. */
37
+ export declare function relevantVariables(f: DLFormula): string[];
38
+ //# sourceMappingURL=tableau.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableau.d.ts","sourceRoot":"","sources":["../../../../src/logic/profiles/dl-hybrid/tableau.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,SAAS,EAAyB,KAAK,EAAE,MAAM,OAAO,CAAC;AAKrE,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,sGAAsG;IACtG,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;IACxB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AA0MD,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,aAAa,GAAG,eAAe,GAAG,SAAS,CAAC;IAC1E,wCAAwC;IACxC,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,aAAa,CASxE;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,aAAa,CAS9E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAE7E;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,EAAE,CAgBxD"}
@@ -0,0 +1,289 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // ST dL-Hybrid — Decision procedure tipo tableau (subset)
4
+ // ============================================================
5
+ // Implementación pragmática y *no* completa del cálculo de pruebas de dL.
6
+ // La idea: en lugar de un cálculo simbólico KeYmaera-completo, modelamos
7
+ // el espacio de estados con muestreo sobre un conjunto finito de estados
8
+ // iniciales generados a partir de la fórmula y exploramos las posibles
9
+ // trayectorias del programa híbrido.
10
+ //
11
+ // Decisión:
12
+ // • Para mostrar `validez universal` exigimos que NO exista un estado
13
+ // en el universo finito muestreado que produzca un contraejemplo.
14
+ // • Para `satisfiabilidad` basta con encontrar un estado donde la
15
+ // fórmula se cumple.
16
+ //
17
+ // Este enfoque cubre los ejemplos canónicos del paper de Platzer con
18
+ // dominio acotado y se comporta como un "model-finder con horizonte
19
+ // finito" en lugar de un decision procedure completo. Para ODEs no
20
+ // soportadas (clasifyOde → unsupported) responde `unknown`.
21
+ //
22
+ // Reglas operativas para [α]φ:
23
+ // • [x := e] φ → φ[e/x] evaluado en estado actual
24
+ // • [x := *] φ → ∀v . φ[v/x] aproximado con malla
25
+ // • [?ψ] φ → ψ → φ
26
+ // • [α; β] φ → [α][β] φ
27
+ // • [α ∪ β] φ → [α]φ ∧ [β]φ
28
+ // • [α*] φ → φ ∧ [α]φ ∧ [α;α]φ ∧ … (unfold a profundidad N)
29
+ // • [{x'=f & Q}] φ → ∀t≥0 . (∀s∈[0,t] . Q(x(s))) → φ(x(t))
30
+ // muestreado con malla temporal.
31
+ // ============================================================
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.checkValid = checkValid;
34
+ exports.checkSatisfiable = checkSatisfiable;
35
+ exports.evalInState = evalInState;
36
+ exports.relevantVariables = relevantVariables;
37
+ const ast_1 = require("./ast");
38
+ const semantics_1 = require("./semantics");
39
+ const differential_1 = require("./differential");
40
+ const DEFAULTS = {
41
+ loopUnfold: 3,
42
+ odeSamples: 9,
43
+ odeHorizon: 5,
44
+ nondetSamples: [-2, -1, 0, 1, 2],
45
+ initialStates: [],
46
+ initialMesh: [-1, 0, 1, 2],
47
+ };
48
+ function withDefaults(opts) {
49
+ return { ...DEFAULTS, ...(opts ?? {}) };
50
+ }
51
+ /**
52
+ * Devuelve TODOS los estados de salida posibles tras ejecutar `prog`
53
+ * desde `s`. Para tests bloqueantes devuelve outcomes=[] con blocked=true.
54
+ * No es exhaustivo: muestrea estados.
55
+ */
56
+ function executeProgram(prog, s, opts) {
57
+ switch (prog.kind) {
58
+ case 'assign': {
59
+ const next = (0, ast_1.cloneState)(s);
60
+ next.set(prog.varName, (0, semantics_1.evalTerm)(prog.rhs, s));
61
+ return { outcomes: [next] };
62
+ }
63
+ case 'nondet': {
64
+ const out = [];
65
+ for (const v of opts.nondetSamples) {
66
+ const ns = (0, ast_1.cloneState)(s);
67
+ ns.set(prog.varName, v);
68
+ out.push(ns);
69
+ }
70
+ return { outcomes: out };
71
+ }
72
+ case 'test': {
73
+ if ((0, semantics_1.evalQuantifierFree)(prog.cond, s))
74
+ return { outcomes: [s] };
75
+ return { outcomes: [], blocked: true };
76
+ }
77
+ case 'seq': {
78
+ const first = executeProgram(prog.left, s, opts);
79
+ const combined = [];
80
+ for (const mid of first.outcomes) {
81
+ const after = executeProgram(prog.right, mid, opts);
82
+ combined.push(...after.outcomes);
83
+ }
84
+ return { outcomes: combined };
85
+ }
86
+ case 'choice': {
87
+ const a = executeProgram(prog.left, s, opts);
88
+ const b = executeProgram(prog.right, s, opts);
89
+ return { outcomes: [...a.outcomes, ...b.outcomes] };
90
+ }
91
+ case 'loop': {
92
+ // Desenrolla hasta loopUnfold iteraciones; cada k es una posible salida.
93
+ const outcomes = [(0, ast_1.cloneState)(s)];
94
+ let current = [(0, ast_1.cloneState)(s)];
95
+ for (let k = 0; k < opts.loopUnfold; k++) {
96
+ const next = [];
97
+ for (const st of current) {
98
+ const step = executeProgram(prog.body, st, opts);
99
+ next.push(...step.outcomes);
100
+ }
101
+ if (next.length === 0)
102
+ break;
103
+ outcomes.push(...next);
104
+ current = next;
105
+ }
106
+ return { outcomes };
107
+ }
108
+ case 'ode': {
109
+ const klass = (0, differential_1.classifyOde)(prog.system);
110
+ if (klass.kind === 'unsupported') {
111
+ // No podemos evaluar — devolvemos un outcome especial: el propio
112
+ // estado, marcando blocked si no hay dominio para verificar.
113
+ return { outcomes: [s], blocked: false };
114
+ }
115
+ const out = [];
116
+ const dt = opts.odeHorizon / Math.max(1, opts.odeSamples - 1);
117
+ for (let i = 0; i < opts.odeSamples; i++) {
118
+ const t = i * dt;
119
+ const ns = (0, differential_1.flow)(prog.system, s, t);
120
+ // Verifica dominio: si dominio falla en algún punto del segmento
121
+ // [0, t] descartamos. Aproximamos con malla.
122
+ if (prog.system.domain) {
123
+ let ok = true;
124
+ for (let j = 0; j <= i; j++) {
125
+ const tau = j * dt;
126
+ const inter = (0, differential_1.flow)(prog.system, s, tau);
127
+ if (!(0, semantics_1.evalQuantifierFree)(prog.system.domain, inter)) {
128
+ ok = false;
129
+ break;
130
+ }
131
+ }
132
+ if (!ok)
133
+ continue;
134
+ }
135
+ out.push(ns);
136
+ }
137
+ // Siempre incluir t=0 al menos
138
+ if (out.length === 0)
139
+ out.push((0, ast_1.cloneState)(s));
140
+ return { outcomes: out };
141
+ }
142
+ }
143
+ }
144
+ /**
145
+ * Evalúa una fórmula dL sobre un estado concreto. Para modalidades
146
+ * recurre a `executeProgram`.
147
+ */
148
+ function evalFormula(f, s, opts) {
149
+ switch (f.kind) {
150
+ case 'true':
151
+ return true;
152
+ case 'false':
153
+ return false;
154
+ case 'comp':
155
+ return (0, semantics_1.evalQuantifierFree)(f, s);
156
+ case 'not':
157
+ return !evalFormula(f.arg, s, opts);
158
+ case 'and':
159
+ return evalFormula(f.left, s, opts) && evalFormula(f.right, s, opts);
160
+ case 'or':
161
+ return evalFormula(f.left, s, opts) || evalFormula(f.right, s, opts);
162
+ case 'implies':
163
+ return !evalFormula(f.left, s, opts) || evalFormula(f.right, s, opts);
164
+ case 'iff':
165
+ return evalFormula(f.left, s, opts) === evalFormula(f.right, s, opts);
166
+ case 'box': {
167
+ const step = executeProgram(f.program, s, opts);
168
+ // [α]φ: en TODOS los outcomes φ debe valer.
169
+ // Si el test bloquea (sin outcomes), [?ψ]φ es vacuously true.
170
+ for (const out of step.outcomes) {
171
+ if (!evalFormula(f.post, out, opts))
172
+ return false;
173
+ }
174
+ return true;
175
+ }
176
+ case 'diamond': {
177
+ const step = executeProgram(f.program, s, opts);
178
+ // ⟨α⟩φ: existe un outcome donde φ vale.
179
+ for (const out of step.outcomes) {
180
+ if (evalFormula(f.post, out, opts))
181
+ return true;
182
+ }
183
+ return false;
184
+ }
185
+ }
186
+ }
187
+ /** Genera una malla de estados iniciales según las variables libres de la fórmula. */
188
+ function generateInitialStates(f, opts) {
189
+ if (opts.initialStates.length > 0)
190
+ return opts.initialStates;
191
+ const vars = Array.from((0, ast_1.formulaVars)(f));
192
+ // También variables modificadas dentro de programas (parten de un valor inicial).
193
+ if (vars.length === 0)
194
+ return [new Map()];
195
+ // Producto cartesiano de la malla — limita a 4 vars máx para evitar explosión.
196
+ if (vars.length > 4) {
197
+ // Modo light: usa sólo {0, 1, -1} para cada var y limita combinaciones.
198
+ const mesh = [-1, 0, 1];
199
+ const states = [];
200
+ // Una muestra "todo a v" por cada v
201
+ for (const v of mesh) {
202
+ const s = new Map();
203
+ for (const x of vars)
204
+ s.set(x, v);
205
+ states.push(s);
206
+ }
207
+ // Una muestra mixta: variable individual con valor distinto
208
+ for (let i = 0; i < vars.length; i++) {
209
+ for (const v of mesh) {
210
+ const s = new Map();
211
+ for (let j = 0; j < vars.length; j++) {
212
+ s.set(vars[j] ?? '', j === i ? v : 0);
213
+ }
214
+ states.push(s);
215
+ }
216
+ }
217
+ return states;
218
+ }
219
+ const mesh = opts.initialMesh;
220
+ const result = [];
221
+ const recurse = (idx, current) => {
222
+ if (idx === vars.length) {
223
+ result.push(new Map(current));
224
+ return;
225
+ }
226
+ const v = vars[idx];
227
+ if (!v)
228
+ return;
229
+ for (const val of mesh) {
230
+ current.set(v, val);
231
+ recurse(idx + 1, current);
232
+ }
233
+ };
234
+ recurse(0, new Map());
235
+ return result;
236
+ }
237
+ /**
238
+ * Decide si `f` es válida sobre toda la malla muestreada (criterio de
239
+ * validez universal acotada). Si encuentra contraejemplo lo retorna.
240
+ */
241
+ function checkValid(f, opts) {
242
+ const o = withDefaults(opts);
243
+ const states = generateInitialStates(f, o);
244
+ for (const s of states) {
245
+ if (!evalFormula(f, s, o)) {
246
+ return { status: 'invalid', witness: s, statesChecked: states.length };
247
+ }
248
+ }
249
+ return { status: 'valid', statesChecked: states.length };
250
+ }
251
+ /** Decide si `f` es satisfacible en algún estado muestreado. */
252
+ function checkSatisfiable(f, opts) {
253
+ const o = withDefaults(opts);
254
+ const states = generateInitialStates(f, o);
255
+ for (const s of states) {
256
+ if (evalFormula(f, s, o)) {
257
+ return { status: 'satisfiable', witness: s, statesChecked: states.length };
258
+ }
259
+ }
260
+ return { status: 'unsatisfiable', statesChecked: states.length };
261
+ }
262
+ /**
263
+ * Evalúa la fórmula en un estado específico — útil para casos donde el
264
+ * usuario quiere chequear desde una pre-condición concreta.
265
+ */
266
+ function evalInState(f, s, opts) {
267
+ return evalFormula(f, s, withDefaults(opts));
268
+ }
269
+ /** Re-export utilitario: lista de variables relevantes en la fórmula. */
270
+ function relevantVariables(f) {
271
+ const acc = (0, ast_1.formulaVars)(f);
272
+ // Incluir variables que sólo aparecen dentro de programas modales
273
+ const inner = (g) => {
274
+ if (g.kind === 'box' || g.kind === 'diamond') {
275
+ (0, ast_1.programVars)(g.program, acc);
276
+ inner(g.post);
277
+ }
278
+ else if (g.kind === 'and' || g.kind === 'or' || g.kind === 'implies' || g.kind === 'iff') {
279
+ inner(g.left);
280
+ inner(g.right);
281
+ }
282
+ else if (g.kind === 'not') {
283
+ inner(g.arg);
284
+ }
285
+ };
286
+ inner(f);
287
+ return Array.from(acc);
288
+ }
289
+ //# sourceMappingURL=tableau.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableau.js","sourceRoot":"","sources":["../../../../src/logic/profiles/dl-hybrid/tableau.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=invariant.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariant.test.d.ts","sourceRoot":"","sources":["../../../../src/reasoning/dl-hybrid/__tests__/invariant.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // ST dL-Hybrid Reasoning — Invariant search tests
4
+ // ============================================================
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const invariant_search_1 = require("../invariant-search");
8
+ const dl_hybrid_1 = require("../../../logic/profiles/dl-hybrid");
9
+ const dl_hybrid_2 = require("../../../logic/profiles/dl-hybrid");
10
+ function ode(src) {
11
+ const p = (0, dl_hybrid_1.parseProgram)(src);
12
+ if (p.kind !== 'ode')
13
+ throw new Error('Esperaba ODE');
14
+ return p.system;
15
+ }
16
+ (0, vitest_1.describe)('dl-hybrid reasoning — checkDifferentialInvariant', () => {
17
+ (0, vitest_1.it)("x es invariante con L_f exacto 0 para x' = 0", () => {
18
+ // L_f(x) = 0 → exacto.
19
+ const v = (0, invariant_search_1.checkDifferentialInvariant)((0, dl_hybrid_2.variable)('x'), ode("{x' = 0}"));
20
+ (0, vitest_1.expect)(v.kind).toBe('invariant');
21
+ if (v.kind === 'invariant')
22
+ (0, vitest_1.expect)(v.reason).toBe('exact');
23
+ });
24
+ (0, vitest_1.it)("x es invariante para x' = 1 (L_f = 1 ≥ 0)", () => {
25
+ const v = (0, invariant_search_1.checkDifferentialInvariant)((0, dl_hybrid_2.variable)('x'), ode("{x' = 1}"));
26
+ (0, vitest_1.expect)(v.kind).toBe('invariant');
27
+ });
28
+ (0, vitest_1.it)("x NO es invariante para x' = -1 (L_f = -1 < 0)", () => {
29
+ const v = (0, invariant_search_1.checkDifferentialInvariant)((0, dl_hybrid_2.variable)('x'), ode("{x' = -1}"));
30
+ (0, vitest_1.expect)(v.kind).toBe('not-invariant');
31
+ });
32
+ (0, vitest_1.it)("x² + y² es invariante para rotación (x' = -y, y' = x)", () => {
33
+ const sys = {
34
+ equations: [
35
+ { varName: 'x', rhs: { kind: 'neg', arg: (0, dl_hybrid_2.variable)('y') } },
36
+ { varName: 'y', rhs: (0, dl_hybrid_2.variable)('x') },
37
+ ],
38
+ };
39
+ const p = (0, dl_hybrid_2.plus)((0, dl_hybrid_2.power)((0, dl_hybrid_2.variable)('x'), 2), (0, dl_hybrid_2.power)((0, dl_hybrid_2.variable)('y'), 2));
40
+ const v = (0, invariant_search_1.checkDifferentialInvariant)(p, sys);
41
+ (0, vitest_1.expect)(v.kind).toBe('invariant');
42
+ // El simplificador no necesariamente reduce 2x(-y)+2yx a const 0,
43
+ // pero numéricamente la malla evidencia el invariante.
44
+ if (v.kind === 'invariant') {
45
+ (0, vitest_1.expect)(['exact', 'lie-nonnegative']).toContain(v.reason);
46
+ }
47
+ });
48
+ (0, vitest_1.it)("x NO es invariante para x' = x*y (refutable con muestra x=-1, y=2)", () => {
49
+ // Sistema acoplado: chequeamos numéricamente, no por solubilidad cerrada.
50
+ const sys = ode("{x' = x * y}");
51
+ const v = (0, invariant_search_1.checkDifferentialInvariant)((0, dl_hybrid_2.variable)('x'), sys);
52
+ (0, vitest_1.expect)(v.kind).toBe('not-invariant');
53
+ });
54
+ });
55
+ (0, vitest_1.describe)('dl-hybrid reasoning — suggestInvariants', () => {
56
+ (0, vitest_1.it)("encuentra al menos un invariante para x' = 1 (x ≥ -1 o ≥ 0)", () => {
57
+ const sys = ode("{x' = 1}");
58
+ const found = (0, invariant_search_1.suggestInvariants)(sys);
59
+ (0, vitest_1.expect)(found.length).toBeGreaterThan(0);
60
+ });
61
+ (0, vitest_1.it)('describeVerdict produce string informativo', () => {
62
+ const sys = ode("{x' = 1}");
63
+ const found = (0, invariant_search_1.suggestInvariants)(sys);
64
+ (0, vitest_1.expect)(found.length).toBeGreaterThan(0);
65
+ const first = found[0];
66
+ (0, vitest_1.expect)(first).toBeDefined();
67
+ if (first) {
68
+ const desc = (0, invariant_search_1.describeVerdict)(first);
69
+ (0, vitest_1.expect)(typeof desc).toBe('string');
70
+ (0, vitest_1.expect)(desc.length).toBeGreaterThan(0);
71
+ }
72
+ });
73
+ });
74
+ //# sourceMappingURL=invariant.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invariant.test.js","sourceRoot":"","sources":["../../../../src/reasoning/dl-hybrid/__tests__/invariant.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type { InvariantVerdict, InvariantOptions, CandidateResult } from './invariant-search';
2
+ export { checkDifferentialInvariant, suggestInvariants, describeVerdict, } from './invariant-search';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/reasoning/dl-hybrid/index.ts"],"names":[],"mappings":"AASA,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,eAAe,GAChB,MAAM,oBAAoB,CAAC"}