@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.
- package/README.md +62 -0
- package/dist/converters/EarsToSmtConverter.d.ts +102 -0
- package/dist/converters/EarsToSmtConverter.d.ts.map +1 -0
- package/dist/converters/EarsToSmtConverter.js +368 -0
- package/dist/converters/EarsToSmtConverter.js.map +1 -0
- package/dist/converters/index.d.ts +6 -0
- package/dist/converters/index.d.ts.map +1 -0
- package/dist/converters/index.js +5 -0
- package/dist/converters/index.js.map +1 -0
- package/dist/converters/types.d.ts +103 -0
- package/dist/converters/types.d.ts.map +1 -0
- package/dist/converters/types.js +7 -0
- package/dist/converters/types.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/formal-verify-tools.d.ts +60 -0
- package/dist/tools/formal-verify-tools.d.ts.map +1 -0
- package/dist/tools/formal-verify-tools.js +371 -0
- package/dist/tools/formal-verify-tools.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/traceability/ImpactAnalyzer.d.ts +103 -0
- package/dist/traceability/ImpactAnalyzer.d.ts.map +1 -0
- package/dist/traceability/ImpactAnalyzer.js +281 -0
- package/dist/traceability/ImpactAnalyzer.js.map +1 -0
- package/dist/traceability/TraceabilityDB.d.ts +123 -0
- package/dist/traceability/TraceabilityDB.d.ts.map +1 -0
- package/dist/traceability/TraceabilityDB.js +379 -0
- package/dist/traceability/TraceabilityDB.js.map +1 -0
- package/dist/traceability/index.d.ts +8 -0
- package/dist/traceability/index.d.ts.map +1 -0
- package/dist/traceability/index.js +6 -0
- package/dist/traceability/index.js.map +1 -0
- package/dist/traceability/types.d.ts +156 -0
- package/dist/traceability/types.d.ts.map +1 -0
- package/dist/traceability/types.js +7 -0
- package/dist/traceability/types.js.map +1 -0
- package/dist/verifiers/PostconditionVerifier.d.ts +105 -0
- package/dist/verifiers/PostconditionVerifier.d.ts.map +1 -0
- package/dist/verifiers/PostconditionVerifier.js +326 -0
- package/dist/verifiers/PostconditionVerifier.js.map +1 -0
- package/dist/verifiers/PreconditionVerifier.d.ts +87 -0
- package/dist/verifiers/PreconditionVerifier.d.ts.map +1 -0
- package/dist/verifiers/PreconditionVerifier.js +286 -0
- package/dist/verifiers/PreconditionVerifier.js.map +1 -0
- package/dist/verifiers/index.d.ts +7 -0
- package/dist/verifiers/index.d.ts.map +1 -0
- package/dist/verifiers/index.js +6 -0
- package/dist/verifiers/index.js.map +1 -0
- package/dist/verifiers/types.d.ts +109 -0
- package/dist/verifiers/types.d.ts.map +1 -0
- package/dist/verifiers/types.js +7 -0
- package/dist/verifiers/types.js.map +1 -0
- package/dist/z3/Z3Adapter.d.ts +92 -0
- package/dist/z3/Z3Adapter.d.ts.map +1 -0
- package/dist/z3/Z3Adapter.js +189 -0
- package/dist/z3/Z3Adapter.js.map +1 -0
- package/dist/z3/Z3ProcessFallback.d.ts +67 -0
- package/dist/z3/Z3ProcessFallback.d.ts.map +1 -0
- package/dist/z3/Z3ProcessFallback.js +287 -0
- package/dist/z3/Z3ProcessFallback.js.map +1 -0
- package/dist/z3/Z3WasmClient.d.ts +55 -0
- package/dist/z3/Z3WasmClient.d.ts.map +1 -0
- package/dist/z3/Z3WasmClient.js +172 -0
- package/dist/z3/Z3WasmClient.js.map +1 -0
- package/dist/z3/index.d.ts +9 -0
- package/dist/z3/index.d.ts.map +1 -0
- package/dist/z3/index.js +7 -0
- package/dist/z3/index.js.map +1 -0
- package/dist/z3/types.d.ts +82 -0
- package/dist/z3/types.d.ts.map +1 -0
- package/dist/z3/types.js +7 -0
- package/dist/z3/types.js.map +1 -0
- 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 @@
|
|
|
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"}
|