@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
|
@@ -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"}
|