@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,286 @@
1
+ /**
2
+ * Precondition Verifier
3
+ *
4
+ * 事前条件の形式検証を行うクラス
5
+ */
6
+ /**
7
+ * 事前条件検証器
8
+ *
9
+ * Z3ソルバーを使用して事前条件の充足可能性と妥当性を検証します。
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const z3 = await Z3Adapter.create();
14
+ * const verifier = new PreconditionVerifier(z3);
15
+ *
16
+ * const result = await verifier.verify({
17
+ * condition: { expression: 'amount > 0', format: 'javascript' },
18
+ * variables: [{ name: 'amount', type: 'Int' }],
19
+ * });
20
+ *
21
+ * if (result.status === 'valid') {
22
+ * console.log('Precondition is satisfiable');
23
+ * }
24
+ * ```
25
+ */
26
+ export class PreconditionVerifier {
27
+ z3;
28
+ constructor(z3Client) {
29
+ this.z3 = z3Client;
30
+ }
31
+ /**
32
+ * 事前条件を検証
33
+ *
34
+ * @param input - 検証入力
35
+ * @returns 検証結果
36
+ */
37
+ async verify(input) {
38
+ const startTime = Date.now();
39
+ try {
40
+ // SMT-LIB2スクリプトを生成
41
+ const smtScript = this.buildSmtScript(input);
42
+ if (input.options?.verbose) {
43
+ console.log('[PreconditionVerifier] SMT Script:', smtScript);
44
+ }
45
+ // Z3で検証
46
+ const result = await this.z3.checkSat(smtScript);
47
+ const duration = Date.now() - startTime;
48
+ return this.buildResult(input.condition, result, duration, input, smtScript);
49
+ }
50
+ catch (error) {
51
+ const duration = Date.now() - startTime;
52
+ return {
53
+ status: 'error',
54
+ condition: input.condition,
55
+ duration,
56
+ errorMessage: error instanceof Error ? error.message : String(error),
57
+ };
58
+ }
59
+ }
60
+ /**
61
+ * 事前条件の充足可能性をチェック
62
+ *
63
+ * 事前条件を満たす入力が存在するかを確認
64
+ */
65
+ async checkSatisfiability(input) {
66
+ const result = await this.verify(input);
67
+ return result.status === 'valid';
68
+ }
69
+ /**
70
+ * 事前条件の妥当性をチェック
71
+ *
72
+ * 事前条件が常に真であるかを確認(否定がunsatなら常に真)
73
+ */
74
+ async checkValidity(input) {
75
+ try {
76
+ // 否定を追加したスクリプトを生成
77
+ const smtScript = this.buildValidityScript(input);
78
+ if (input.options?.verbose) {
79
+ console.log('[PreconditionVerifier] Validity Script:', smtScript);
80
+ }
81
+ const result = await this.z3.checkSat(smtScript);
82
+ // unsatなら妥当(常に真)
83
+ return result === 'unsat';
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ /**
90
+ * SMT-LIB2スクリプトを構築
91
+ */
92
+ buildSmtScript(input) {
93
+ const lines = [];
94
+ // ロジック設定
95
+ lines.push('(set-logic ALL)');
96
+ // 変数宣言
97
+ for (const variable of input.variables) {
98
+ lines.push(this.declareVariable(variable));
99
+ }
100
+ // コンテキスト条件
101
+ if (input.context) {
102
+ for (const ctx of input.context) {
103
+ const smtExpr = this.conditionToSmt(ctx);
104
+ lines.push(`(assert ${smtExpr})`);
105
+ }
106
+ }
107
+ // 事前条件
108
+ const precondSmt = this.conditionToSmt(input.condition);
109
+ lines.push(`(assert ${precondSmt})`);
110
+ return lines.join('\n');
111
+ }
112
+ /**
113
+ * 妥当性検証用のSMT-LIB2スクリプトを構築
114
+ */
115
+ buildValidityScript(input) {
116
+ const lines = [];
117
+ lines.push('(set-logic ALL)');
118
+ for (const variable of input.variables) {
119
+ lines.push(this.declareVariable(variable));
120
+ }
121
+ if (input.context) {
122
+ for (const ctx of input.context) {
123
+ const smtExpr = this.conditionToSmt(ctx);
124
+ lines.push(`(assert ${smtExpr})`);
125
+ }
126
+ }
127
+ // 事前条件の否定をアサート
128
+ const precondSmt = this.conditionToSmt(input.condition);
129
+ lines.push(`(assert (not ${precondSmt}))`);
130
+ return lines.join('\n');
131
+ }
132
+ /**
133
+ * 変数をSMT-LIB2形式で宣言
134
+ */
135
+ declareVariable(variable) {
136
+ const smtType = this.typeToSmt(variable);
137
+ return `(declare-const ${variable.name} ${smtType})`;
138
+ }
139
+ /**
140
+ * 型をSMT-LIB2形式に変換
141
+ */
142
+ typeToSmt(variable) {
143
+ switch (variable.type) {
144
+ case 'Int':
145
+ return 'Int';
146
+ case 'Real':
147
+ return 'Real';
148
+ case 'Bool':
149
+ return 'Bool';
150
+ case 'String':
151
+ return 'String';
152
+ case 'Array':
153
+ const elemType = variable.elementType ? this.typeToSmt({ name: '', type: variable.elementType }) : 'Int';
154
+ return `(Array Int ${elemType})`;
155
+ case 'BitVec':
156
+ return `(_ BitVec ${variable.bitWidth ?? 32})`;
157
+ default:
158
+ return 'Int';
159
+ }
160
+ }
161
+ /**
162
+ * 条件式をSMT-LIB2形式に変換
163
+ */
164
+ conditionToSmt(condition) {
165
+ if (condition.format === 'smt') {
166
+ return condition.expression;
167
+ }
168
+ // JavaScript/自然言語からSMTへの変換
169
+ return this.convertToSmt(condition.expression);
170
+ }
171
+ /**
172
+ * JavaScript式をSMT-LIB2に変換
173
+ */
174
+ convertToSmt(expr) {
175
+ let smt = expr;
176
+ // 基本的な演算子変換
177
+ smt = smt.replace(/&&/g, ' and ');
178
+ smt = smt.replace(/\|\|/g, ' or ');
179
+ smt = smt.replace(/!/g, ' not ');
180
+ smt = smt.replace(/==/g, '=');
181
+ smt = smt.replace(/!=/g, ' distinct ');
182
+ smt = smt.replace(/>=/g, '>=');
183
+ smt = smt.replace(/<=/g, '<=');
184
+ // 二項演算をS式に変換
185
+ // 例: a > b → (> a b)
186
+ smt = this.infixToPrefix(smt);
187
+ return smt;
188
+ }
189
+ /**
190
+ * 中置記法を前置記法(S式)に変換
191
+ */
192
+ infixToPrefix(expr) {
193
+ const trimmed = expr.trim();
194
+ // 括弧で囲まれている場合は中身を処理
195
+ if (trimmed.startsWith('(') && trimmed.endsWith(')')) {
196
+ // 対応する括弧かチェック
197
+ let depth = 0;
198
+ let isMatching = true;
199
+ for (let i = 0; i < trimmed.length - 1; i++) {
200
+ if (trimmed[i] === '(')
201
+ depth++;
202
+ if (trimmed[i] === ')')
203
+ depth--;
204
+ if (depth === 0) {
205
+ isMatching = false;
206
+ break;
207
+ }
208
+ }
209
+ if (isMatching) {
210
+ return trimmed; // すでにS式
211
+ }
212
+ }
213
+ // and/or/not の処理
214
+ const andMatch = trimmed.match(/^(.+?)\s+and\s+(.+)$/i);
215
+ if (andMatch) {
216
+ return `(and ${this.infixToPrefix(andMatch[1])} ${this.infixToPrefix(andMatch[2])})`;
217
+ }
218
+ const orMatch = trimmed.match(/^(.+?)\s+or\s+(.+)$/i);
219
+ if (orMatch) {
220
+ return `(or ${this.infixToPrefix(orMatch[1])} ${this.infixToPrefix(orMatch[2])})`;
221
+ }
222
+ const notMatch = trimmed.match(/^\s*not\s+(.+)$/i);
223
+ if (notMatch) {
224
+ return `(not ${this.infixToPrefix(notMatch[1])})`;
225
+ }
226
+ // 比較演算子の処理
227
+ const operators = ['>=', '<=', '>', '<', '=', 'distinct'];
228
+ for (const op of operators) {
229
+ const parts = trimmed.split(new RegExp(`\\s*${op.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*`));
230
+ if (parts.length === 2) {
231
+ return `(${op} ${parts[0].trim()} ${parts[1].trim()})`;
232
+ }
233
+ }
234
+ // 算術演算子の処理
235
+ const arithmeticOps = ['+', '-', '*', '/'];
236
+ for (const op of arithmeticOps) {
237
+ const parts = trimmed.split(new RegExp(`\\s*\\${op}\\s*`));
238
+ if (parts.length === 2) {
239
+ return `(${op} ${this.infixToPrefix(parts[0])} ${this.infixToPrefix(parts[1])})`;
240
+ }
241
+ }
242
+ return trimmed;
243
+ }
244
+ /**
245
+ * 検証結果を構築
246
+ */
247
+ buildResult(condition, z3Result, duration, input, smtScript) {
248
+ const status = this.mapZ3ResultToStatus(z3Result);
249
+ const result = {
250
+ status,
251
+ condition,
252
+ duration,
253
+ details: {
254
+ smtScript,
255
+ z3Result,
256
+ },
257
+ };
258
+ // 反例の取得(invalidの場合)
259
+ if (status === 'invalid' && input.options?.generateCounterexample) {
260
+ // Note: 実際の反例取得はgetModelを使用
261
+ result.counterexample = {
262
+ assignments: {},
263
+ explanation: 'Counterexample generation requires sat result',
264
+ };
265
+ }
266
+ return result;
267
+ }
268
+ /**
269
+ * Z3結果を検証ステータスにマッピング
270
+ */
271
+ mapZ3ResultToStatus(z3Result) {
272
+ switch (z3Result) {
273
+ case 'sat':
274
+ return 'valid'; // 事前条件は充足可能(妥当)
275
+ case 'unsat':
276
+ return 'invalid'; // 事前条件は充足不可能
277
+ case 'unknown':
278
+ return 'unknown';
279
+ case 'error':
280
+ return 'error';
281
+ default:
282
+ return 'unknown';
283
+ }
284
+ }
285
+ }
286
+ //# sourceMappingURL=PreconditionVerifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreconditionVerifier.js","sourceRoot":"","sources":["../../src/verifiers/PreconditionVerifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Verifiers Module Exports
3
+ */
4
+ export { PreconditionVerifier } from './PreconditionVerifier.js';
5
+ export { PostconditionVerifier } from './PostconditionVerifier.js';
6
+ export type { VariableType, VariableDeclaration, Condition, VerificationOptions, VerificationStatus, Counterexample, VerificationResult, PreconditionInput, PostconditionInput, } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/verifiers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Verifiers Module Exports
3
+ */
4
+ export { PreconditionVerifier } from './PreconditionVerifier.js';
5
+ export { PostconditionVerifier } from './PostconditionVerifier.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/verifiers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Verifier Types
3
+ *
4
+ * 事前条件/事後条件検証の型定義
5
+ */
6
+ /**
7
+ * 変数の型宣言
8
+ */
9
+ export type VariableType = 'Int' | 'Real' | 'Bool' | 'String' | 'Array' | 'BitVec';
10
+ /**
11
+ * 変数宣言
12
+ */
13
+ export interface VariableDeclaration {
14
+ /** 変数名 */
15
+ name: string;
16
+ /** 変数の型 */
17
+ type: VariableType;
18
+ /** 配列の場合の要素型 */
19
+ elementType?: VariableType;
20
+ /** BitVecの場合のビット幅 */
21
+ bitWidth?: number;
22
+ }
23
+ /**
24
+ * 条件式
25
+ */
26
+ export interface Condition {
27
+ /** 条件式(自然言語またはSMT-LIB2) */
28
+ expression: string;
29
+ /** 条件式の形式 */
30
+ format: 'natural' | 'smt' | 'javascript';
31
+ /** 条件の説明(オプション) */
32
+ description?: string;
33
+ }
34
+ /**
35
+ * 検証オプション
36
+ */
37
+ export interface VerificationOptions {
38
+ /** タイムアウト(ミリ秒) */
39
+ timeout?: number;
40
+ /** 反例を生成するか */
41
+ generateCounterexample?: boolean;
42
+ /** 証明を生成するか */
43
+ generateProof?: boolean;
44
+ /** 詳細ログを出力するか */
45
+ verbose?: boolean;
46
+ }
47
+ /**
48
+ * 検証結果のステータス
49
+ */
50
+ export type VerificationStatus = 'valid' | 'invalid' | 'unknown' | 'error';
51
+ /**
52
+ * 反例
53
+ */
54
+ export interface Counterexample {
55
+ /** 変数の値の割り当て */
56
+ assignments: Record<string, unknown>;
57
+ /** 説明 */
58
+ explanation?: string;
59
+ }
60
+ /**
61
+ * 検証結果
62
+ */
63
+ export interface VerificationResult {
64
+ /** 検証ステータス */
65
+ status: VerificationStatus;
66
+ /** 検証対象の条件 */
67
+ condition: Condition;
68
+ /** 検証にかかった時間(ミリ秒) */
69
+ duration: number;
70
+ /** 反例(invalidの場合) */
71
+ counterexample?: Counterexample;
72
+ /** 証明(validの場合) */
73
+ proof?: string;
74
+ /** エラーメッセージ(errorの場合) */
75
+ errorMessage?: string;
76
+ /** 詳細情報 */
77
+ details?: Record<string, unknown>;
78
+ }
79
+ /**
80
+ * 事前条件検証入力
81
+ */
82
+ export interface PreconditionInput {
83
+ /** 検証対象の事前条件 */
84
+ condition: Condition;
85
+ /** 変数宣言 */
86
+ variables: VariableDeclaration[];
87
+ /** 追加のコンテキスト条件 */
88
+ context?: Condition[];
89
+ /** 検証オプション */
90
+ options?: VerificationOptions;
91
+ }
92
+ /**
93
+ * 事後条件検証入力
94
+ */
95
+ export interface PostconditionInput {
96
+ /** 事前条件 */
97
+ precondition: Condition;
98
+ /** 検証対象の事後条件 */
99
+ postcondition: Condition;
100
+ /** 変数宣言(事前状態) */
101
+ preVariables: VariableDeclaration[];
102
+ /** 変数宣言(事後状態) */
103
+ postVariables: VariableDeclaration[];
104
+ /** 遷移関係(事前→事後の変換) */
105
+ transition?: string;
106
+ /** 検証オプション */
107
+ options?: VerificationOptions;
108
+ }
109
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/verifiers/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEnF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU;IACV,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,gBAAgB;IAChB,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa;IACb,MAAM,EAAE,SAAS,GAAG,KAAK,GAAG,YAAY,CAAC;IACzC,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe;IACf,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,eAAe;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gBAAgB;IAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS;IACT,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,cAAc;IACd,MAAM,EAAE,kBAAkB,CAAC;IAC3B,cAAc;IACd,SAAS,EAAE,SAAS,CAAC;IACrB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW;IACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW;IACX,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,kBAAkB;IAClB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,cAAc;IACd,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW;IACX,YAAY,EAAE,SAAS,CAAC;IACxB,gBAAgB;IAChB,aAAa,EAAE,SAAS,CAAC;IACzB,iBAAiB;IACjB,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,iBAAiB;IACjB,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,qBAAqB;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc;IACd,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC/B"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Verifier Types
3
+ *
4
+ * 事前条件/事後条件検証の型定義
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/verifiers/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Z3 Adapter
3
+ *
4
+ * Z3WasmClient と Z3ProcessFallback を統合するアダプタークラス
5
+ * 自動フォールバック機能を提供
6
+ */
7
+ import type { Z3Client, Z3Result, Z3Options } from './types.js';
8
+ /**
9
+ * Z3Adapterオプション
10
+ */
11
+ export interface Z3AdapterOptions extends Z3Options {
12
+ /** WebAssemblyを優先するかどうか(デフォルト: true) */
13
+ preferWasm?: boolean;
14
+ /** フォールバックを有効にするか(デフォルト: true) */
15
+ enableFallback?: boolean;
16
+ }
17
+ /**
18
+ * Z3アダプター
19
+ *
20
+ * Z3WasmClientとZ3ProcessFallbackを統合し、
21
+ * 環境に応じて最適なクライアントを自動選択します。
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * // ファクトリーメソッドで作成(推奨)
26
+ * const z3 = await Z3Adapter.create();
27
+ * const result = await z3.checkSat('(declare-const x Int) (assert (> x 0))');
28
+ *
29
+ * // オプション指定
30
+ * const z3 = await Z3Adapter.create({
31
+ * timeout: 10000,
32
+ * preferWasm: true,
33
+ * enableFallback: true,
34
+ * });
35
+ * ```
36
+ */
37
+ export declare class Z3Adapter implements Z3Client {
38
+ private primaryClient;
39
+ private fallbackClient;
40
+ private activeClient;
41
+ private initialized;
42
+ private readonly options;
43
+ constructor(options?: Z3AdapterOptions);
44
+ /**
45
+ * Z3Adapterのファクトリーメソッド
46
+ *
47
+ * @param options - アダプターオプション
48
+ * @returns 初期化済みのZ3Adapter
49
+ * @throws {Error} Z3が利用できない場合
50
+ */
51
+ static create(options?: Z3AdapterOptions): Promise<Z3Adapter>;
52
+ /**
53
+ * Z3クライアントを初期化
54
+ *
55
+ * preferWasm=trueの場合はWasmを優先し、失敗時にProcessFallbackを使用
56
+ * preferWasm=falseの場合はProcessFallbackを優先
57
+ */
58
+ initialize(): Promise<void>;
59
+ /**
60
+ * SMT-LIB2形式のアサーションの充足可能性をチェック
61
+ */
62
+ checkSat(smtLib2: string): Promise<Z3Result>;
63
+ /**
64
+ * モデルを取得(sat の場合のみ有効)
65
+ */
66
+ getModel(smtLib2: string): Promise<string | null>;
67
+ /**
68
+ * 証明を取得(unsat の場合のみ有効)
69
+ */
70
+ getProof(smtLib2: string): Promise<string | null>;
71
+ /**
72
+ * リソースを解放
73
+ */
74
+ dispose(): Promise<void>;
75
+ /**
76
+ * クライアントが利用可能かどうか
77
+ */
78
+ isAvailable(): boolean;
79
+ /**
80
+ * 現在使用中のクライアントタイプを取得
81
+ */
82
+ getActiveClientType(): 'wasm' | 'process' | null;
83
+ /**
84
+ * バックエンドタイプを取得(getActiveClientTypeのエイリアス)
85
+ */
86
+ getBackendType(): 'wasm' | 'process' | 'none';
87
+ /**
88
+ * 初期化状態を確認
89
+ */
90
+ private ensureInitialized;
91
+ }
92
+ //# sourceMappingURL=Z3Adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Z3Adapter.d.ts","sourceRoot":"","sources":["../../src/z3/Z3Adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIhE;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,wCAAwC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kCAAkC;IAClC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,SAAU,YAAW,QAAQ;IACxC,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;gBAE/B,OAAO,GAAE,gBAAqB;IAU1C;;;;;;OAMG;WACU,MAAM,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,CAAC;IAMvE;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA+DjC;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAKlD;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKvD;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKvD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAa9B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,mBAAmB,IAAI,MAAM,GAAG,SAAS,GAAG,IAAI;IAOhD;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,SAAS,GAAG,MAAM;IAK7C;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAK1B"}