@nahisaho/musubix-formal-verify 1.7.5

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 (78) hide show
  1. package/README.md +62 -0
  2. package/dist/converters/EarsToSmtConverter.d.ts +102 -0
  3. package/dist/converters/EarsToSmtConverter.d.ts.map +1 -0
  4. package/dist/converters/EarsToSmtConverter.js +368 -0
  5. package/dist/converters/EarsToSmtConverter.js.map +1 -0
  6. package/dist/converters/index.d.ts +6 -0
  7. package/dist/converters/index.d.ts.map +1 -0
  8. package/dist/converters/index.js +5 -0
  9. package/dist/converters/index.js.map +1 -0
  10. package/dist/converters/types.d.ts +103 -0
  11. package/dist/converters/types.d.ts.map +1 -0
  12. package/dist/converters/types.js +7 -0
  13. package/dist/converters/types.js.map +1 -0
  14. package/dist/index.d.ts +22 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +23 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/tools/formal-verify-tools.d.ts +60 -0
  19. package/dist/tools/formal-verify-tools.d.ts.map +1 -0
  20. package/dist/tools/formal-verify-tools.js +371 -0
  21. package/dist/tools/formal-verify-tools.js.map +1 -0
  22. package/dist/tools/index.d.ts +5 -0
  23. package/dist/tools/index.d.ts.map +1 -0
  24. package/dist/tools/index.js +5 -0
  25. package/dist/tools/index.js.map +1 -0
  26. package/dist/traceability/ImpactAnalyzer.d.ts +103 -0
  27. package/dist/traceability/ImpactAnalyzer.d.ts.map +1 -0
  28. package/dist/traceability/ImpactAnalyzer.js +281 -0
  29. package/dist/traceability/ImpactAnalyzer.js.map +1 -0
  30. package/dist/traceability/TraceabilityDB.d.ts +123 -0
  31. package/dist/traceability/TraceabilityDB.d.ts.map +1 -0
  32. package/dist/traceability/TraceabilityDB.js +379 -0
  33. package/dist/traceability/TraceabilityDB.js.map +1 -0
  34. package/dist/traceability/index.d.ts +8 -0
  35. package/dist/traceability/index.d.ts.map +1 -0
  36. package/dist/traceability/index.js +6 -0
  37. package/dist/traceability/index.js.map +1 -0
  38. package/dist/traceability/types.d.ts +156 -0
  39. package/dist/traceability/types.d.ts.map +1 -0
  40. package/dist/traceability/types.js +7 -0
  41. package/dist/traceability/types.js.map +1 -0
  42. package/dist/verifiers/PostconditionVerifier.d.ts +105 -0
  43. package/dist/verifiers/PostconditionVerifier.d.ts.map +1 -0
  44. package/dist/verifiers/PostconditionVerifier.js +326 -0
  45. package/dist/verifiers/PostconditionVerifier.js.map +1 -0
  46. package/dist/verifiers/PreconditionVerifier.d.ts +87 -0
  47. package/dist/verifiers/PreconditionVerifier.d.ts.map +1 -0
  48. package/dist/verifiers/PreconditionVerifier.js +286 -0
  49. package/dist/verifiers/PreconditionVerifier.js.map +1 -0
  50. package/dist/verifiers/index.d.ts +7 -0
  51. package/dist/verifiers/index.d.ts.map +1 -0
  52. package/dist/verifiers/index.js +6 -0
  53. package/dist/verifiers/index.js.map +1 -0
  54. package/dist/verifiers/types.d.ts +109 -0
  55. package/dist/verifiers/types.d.ts.map +1 -0
  56. package/dist/verifiers/types.js +7 -0
  57. package/dist/verifiers/types.js.map +1 -0
  58. package/dist/z3/Z3Adapter.d.ts +92 -0
  59. package/dist/z3/Z3Adapter.d.ts.map +1 -0
  60. package/dist/z3/Z3Adapter.js +189 -0
  61. package/dist/z3/Z3Adapter.js.map +1 -0
  62. package/dist/z3/Z3ProcessFallback.d.ts +67 -0
  63. package/dist/z3/Z3ProcessFallback.d.ts.map +1 -0
  64. package/dist/z3/Z3ProcessFallback.js +287 -0
  65. package/dist/z3/Z3ProcessFallback.js.map +1 -0
  66. package/dist/z3/Z3WasmClient.d.ts +55 -0
  67. package/dist/z3/Z3WasmClient.d.ts.map +1 -0
  68. package/dist/z3/Z3WasmClient.js +172 -0
  69. package/dist/z3/Z3WasmClient.js.map +1 -0
  70. package/dist/z3/index.d.ts +9 -0
  71. package/dist/z3/index.d.ts.map +1 -0
  72. package/dist/z3/index.js +7 -0
  73. package/dist/z3/index.js.map +1 -0
  74. package/dist/z3/types.d.ts +82 -0
  75. package/dist/z3/types.d.ts.map +1 -0
  76. package/dist/z3/types.js +7 -0
  77. package/dist/z3/types.js.map +1 -0
  78. package/package.json +79 -0
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Postcondition Verifier
3
+ *
4
+ * 事後条件の形式検証を行うクラス
5
+ */
6
+ import type { Z3Client } from '../z3/types.js';
7
+ import type { PostconditionInput, VerificationResult, VariableDeclaration, Condition } from './types.js';
8
+ /**
9
+ * 事後条件検証器
10
+ *
11
+ * Z3ソルバーを使用して、事前条件が成り立つときに
12
+ * 事後条件が必ず成り立つかを検証します(Hoareトリプル)。
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const z3 = await Z3Adapter.create();
17
+ * const verifier = new PostconditionVerifier(z3);
18
+ *
19
+ * const result = await verifier.verify({
20
+ * precondition: { expression: 'balance >= amount', format: 'javascript' },
21
+ * postcondition: { expression: 'balance_new = balance - amount', format: 'javascript' },
22
+ * preVariables: [
23
+ * { name: 'balance', type: 'Int' },
24
+ * { name: 'amount', type: 'Int' },
25
+ * ],
26
+ * postVariables: [
27
+ * { name: 'balance_new', type: 'Int' },
28
+ * ],
29
+ * });
30
+ * ```
31
+ */
32
+ export declare class PostconditionVerifier {
33
+ private readonly z3;
34
+ constructor(z3Client: Z3Client);
35
+ /**
36
+ * 事後条件を検証
37
+ *
38
+ * 事前条件 ∧ 遷移 → 事後条件 が常に成り立つかを検証
39
+ *
40
+ * @param input - 検証入力
41
+ * @returns 検証結果
42
+ */
43
+ verify(input: PostconditionInput): Promise<VerificationResult>;
44
+ /**
45
+ * 事後条件の部分的正当性をチェック
46
+ *
47
+ * 事前条件が成り立つとき、プログラムが停止すれば事後条件が成り立つ
48
+ */
49
+ checkPartialCorrectness(input: PostconditionInput): Promise<boolean>;
50
+ /**
51
+ * 最弱事前条件を計算
52
+ *
53
+ * 事後条件が成り立つための最弱の事前条件を計算
54
+ */
55
+ computeWeakestPrecondition(postcondition: Condition, transition: string, _variables: VariableDeclaration[]): Promise<string | null>;
56
+ /**
57
+ * SMT-LIB2スクリプトを構築
58
+ *
59
+ * 「事前条件 ∧ 遷移 ∧ ¬事後条件」の充足可能性をチェック
60
+ * unsatなら事後条件は妥当
61
+ */
62
+ private buildSmtScript;
63
+ /**
64
+ * 変数をSMT-LIB2形式で宣言
65
+ */
66
+ private declareVariable;
67
+ /**
68
+ * 型をSMT-LIB2形式に変換
69
+ */
70
+ private typeToSmt;
71
+ /**
72
+ * 条件式をSMT-LIB2形式に変換
73
+ */
74
+ private conditionToSmt;
75
+ /**
76
+ * JavaScript式をSMT-LIB2に変換
77
+ */
78
+ private convertToSmt;
79
+ /**
80
+ * 遷移関係をパースしてSMT形式に変換
81
+ */
82
+ private parseAndConvertTransition;
83
+ /**
84
+ * 遷移式をパース
85
+ * 例: "balance_new := balance - amount; count_new := count + 1"
86
+ */
87
+ private parseTransition;
88
+ /**
89
+ * 中置記法を前置記法(S式)に変換
90
+ */
91
+ private infixToPrefix;
92
+ /**
93
+ * S式がバランスしているかチェック
94
+ */
95
+ private isBalancedSExpr;
96
+ /**
97
+ * 検証結果を構築
98
+ */
99
+ private buildResult;
100
+ /**
101
+ * Z3結果を検証ステータスにマッピング
102
+ */
103
+ private mapZ3ResultToStatus;
104
+ }
105
+ //# sourceMappingURL=PostconditionVerifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostconditionVerifier.d.ts","sourceRoot":"","sources":["../../src/verifiers/PostconditionVerifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAElB,mBAAmB,EACnB,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;gBAElB,QAAQ,EAAE,QAAQ;IAI9B;;;;;;;OAOG;IACG,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA4BpE;;;;OAIG;IACG,uBAAuB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1E;;;;OAIG;IACG,0BAA0B,CAC9B,aAAa,EAAE,SAAS,EACxB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,mBAAmB,EAAE,GAChC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAyBzB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAoCtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,SAAS;IAsBjB;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAkBjC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAgBvB;;OAEG;IACH,OAAO,CAAC,aAAa;IA8CrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAiCnB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAc5B"}
@@ -0,0 +1,326 @@
1
+ /**
2
+ * Postcondition Verifier
3
+ *
4
+ * 事後条件の形式検証を行うクラス
5
+ */
6
+ /**
7
+ * 事後条件検証器
8
+ *
9
+ * Z3ソルバーを使用して、事前条件が成り立つときに
10
+ * 事後条件が必ず成り立つかを検証します(Hoareトリプル)。
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const z3 = await Z3Adapter.create();
15
+ * const verifier = new PostconditionVerifier(z3);
16
+ *
17
+ * const result = await verifier.verify({
18
+ * precondition: { expression: 'balance >= amount', format: 'javascript' },
19
+ * postcondition: { expression: 'balance_new = balance - amount', format: 'javascript' },
20
+ * preVariables: [
21
+ * { name: 'balance', type: 'Int' },
22
+ * { name: 'amount', type: 'Int' },
23
+ * ],
24
+ * postVariables: [
25
+ * { name: 'balance_new', type: 'Int' },
26
+ * ],
27
+ * });
28
+ * ```
29
+ */
30
+ export class PostconditionVerifier {
31
+ z3;
32
+ constructor(z3Client) {
33
+ this.z3 = z3Client;
34
+ }
35
+ /**
36
+ * 事後条件を検証
37
+ *
38
+ * 事前条件 ∧ 遷移 → 事後条件 が常に成り立つかを検証
39
+ *
40
+ * @param input - 検証入力
41
+ * @returns 検証結果
42
+ */
43
+ async verify(input) {
44
+ const startTime = Date.now();
45
+ try {
46
+ // SMT-LIB2スクリプトを生成
47
+ const smtScript = this.buildSmtScript(input);
48
+ if (input.options?.verbose) {
49
+ console.log('[PostconditionVerifier] SMT Script:', smtScript);
50
+ }
51
+ // Z3で検証
52
+ // 「事前条件 ∧ 遷移 ∧ ¬事後条件」がunsatなら、事後条件は妥当
53
+ const result = await this.z3.checkSat(smtScript);
54
+ const duration = Date.now() - startTime;
55
+ return this.buildResult(input, result, duration, smtScript);
56
+ }
57
+ catch (error) {
58
+ const duration = Date.now() - startTime;
59
+ return {
60
+ status: 'error',
61
+ condition: input.postcondition,
62
+ duration,
63
+ errorMessage: error instanceof Error ? error.message : String(error),
64
+ };
65
+ }
66
+ }
67
+ /**
68
+ * 事後条件の部分的正当性をチェック
69
+ *
70
+ * 事前条件が成り立つとき、プログラムが停止すれば事後条件が成り立つ
71
+ */
72
+ async checkPartialCorrectness(input) {
73
+ const result = await this.verify(input);
74
+ return result.status === 'valid';
75
+ }
76
+ /**
77
+ * 最弱事前条件を計算
78
+ *
79
+ * 事後条件が成り立つための最弱の事前条件を計算
80
+ */
81
+ async computeWeakestPrecondition(postcondition, transition, _variables) {
82
+ // Note: 完全な最弱事前条件計算は複雑
83
+ // 基本的な置換ベースの近似を提供
84
+ try {
85
+ const postSmt = this.conditionToSmt(postcondition);
86
+ // 遷移関係で変数を置換
87
+ // 例: balance_new → balance - amount
88
+ let wp = postSmt;
89
+ // 遷移式をパース
90
+ const assignments = this.parseTransition(transition);
91
+ // 後ろから置換
92
+ for (const [varName, expr] of Object.entries(assignments)) {
93
+ wp = wp.replace(new RegExp(`\\b${varName}\\b`, 'g'), `(${expr})`);
94
+ }
95
+ return wp;
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ }
101
+ /**
102
+ * SMT-LIB2スクリプトを構築
103
+ *
104
+ * 「事前条件 ∧ 遷移 ∧ ¬事後条件」の充足可能性をチェック
105
+ * unsatなら事後条件は妥当
106
+ */
107
+ buildSmtScript(input) {
108
+ const lines = [];
109
+ lines.push('(set-logic ALL)');
110
+ // 事前状態の変数宣言
111
+ for (const variable of input.preVariables) {
112
+ lines.push(this.declareVariable(variable));
113
+ }
114
+ // 事後状態の変数宣言
115
+ for (const variable of input.postVariables) {
116
+ // 重複を避ける
117
+ const preVar = input.preVariables.find(v => v.name === variable.name);
118
+ if (!preVar) {
119
+ lines.push(this.declareVariable(variable));
120
+ }
121
+ }
122
+ // 事前条件をアサート
123
+ const preSmt = this.conditionToSmt(input.precondition);
124
+ lines.push(`(assert ${preSmt})`);
125
+ // 遷移関係をアサート(存在する場合)
126
+ if (input.transition) {
127
+ const transitionSmt = this.parseAndConvertTransition(input.transition);
128
+ lines.push(`(assert ${transitionSmt})`);
129
+ }
130
+ // 事後条件の否定をアサート
131
+ const postSmt = this.conditionToSmt(input.postcondition);
132
+ lines.push(`(assert (not ${postSmt}))`);
133
+ return lines.join('\n');
134
+ }
135
+ /**
136
+ * 変数をSMT-LIB2形式で宣言
137
+ */
138
+ declareVariable(variable) {
139
+ const smtType = this.typeToSmt(variable);
140
+ return `(declare-const ${variable.name} ${smtType})`;
141
+ }
142
+ /**
143
+ * 型をSMT-LIB2形式に変換
144
+ */
145
+ typeToSmt(variable) {
146
+ switch (variable.type) {
147
+ case 'Int':
148
+ return 'Int';
149
+ case 'Real':
150
+ return 'Real';
151
+ case 'Bool':
152
+ return 'Bool';
153
+ case 'String':
154
+ return 'String';
155
+ case 'Array':
156
+ const elemType = variable.elementType
157
+ ? this.typeToSmt({ name: '', type: variable.elementType })
158
+ : 'Int';
159
+ return `(Array Int ${elemType})`;
160
+ case 'BitVec':
161
+ return `(_ BitVec ${variable.bitWidth ?? 32})`;
162
+ default:
163
+ return 'Int';
164
+ }
165
+ }
166
+ /**
167
+ * 条件式をSMT-LIB2形式に変換
168
+ */
169
+ conditionToSmt(condition) {
170
+ if (condition.format === 'smt') {
171
+ return condition.expression;
172
+ }
173
+ return this.convertToSmt(condition.expression);
174
+ }
175
+ /**
176
+ * JavaScript式をSMT-LIB2に変換
177
+ */
178
+ convertToSmt(expr) {
179
+ let smt = expr;
180
+ // 基本的な演算子変換
181
+ smt = smt.replace(/&&/g, ' and ');
182
+ smt = smt.replace(/\|\|/g, ' or ');
183
+ smt = smt.replace(/!/g, ' not ');
184
+ smt = smt.replace(/==/g, '=');
185
+ smt = smt.replace(/!=/g, ' distinct ');
186
+ // 中置記法を前置記法に変換
187
+ smt = this.infixToPrefix(smt);
188
+ return smt;
189
+ }
190
+ /**
191
+ * 遷移関係をパースしてSMT形式に変換
192
+ */
193
+ parseAndConvertTransition(transition) {
194
+ const assignments = this.parseTransition(transition);
195
+ const conditions = [];
196
+ for (const [varName, expr] of Object.entries(assignments)) {
197
+ const exprSmt = this.infixToPrefix(expr);
198
+ conditions.push(`(= ${varName} ${exprSmt})`);
199
+ }
200
+ if (conditions.length === 0) {
201
+ return 'true';
202
+ }
203
+ if (conditions.length === 1) {
204
+ return conditions[0];
205
+ }
206
+ return `(and ${conditions.join(' ')})`;
207
+ }
208
+ /**
209
+ * 遷移式をパース
210
+ * 例: "balance_new := balance - amount; count_new := count + 1"
211
+ */
212
+ parseTransition(transition) {
213
+ const assignments = {};
214
+ const parts = transition.split(/[;,]/);
215
+ for (const part of parts) {
216
+ // := または = で分割
217
+ const match = part.match(/^\s*(\w+)\s*:?=\s*(.+)\s*$/);
218
+ if (match) {
219
+ const [, varName, expr] = match;
220
+ assignments[varName] = expr.trim();
221
+ }
222
+ }
223
+ return assignments;
224
+ }
225
+ /**
226
+ * 中置記法を前置記法(S式)に変換
227
+ */
228
+ infixToPrefix(expr) {
229
+ const trimmed = expr.trim();
230
+ // すでにS式の場合はそのまま返す
231
+ if (trimmed.startsWith('(') && this.isBalancedSExpr(trimmed)) {
232
+ return trimmed;
233
+ }
234
+ // and/or/not の処理
235
+ const andMatch = trimmed.match(/^(.+?)\s+and\s+(.+)$/i);
236
+ if (andMatch) {
237
+ return `(and ${this.infixToPrefix(andMatch[1])} ${this.infixToPrefix(andMatch[2])})`;
238
+ }
239
+ const orMatch = trimmed.match(/^(.+?)\s+or\s+(.+)$/i);
240
+ if (orMatch) {
241
+ return `(or ${this.infixToPrefix(orMatch[1])} ${this.infixToPrefix(orMatch[2])})`;
242
+ }
243
+ const notMatch = trimmed.match(/^\s*not\s+(.+)$/i);
244
+ if (notMatch) {
245
+ return `(not ${this.infixToPrefix(notMatch[1])})`;
246
+ }
247
+ // 比較演算子の処理
248
+ const operators = ['>=', '<=', '>', '<', '=', 'distinct'];
249
+ for (const op of operators) {
250
+ const regex = new RegExp(`^(.+?)\\s*${op.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*(.+)$`);
251
+ const match = trimmed.match(regex);
252
+ if (match) {
253
+ return `(${op} ${this.infixToPrefix(match[1])} ${this.infixToPrefix(match[2])})`;
254
+ }
255
+ }
256
+ // 算術演算子の処理
257
+ const arithmeticOps = ['+', '-', '*', '/'];
258
+ for (const op of arithmeticOps) {
259
+ const parts = trimmed.split(new RegExp(`\\s*\\${op}\\s*`));
260
+ if (parts.length === 2) {
261
+ return `(${op} ${this.infixToPrefix(parts[0])} ${this.infixToPrefix(parts[1])})`;
262
+ }
263
+ }
264
+ return trimmed;
265
+ }
266
+ /**
267
+ * S式がバランスしているかチェック
268
+ */
269
+ isBalancedSExpr(expr) {
270
+ let depth = 0;
271
+ for (const char of expr) {
272
+ if (char === '(')
273
+ depth++;
274
+ if (char === ')')
275
+ depth--;
276
+ if (depth < 0)
277
+ return false;
278
+ }
279
+ return depth === 0;
280
+ }
281
+ /**
282
+ * 検証結果を構築
283
+ */
284
+ buildResult(input, z3Result, duration, smtScript) {
285
+ // unsatなら事後条件は妥当(valid)
286
+ // satなら反例が存在(invalid)
287
+ const status = this.mapZ3ResultToStatus(z3Result);
288
+ const result = {
289
+ status,
290
+ condition: input.postcondition,
291
+ duration,
292
+ details: {
293
+ smtScript,
294
+ z3Result,
295
+ precondition: input.precondition.expression,
296
+ transition: input.transition,
297
+ },
298
+ };
299
+ // 反例の取得(invalidの場合)
300
+ if (status === 'invalid' && input.options?.generateCounterexample) {
301
+ result.counterexample = {
302
+ assignments: {},
303
+ explanation: 'Found an input that satisfies precondition but violates postcondition',
304
+ };
305
+ }
306
+ return result;
307
+ }
308
+ /**
309
+ * Z3結果を検証ステータスにマッピング
310
+ */
311
+ mapZ3ResultToStatus(z3Result) {
312
+ switch (z3Result) {
313
+ case 'unsat':
314
+ return 'valid'; // 事後条件は常に成り立つ
315
+ case 'sat':
316
+ return 'invalid'; // 反例が存在
317
+ case 'unknown':
318
+ return 'unknown';
319
+ case 'error':
320
+ return 'error';
321
+ default:
322
+ return 'unknown';
323
+ }
324
+ }
325
+ }
326
+ //# sourceMappingURL=PostconditionVerifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostconditionVerifier.js","sourceRoot":"","sources":["../../src/verifiers/PostconditionVerifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Precondition Verifier
3
+ *
4
+ * 事前条件の形式検証を行うクラス
5
+ */
6
+ import type { Z3Client } from '../z3/types.js';
7
+ import type { PreconditionInput, VerificationResult } from './types.js';
8
+ /**
9
+ * 事前条件検証器
10
+ *
11
+ * Z3ソルバーを使用して事前条件の充足可能性と妥当性を検証します。
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const z3 = await Z3Adapter.create();
16
+ * const verifier = new PreconditionVerifier(z3);
17
+ *
18
+ * const result = await verifier.verify({
19
+ * condition: { expression: 'amount > 0', format: 'javascript' },
20
+ * variables: [{ name: 'amount', type: 'Int' }],
21
+ * });
22
+ *
23
+ * if (result.status === 'valid') {
24
+ * console.log('Precondition is satisfiable');
25
+ * }
26
+ * ```
27
+ */
28
+ export declare class PreconditionVerifier {
29
+ private readonly z3;
30
+ constructor(z3Client: Z3Client);
31
+ /**
32
+ * 事前条件を検証
33
+ *
34
+ * @param input - 検証入力
35
+ * @returns 検証結果
36
+ */
37
+ verify(input: PreconditionInput): Promise<VerificationResult>;
38
+ /**
39
+ * 事前条件の充足可能性をチェック
40
+ *
41
+ * 事前条件を満たす入力が存在するかを確認
42
+ */
43
+ checkSatisfiability(input: PreconditionInput): Promise<boolean>;
44
+ /**
45
+ * 事前条件の妥当性をチェック
46
+ *
47
+ * 事前条件が常に真であるかを確認(否定がunsatなら常に真)
48
+ */
49
+ checkValidity(input: PreconditionInput): Promise<boolean>;
50
+ /**
51
+ * SMT-LIB2スクリプトを構築
52
+ */
53
+ private buildSmtScript;
54
+ /**
55
+ * 妥当性検証用のSMT-LIB2スクリプトを構築
56
+ */
57
+ private buildValidityScript;
58
+ /**
59
+ * 変数をSMT-LIB2形式で宣言
60
+ */
61
+ private declareVariable;
62
+ /**
63
+ * 型をSMT-LIB2形式に変換
64
+ */
65
+ private typeToSmt;
66
+ /**
67
+ * 条件式をSMT-LIB2形式に変換
68
+ */
69
+ private conditionToSmt;
70
+ /**
71
+ * JavaScript式をSMT-LIB2に変換
72
+ */
73
+ private convertToSmt;
74
+ /**
75
+ * 中置記法を前置記法(S式)に変換
76
+ */
77
+ private infixToPrefix;
78
+ /**
79
+ * 検証結果を構築
80
+ */
81
+ private buildResult;
82
+ /**
83
+ * Z3結果を検証ステータスにマッピング
84
+ */
85
+ private mapZ3ResultToStatus;
86
+ }
87
+ //# sourceMappingURL=PreconditionVerifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreconditionVerifier.d.ts","sourceRoot":"","sources":["../../src/verifiers/PreconditionVerifier.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAInB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;gBAElB,QAAQ,EAAE,QAAQ;IAI9B;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA2BnE;;;;OAIG;IACG,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrE;;;;OAIG;IACG,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAkB/D;;OAEG;IACH,OAAO,CAAC,cAAc;IA0BtB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuB3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,SAAS;IAoBjB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACH,OAAO,CAAC,aAAa;IA0DrB;;OAEG;IACH,OAAO,CAAC,WAAW;IA+BnB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAc5B"}