@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
package/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # @nahisaho/musubix-formal-verify
2
+
3
+ MUSUBIX v1.7.5 Formal Verification Edition - 形式検証ツールパッケージ
4
+
5
+ ## 概要
6
+
7
+ Z3ソルバー統合、事前条件/事後条件検証、EARS→SMT変換、トレーサビリティDBを提供します。
8
+
9
+ ## インストール
10
+
11
+ ```bash
12
+ npm install @nahisaho/musubix-formal-verify
13
+ ```
14
+
15
+ ## 機能
16
+
17
+ ### Z3統合
18
+
19
+ ```typescript
20
+ import { Z3Adapter } from '@nahisaho/musubix-formal-verify/z3';
21
+
22
+ const z3 = await Z3Adapter.create();
23
+ const result = await z3.checkSat('(declare-const x Int) (assert (> x 0))');
24
+ console.log(result); // 'sat' | 'unsat' | 'unknown'
25
+ ```
26
+
27
+ ### 事前条件/事後条件検証
28
+
29
+ ```typescript
30
+ import { PreconditionVerifier, PostconditionVerifier } from '@nahisaho/musubix-formal-verify/verifiers';
31
+
32
+ const preVerifier = new PreconditionVerifier(z3);
33
+ const result = await preVerifier.verify({
34
+ condition: 'amount > 0 && amount <= balance',
35
+ variables: { amount: 'Int', balance: 'Int' }
36
+ });
37
+ ```
38
+
39
+ ### EARS→SMT変換
40
+
41
+ ```typescript
42
+ import { EarsToSmtConverter } from '@nahisaho/musubix-formal-verify/converters';
43
+
44
+ const converter = new EarsToSmtConverter();
45
+ const smt = converter.convert('WHEN user clicks submit, THE system SHALL save the data');
46
+ ```
47
+
48
+ ### トレーサビリティDB
49
+
50
+ ```typescript
51
+ import { TraceabilityDB, ImpactAnalyzer } from '@nahisaho/musubix-formal-verify/traceability';
52
+
53
+ const db = new TraceabilityDB('./trace.db');
54
+ await db.addLink({ source: 'REQ-001', target: 'DES-001', type: 'implements' });
55
+
56
+ const analyzer = new ImpactAnalyzer(db);
57
+ const impact = await analyzer.analyze('REQ-001');
58
+ ```
59
+
60
+ ## ライセンス
61
+
62
+ MIT
@@ -0,0 +1,102 @@
1
+ /**
2
+ * EARS to SMT Converter
3
+ *
4
+ * EARS形式の要件をSMT-LIB2形式に変換するコンバーター
5
+ */
6
+ import type { EarsPattern, EarsPatternType, ConversionResult, ConversionOptions } from './types.js';
7
+ /**
8
+ * EARS→SMTコンバーター
9
+ *
10
+ * EARS形式の自然言語要件をSMT-LIB2形式の論理式に変換します。
11
+ * 5つのEARSパターンをサポート:
12
+ * - Ubiquitous: THE [system] SHALL [requirement]
13
+ * - Event-driven: WHEN [event], THE [system] SHALL [response]
14
+ * - State-driven: WHILE [state], THE [system] SHALL [response]
15
+ * - Unwanted: THE [system] SHALL NOT [behavior]
16
+ * - Optional: IF [condition], THEN THE [system] SHALL [response]
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * const converter = new EarsToSmtConverter();
21
+ *
22
+ * const result = converter.convert(
23
+ * 'WHEN user clicks submit, THE system SHALL save the data within 100ms'
24
+ * );
25
+ *
26
+ * if (result.success) {
27
+ * console.log(result.formula.smtLib2);
28
+ * }
29
+ * ```
30
+ */
31
+ export declare class EarsToSmtConverter {
32
+ private readonly options;
33
+ constructor(options?: ConversionOptions);
34
+ /**
35
+ * EARS形式の要件をSMT-LIB2に変換
36
+ *
37
+ * @param earsRequirement - EARS形式の要件文
38
+ * @returns 変換結果
39
+ */
40
+ convert(earsRequirement: string): ConversionResult;
41
+ /**
42
+ * 複数のEARS要件をまとめて変換
43
+ */
44
+ convertMultiple(earsRequirements: string[]): ConversionResult[];
45
+ /**
46
+ * EARSパターンを解析
47
+ */
48
+ parseEarsPattern(requirement: string): EarsPattern | null;
49
+ /**
50
+ * パターンから変数を抽出
51
+ */
52
+ private extractVariables;
53
+ /**
54
+ * SMT宣言を生成
55
+ */
56
+ private generateDeclarations;
57
+ /**
58
+ * SMTアサーションを生成
59
+ */
60
+ private generateAssertions;
61
+ /**
62
+ * Ubiquitousパターンのアサーション生成
63
+ */
64
+ private generateUbiquitousAssertion;
65
+ /**
66
+ * Event-drivenパターンのアサーション生成
67
+ */
68
+ private generateEventDrivenAssertion;
69
+ /**
70
+ * State-drivenパターンのアサーション生成
71
+ */
72
+ private generateStateDrivenAssertion;
73
+ /**
74
+ * Unwantedパターンのアサーション生成
75
+ */
76
+ private generateUnwantedAssertion;
77
+ /**
78
+ * Optionalパターンのアサーション生成
79
+ */
80
+ private generateOptionalAssertion;
81
+ /**
82
+ * SMT-LIB2スクリプトを組み立て
83
+ */
84
+ private buildSmtLib2;
85
+ /**
86
+ * 文字列をSMT識別子に変換
87
+ */
88
+ private toSmtIdentifier;
89
+ /**
90
+ * 適用されたルールを取得
91
+ */
92
+ private getAppliedRules;
93
+ /**
94
+ * サポートされているパターンタイプを取得
95
+ */
96
+ getSupportedPatterns(): EarsPatternType[];
97
+ /**
98
+ * パターンのサンプルを取得
99
+ */
100
+ getPatternExamples(): Record<EarsPatternType, string>;
101
+ }
102
+ //# sourceMappingURL=EarsToSmtConverter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EarsToSmtConverter.d.ts","sourceRoot":"","sources":["../../src/converters/EarsToSmtConverter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EAGf,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;gBAEhC,OAAO,GAAE,iBAAsB;IAS3C;;;;;OAKG;IACH,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,gBAAgB;IA4DlD;;OAEG;IACH,eAAe,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,gBAAgB,EAAE;IAI/D;;OAEG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IA2EzD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0CxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoC1B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAQnC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAQpC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAQpC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAOjC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAQjC;;OAEG;IACH,OAAO,CAAC,YAAY;IAqCpB;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,oBAAoB,IAAI,eAAe,EAAE;IAIzC;;OAEG;IACH,kBAAkB,IAAI,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC;CAStD"}
@@ -0,0 +1,368 @@
1
+ /**
2
+ * EARS to SMT Converter
3
+ *
4
+ * EARS形式の要件をSMT-LIB2形式に変換するコンバーター
5
+ */
6
+ /**
7
+ * EARS→SMTコンバーター
8
+ *
9
+ * EARS形式の自然言語要件をSMT-LIB2形式の論理式に変換します。
10
+ * 5つのEARSパターンをサポート:
11
+ * - Ubiquitous: THE [system] SHALL [requirement]
12
+ * - Event-driven: WHEN [event], THE [system] SHALL [response]
13
+ * - State-driven: WHILE [state], THE [system] SHALL [response]
14
+ * - Unwanted: THE [system] SHALL NOT [behavior]
15
+ * - Optional: IF [condition], THEN THE [system] SHALL [response]
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const converter = new EarsToSmtConverter();
20
+ *
21
+ * const result = converter.convert(
22
+ * 'WHEN user clicks submit, THE system SHALL save the data within 100ms'
23
+ * );
24
+ *
25
+ * if (result.success) {
26
+ * console.log(result.formula.smtLib2);
27
+ * }
28
+ * ```
29
+ */
30
+ export class EarsToSmtConverter {
31
+ options;
32
+ constructor(options = {}) {
33
+ this.options = {
34
+ strict: options.strict ?? false,
35
+ inferTypes: options.inferTypes ?? true,
36
+ typeMapping: options.typeMapping ?? {},
37
+ debug: options.debug ?? false,
38
+ };
39
+ }
40
+ /**
41
+ * EARS形式の要件をSMT-LIB2に変換
42
+ *
43
+ * @param earsRequirement - EARS形式の要件文
44
+ * @returns 変換結果
45
+ */
46
+ convert(earsRequirement) {
47
+ const startTime = Date.now();
48
+ const warnings = [];
49
+ try {
50
+ // 1. EARSパターンを解析
51
+ const pattern = this.parseEarsPattern(earsRequirement);
52
+ if (!pattern) {
53
+ return {
54
+ success: false,
55
+ error: 'Failed to parse EARS pattern. Ensure the requirement follows EARS format.',
56
+ warnings,
57
+ duration: Date.now() - startTime,
58
+ };
59
+ }
60
+ if (this.options.debug) {
61
+ console.log('[EarsToSmtConverter] Parsed pattern:', pattern);
62
+ }
63
+ // 2. 変数を抽出
64
+ const variables = this.extractVariables(pattern);
65
+ // 3. SMT宣言を生成
66
+ const declarations = this.generateDeclarations(variables);
67
+ // 4. SMTアサーションを生成
68
+ const assertions = this.generateAssertions(pattern, warnings);
69
+ // 5. SMT-LIB2スクリプトを組み立て
70
+ const smtLib2 = this.buildSmtLib2(declarations, assertions);
71
+ const formula = {
72
+ smtLib2,
73
+ declarations,
74
+ assertions,
75
+ metadata: {
76
+ earsPattern: pattern,
77
+ transformationRules: this.getAppliedRules(pattern.type),
78
+ warnings,
79
+ },
80
+ };
81
+ return {
82
+ success: true,
83
+ formula,
84
+ warnings,
85
+ duration: Date.now() - startTime,
86
+ };
87
+ }
88
+ catch (error) {
89
+ return {
90
+ success: false,
91
+ error: error instanceof Error ? error.message : String(error),
92
+ warnings,
93
+ duration: Date.now() - startTime,
94
+ };
95
+ }
96
+ }
97
+ /**
98
+ * 複数のEARS要件をまとめて変換
99
+ */
100
+ convertMultiple(earsRequirements) {
101
+ return earsRequirements.map(req => this.convert(req));
102
+ }
103
+ /**
104
+ * EARSパターンを解析
105
+ */
106
+ parseEarsPattern(requirement) {
107
+ const normalized = requirement.trim();
108
+ // Pattern 1: Event-driven - WHEN [event], THE [system] SHALL [response]
109
+ const eventDrivenMatch = normalized.match(/^WHEN\s+(.+?),?\s+THE\s+(.+?)\s+SHALL\s+(.+)$/i);
110
+ if (eventDrivenMatch) {
111
+ return {
112
+ type: 'event-driven',
113
+ original: normalized,
114
+ event: eventDrivenMatch[1].trim(),
115
+ system: eventDrivenMatch[2].trim(),
116
+ requirement: eventDrivenMatch[3].trim(),
117
+ };
118
+ }
119
+ // Pattern 2: State-driven - WHILE [state], THE [system] SHALL [response]
120
+ const stateDrivenMatch = normalized.match(/^WHILE\s+(.+?),?\s+THE\s+(.+?)\s+SHALL\s+(.+)$/i);
121
+ if (stateDrivenMatch) {
122
+ return {
123
+ type: 'state-driven',
124
+ original: normalized,
125
+ state: stateDrivenMatch[1].trim(),
126
+ system: stateDrivenMatch[2].trim(),
127
+ requirement: stateDrivenMatch[3].trim(),
128
+ };
129
+ }
130
+ // Pattern 3: Optional - IF [condition], THEN THE [system] SHALL [response]
131
+ const optionalMatch = normalized.match(/^IF\s+(.+?),?\s+THEN\s+THE\s+(.+?)\s+SHALL\s+(.+)$/i);
132
+ if (optionalMatch) {
133
+ return {
134
+ type: 'optional',
135
+ original: normalized,
136
+ condition: optionalMatch[1].trim(),
137
+ system: optionalMatch[2].trim(),
138
+ requirement: optionalMatch[3].trim(),
139
+ };
140
+ }
141
+ // Pattern 4: Unwanted - THE [system] SHALL NOT [behavior]
142
+ const unwantedMatch = normalized.match(/^THE\s+(.+?)\s+SHALL\s+NOT\s+(.+)$/i);
143
+ if (unwantedMatch) {
144
+ return {
145
+ type: 'unwanted',
146
+ original: normalized,
147
+ system: unwantedMatch[1].trim(),
148
+ requirement: unwantedMatch[2].trim(),
149
+ negated: true,
150
+ };
151
+ }
152
+ // Pattern 5: Ubiquitous - THE [system] SHALL [requirement]
153
+ const ubiquitousMatch = normalized.match(/^THE\s+(.+?)\s+SHALL\s+(.+)$/i);
154
+ if (ubiquitousMatch) {
155
+ return {
156
+ type: 'ubiquitous',
157
+ original: normalized,
158
+ system: ubiquitousMatch[1].trim(),
159
+ requirement: ubiquitousMatch[2].trim(),
160
+ };
161
+ }
162
+ return null;
163
+ }
164
+ /**
165
+ * パターンから変数を抽出
166
+ */
167
+ extractVariables(pattern) {
168
+ const variables = new Map();
169
+ const allText = [
170
+ pattern.requirement,
171
+ pattern.event,
172
+ pattern.state,
173
+ pattern.condition,
174
+ ].filter(Boolean).join(' ');
175
+ // 数値を含む変数パターンを検出
176
+ // 例: "within 100ms" → response_time
177
+ const timeMatch = allText.match(/within\s+(\d+)\s*(ms|s|seconds?|milliseconds?)/i);
178
+ if (timeMatch) {
179
+ variables.set('response_time', 'Int');
180
+ variables.set('time_limit', 'Int');
181
+ }
182
+ // 比較演算子を含む変数を検出
183
+ // 例: "amount > 0" → amount: Int
184
+ const comparisonMatches = allText.matchAll(/(\w+)\s*([<>=]+)\s*(\d+)/g);
185
+ for (const match of comparisonMatches) {
186
+ const varName = this.toSmtIdentifier(match[1]);
187
+ variables.set(varName, 'Int');
188
+ }
189
+ // システム状態変数
190
+ variables.set(this.toSmtIdentifier(pattern.system) + '_active', 'Bool');
191
+ // イベント/状態/条件に基づく変数
192
+ if (pattern.event) {
193
+ variables.set(this.toSmtIdentifier(pattern.event) + '_occurred', 'Bool');
194
+ }
195
+ if (pattern.state) {
196
+ variables.set(this.toSmtIdentifier(pattern.state) + '_active', 'Bool');
197
+ }
198
+ if (pattern.condition) {
199
+ variables.set(this.toSmtIdentifier(pattern.condition) + '_holds', 'Bool');
200
+ }
201
+ return variables;
202
+ }
203
+ /**
204
+ * SMT宣言を生成
205
+ */
206
+ generateDeclarations(variables) {
207
+ const declarations = [];
208
+ for (const [name, type] of variables) {
209
+ // カスタム型マッピングを適用
210
+ const smtType = this.options.typeMapping?.[name] ?? type;
211
+ declarations.push({
212
+ name,
213
+ type: smtType,
214
+ description: `Variable derived from EARS requirement`,
215
+ });
216
+ }
217
+ return declarations;
218
+ }
219
+ /**
220
+ * SMTアサーションを生成
221
+ */
222
+ generateAssertions(pattern, warnings) {
223
+ const assertions = [];
224
+ switch (pattern.type) {
225
+ case 'ubiquitous':
226
+ // 常に成り立つ: ∀ state. requirement
227
+ assertions.push(this.generateUbiquitousAssertion(pattern));
228
+ break;
229
+ case 'event-driven':
230
+ // イベント発生時に成り立つ: event → requirement
231
+ assertions.push(this.generateEventDrivenAssertion(pattern));
232
+ break;
233
+ case 'state-driven':
234
+ // 状態が有効な間成り立つ: state → requirement
235
+ assertions.push(this.generateStateDrivenAssertion(pattern));
236
+ break;
237
+ case 'unwanted':
238
+ // 禁止動作: ¬behavior
239
+ assertions.push(this.generateUnwantedAssertion(pattern));
240
+ break;
241
+ case 'optional':
242
+ // 条件付き: condition → requirement
243
+ assertions.push(this.generateOptionalAssertion(pattern));
244
+ break;
245
+ default:
246
+ warnings.push(`Unknown pattern type: ${pattern.type}`);
247
+ }
248
+ return assertions;
249
+ }
250
+ /**
251
+ * Ubiquitousパターンのアサーション生成
252
+ */
253
+ generateUbiquitousAssertion(pattern) {
254
+ const systemVar = this.toSmtIdentifier(pattern.system) + '_active';
255
+ const reqVar = this.toSmtIdentifier(pattern.requirement);
256
+ // システムがアクティブなら要件が成り立つ
257
+ return `(=> ${systemVar} ${reqVar})`;
258
+ }
259
+ /**
260
+ * Event-drivenパターンのアサーション生成
261
+ */
262
+ generateEventDrivenAssertion(pattern) {
263
+ const eventVar = this.toSmtIdentifier(pattern.event) + '_occurred';
264
+ const reqVar = this.toSmtIdentifier(pattern.requirement);
265
+ // イベントが発生したら要件が成り立つ
266
+ return `(=> ${eventVar} ${reqVar})`;
267
+ }
268
+ /**
269
+ * State-drivenパターンのアサーション生成
270
+ */
271
+ generateStateDrivenAssertion(pattern) {
272
+ const stateVar = this.toSmtIdentifier(pattern.state) + '_active';
273
+ const reqVar = this.toSmtIdentifier(pattern.requirement);
274
+ // 状態が有効なら要件が成り立つ
275
+ return `(=> ${stateVar} ${reqVar})`;
276
+ }
277
+ /**
278
+ * Unwantedパターンのアサーション生成
279
+ */
280
+ generateUnwantedAssertion(pattern) {
281
+ const behaviorVar = this.toSmtIdentifier(pattern.requirement);
282
+ // 禁止動作は発生しない
283
+ return `(not ${behaviorVar})`;
284
+ }
285
+ /**
286
+ * Optionalパターンのアサーション生成
287
+ */
288
+ generateOptionalAssertion(pattern) {
289
+ const conditionVar = this.toSmtIdentifier(pattern.condition) + '_holds';
290
+ const reqVar = this.toSmtIdentifier(pattern.requirement);
291
+ // 条件が成り立つなら要件が成り立つ
292
+ return `(=> ${conditionVar} ${reqVar})`;
293
+ }
294
+ /**
295
+ * SMT-LIB2スクリプトを組み立て
296
+ */
297
+ buildSmtLib2(declarations, assertions) {
298
+ const lines = [];
299
+ // ヘッダー
300
+ lines.push('; Generated by MUSUBIX EarsToSmtConverter');
301
+ lines.push('; EARS to SMT-LIB2 conversion');
302
+ lines.push('');
303
+ lines.push('(set-logic ALL)');
304
+ lines.push('');
305
+ // 宣言
306
+ lines.push('; Variable declarations');
307
+ for (const decl of declarations) {
308
+ if (decl.description) {
309
+ lines.push(`; ${decl.description}`);
310
+ }
311
+ lines.push(`(declare-const ${decl.name} ${decl.type})`);
312
+ }
313
+ lines.push('');
314
+ // アサーション
315
+ lines.push('; Assertions');
316
+ for (const assertion of assertions) {
317
+ lines.push(`(assert ${assertion})`);
318
+ }
319
+ lines.push('');
320
+ // チェック
321
+ lines.push('; Check satisfiability');
322
+ lines.push('(check-sat)');
323
+ return lines.join('\n');
324
+ }
325
+ /**
326
+ * 文字列をSMT識別子に変換
327
+ */
328
+ toSmtIdentifier(text) {
329
+ return text
330
+ .toLowerCase()
331
+ .replace(/[^a-z0-9_]/g, '_')
332
+ .replace(/_+/g, '_')
333
+ .replace(/^_|_$/g, '')
334
+ .substring(0, 50); // 長すぎる識別子を切り詰め
335
+ }
336
+ /**
337
+ * 適用されたルールを取得
338
+ */
339
+ getAppliedRules(patternType) {
340
+ const rules = {
341
+ 'ubiquitous': ['system-active-implies-requirement'],
342
+ 'event-driven': ['event-triggers-response'],
343
+ 'state-driven': ['state-maintains-requirement'],
344
+ 'unwanted': ['behavior-negation'],
345
+ 'optional': ['condition-implies-requirement'],
346
+ };
347
+ return rules[patternType] ?? [];
348
+ }
349
+ /**
350
+ * サポートされているパターンタイプを取得
351
+ */
352
+ getSupportedPatterns() {
353
+ return ['ubiquitous', 'event-driven', 'state-driven', 'unwanted', 'optional'];
354
+ }
355
+ /**
356
+ * パターンのサンプルを取得
357
+ */
358
+ getPatternExamples() {
359
+ return {
360
+ 'ubiquitous': 'THE system SHALL validate all user inputs',
361
+ 'event-driven': 'WHEN user clicks submit, THE system SHALL save the data',
362
+ 'state-driven': 'WHILE user is logged in, THE system SHALL display the dashboard',
363
+ 'unwanted': 'THE system SHALL NOT expose sensitive data in logs',
364
+ 'optional': 'IF payment amount exceeds 10000, THEN THE system SHALL require additional verification',
365
+ };
366
+ }
367
+ }
368
+ //# sourceMappingURL=EarsToSmtConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EarsToSmtConverter.js","sourceRoot":"","sources":["../../src/converters/EarsToSmtConverter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Converters Module Exports
3
+ */
4
+ export { EarsToSmtConverter } from './EarsToSmtConverter.js';
5
+ export type { EarsPatternType, EarsPattern, SmtFormula, SmtDeclaration, ConversionResult, ConversionOptions, TransformationRule, } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/converters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EACV,eAAe,EACf,WAAW,EACX,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Converters Module Exports
3
+ */
4
+ export { EarsToSmtConverter } from './EarsToSmtConverter.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/converters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Converter Types
3
+ *
4
+ * EARS→SMT変換の型定義
5
+ */
6
+ /**
7
+ * EARSパターンタイプ
8
+ */
9
+ export type EarsPatternType = 'ubiquitous' | 'event-driven' | 'state-driven' | 'unwanted' | 'optional';
10
+ /**
11
+ * EARSパターン解析結果
12
+ */
13
+ export interface EarsPattern {
14
+ /** パターンタイプ */
15
+ type: EarsPatternType;
16
+ /** 原文 */
17
+ original: string;
18
+ /** システム名 */
19
+ system: string;
20
+ /** 要件/応答 */
21
+ requirement: string;
22
+ /** イベント(event-drivenの場合) */
23
+ event?: string;
24
+ /** 状態(state-drivenの場合) */
25
+ state?: string;
26
+ /** 条件(optionalの場合) */
27
+ condition?: string;
28
+ /** 否定フラグ(unwantedの場合) */
29
+ negated?: boolean;
30
+ }
31
+ /**
32
+ * SMT論理式
33
+ */
34
+ export interface SmtFormula {
35
+ /** SMT-LIB2形式の文字列 */
36
+ smtLib2: string;
37
+ /** 変数宣言 */
38
+ declarations: SmtDeclaration[];
39
+ /** アサーション */
40
+ assertions: string[];
41
+ /** メタデータ */
42
+ metadata: {
43
+ /** 元のEARSパターン */
44
+ earsPattern: EarsPattern;
45
+ /** 変換に使用したルール */
46
+ transformationRules: string[];
47
+ /** 警告 */
48
+ warnings: string[];
49
+ };
50
+ }
51
+ /**
52
+ * SMT変数宣言
53
+ */
54
+ export interface SmtDeclaration {
55
+ /** 変数名 */
56
+ name: string;
57
+ /** SMT型 */
58
+ type: string;
59
+ /** 説明 */
60
+ description?: string;
61
+ }
62
+ /**
63
+ * 変換結果
64
+ */
65
+ export interface ConversionResult {
66
+ /** 成功フラグ */
67
+ success: boolean;
68
+ /** SMT論理式(成功時) */
69
+ formula?: SmtFormula;
70
+ /** エラーメッセージ(失敗時) */
71
+ error?: string;
72
+ /** 警告メッセージ */
73
+ warnings: string[];
74
+ /** 変換時間(ミリ秒) */
75
+ duration: number;
76
+ }
77
+ /**
78
+ * 変換オプション
79
+ */
80
+ export interface ConversionOptions {
81
+ /** 厳密モード(警告をエラーとして扱う) */
82
+ strict?: boolean;
83
+ /** 変数の型推論を有効にする */
84
+ inferTypes?: boolean;
85
+ /** カスタム変数型マッピング */
86
+ typeMapping?: Record<string, string>;
87
+ /** デバッグ出力 */
88
+ debug?: boolean;
89
+ }
90
+ /**
91
+ * 変換ルール
92
+ */
93
+ export interface TransformationRule {
94
+ /** ルール名 */
95
+ name: string;
96
+ /** 適用対象のパターンタイプ */
97
+ patternTypes: EarsPatternType[];
98
+ /** 変換関数 */
99
+ transform: (pattern: EarsPattern) => string;
100
+ /** 優先度(高いほど先に適用) */
101
+ priority: number;
102
+ }
103
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/converters/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,cAAc,GACd,cAAc,GACd,UAAU,GACV,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,cAAc;IACd,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,YAAY;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,aAAa;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY;IACZ,QAAQ,EAAE;QACR,iBAAiB;QACjB,WAAW,EAAE,WAAW,CAAC;QACzB,iBAAiB;QACjB,mBAAmB,EAAE,MAAM,EAAE,CAAC;QAC9B,SAAS;QACT,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU;IACV,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS;IACT,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB;IAClB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,yBAAyB;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mBAAmB;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,aAAa;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,WAAW;IACX,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,MAAM,CAAC;IAC5C,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB"}