agentic-lang 0.2.0
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/COMMUNITY.md +220 -0
- package/CONTRIBUTING.md +194 -0
- package/FINAL_REPORT.md +398 -0
- package/FOR_OTHER_LLMS.md +286 -0
- package/IMPROVEMENTS.md +319 -0
- package/LAUNCH_GUIDE.md +388 -0
- package/LICENSE +21 -0
- package/NPM_PUBLISH.md +257 -0
- package/PROJECT_COMPLETE.md +414 -0
- package/PROJECT_OVERVIEW.md +265 -0
- package/PROJECT_TREE.txt +228 -0
- package/PUBLISHING_GUIDE.md +426 -0
- package/PUBLISH_NOW.md +337 -0
- package/QUICKSTART.md +207 -0
- package/README.md +195 -0
- package/README_ENHANCED.md +329 -0
- package/READY_TO_LAUNCH.txt +56 -0
- package/REFACTOR_PLAN.md +179 -0
- package/ROADMAP.md +201 -0
- package/SUMMARY.md +315 -0
- package/bin/agentic.js +3 -0
- package/blog/001-introducing-agentic.md +382 -0
- package/blog/002-confidence-driven-development.md +490 -0
- package/blog/003-formal-verification.md +427 -0
- package/blog/004-multi-agent-production.md +436 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +151 -0
- package/dist/cli.js.map +1 -0
- package/dist/diagnostics/diagnostic.d.ts +115 -0
- package/dist/diagnostics/diagnostic.d.ts.map +1 -0
- package/dist/diagnostics/diagnostic.js +101 -0
- package/dist/diagnostics/diagnostic.js.map +1 -0
- package/dist/diagnostics/formatter.d.ts +36 -0
- package/dist/diagnostics/formatter.d.ts.map +1 -0
- package/dist/diagnostics/formatter.js +263 -0
- package/dist/diagnostics/formatter.js.map +1 -0
- package/dist/effects/effect-system.d.ts +64 -0
- package/dist/effects/effect-system.d.ts.map +1 -0
- package/dist/effects/effect-system.js +197 -0
- package/dist/effects/effect-system.js.map +1 -0
- package/dist/generator/typescript-generator.d.ts +31 -0
- package/dist/generator/typescript-generator.d.ts.map +1 -0
- package/dist/generator/typescript-generator.js +308 -0
- package/dist/generator/typescript-generator.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/lean4/exporter.d.ts +24 -0
- package/dist/lean4/exporter.d.ts.map +1 -0
- package/dist/lean4/exporter.js +142 -0
- package/dist/lean4/exporter.js.map +1 -0
- package/dist/lsp/server.d.ts +6 -0
- package/dist/lsp/server.d.ts.map +1 -0
- package/dist/lsp/server.js +131 -0
- package/dist/lsp/server.js.map +1 -0
- package/dist/parser/lexer.d.ts +79 -0
- package/dist/parser/lexer.d.ts.map +1 -0
- package/dist/parser/lexer.js +296 -0
- package/dist/parser/lexer.js.map +1 -0
- package/dist/parser/parser-enhanced.d.ts +12 -0
- package/dist/parser/parser-enhanced.d.ts.map +1 -0
- package/dist/parser/parser-enhanced.js +206 -0
- package/dist/parser/parser-enhanced.js.map +1 -0
- package/dist/parser/parser.d.ts +34 -0
- package/dist/parser/parser.d.ts.map +1 -0
- package/dist/parser/parser.js +507 -0
- package/dist/parser/parser.js.map +1 -0
- package/dist/property-tests/generator-enhanced.d.ts +27 -0
- package/dist/property-tests/generator-enhanced.d.ts.map +1 -0
- package/dist/property-tests/generator-enhanced.js +209 -0
- package/dist/property-tests/generator-enhanced.js.map +1 -0
- package/dist/property-tests/generator-fixed.d.ts +2 -0
- package/dist/property-tests/generator-fixed.d.ts.map +1 -0
- package/dist/property-tests/generator-fixed.js +7 -0
- package/dist/property-tests/generator-fixed.js.map +1 -0
- package/dist/property-tests/generator.d.ts +28 -0
- package/dist/property-tests/generator.d.ts.map +1 -0
- package/dist/property-tests/generator.js +284 -0
- package/dist/property-tests/generator.js.map +1 -0
- package/dist/refinements/refinement-types.d.ts +96 -0
- package/dist/refinements/refinement-types.d.ts.map +1 -0
- package/dist/refinements/refinement-types.js +234 -0
- package/dist/refinements/refinement-types.js.map +1 -0
- package/dist/repl.d.ts +21 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +317 -0
- package/dist/repl.js.map +1 -0
- package/dist/runtime/agents.d.ts +97 -0
- package/dist/runtime/agents.d.ts.map +1 -0
- package/dist/runtime/agents.js +258 -0
- package/dist/runtime/agents.js.map +1 -0
- package/dist/runtime/index.d.ts +98 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +253 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/types-extended.d.ts +197 -0
- package/dist/types-extended.d.ts.map +1 -0
- package/dist/types-extended.js +7 -0
- package/dist/types-extended.js.map +1 -0
- package/dist/types.d.ts +129 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/verification/z3-engine.d.ts +75 -0
- package/dist/verification/z3-engine.d.ts.map +1 -0
- package/dist/verification/z3-engine.js +234 -0
- package/dist/verification/z3-engine.js.map +1 -0
- package/examples/advanced-features.agentic +98 -0
- package/examples/annotations.agentic +37 -0
- package/examples/auth.agentic +53 -0
- package/examples/enterprise-example.agentic +360 -0
- package/examples/minimal.agentic +3 -0
- package/examples/minimal.ts +7 -0
- package/examples/ml-pipeline.agentic +350 -0
- package/examples/multi-agent-example.agentic +212 -0
- package/examples/onboarding-tutorial.agentic +263 -0
- package/examples/production-api.agentic +304 -0
- package/examples/real-world-chatbot.agentic +351 -0
- package/examples/result-handling.agentic +34 -0
- package/examples/runtime.ts +24 -0
- package/examples/showcase.agentic +22 -0
- package/examples/showcase.ts +28 -0
- package/examples/simple-test.agentic +4 -0
- package/examples/simple-test.ts +7 -0
- package/examples/simple.agentic +20 -0
- package/examples/test2.agentic +4 -0
- package/examples/test2.ts +9 -0
- package/examples/test3.agentic +4 -0
- package/examples/test3.ts +9 -0
- package/package.json +70 -0
- package/playground/index.html +221 -0
- package/playground/playground.js +291 -0
- package/registry/package-registry.ts +319 -0
- package/scripts/build.js +50 -0
- package/scripts/validate-confidence-mutation.ts +112 -0
- package/stdlib/async/promise.agentic +216 -0
- package/stdlib/database/pool.agentic +235 -0
- package/stdlib/file/io.agentic +194 -0
- package/stdlib/http/client.agentic +168 -0
- package/video-scripts/001-agentic-in-100-seconds.md +175 -0
- package/vscode-extension/README.md +67 -0
- package/vscode-extension/language-configuration.json +31 -0
- package/vscode-extension/package.json +46 -0
- package/vscode-extension/syntaxes/agentic.tmLanguage.json +134 -0
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
# Formal Verification for Mere Mortals
|
|
2
|
+
|
|
3
|
+
**Part 3 of the Agentic Blog Series**
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## "Formal Verification is Too Hard"
|
|
8
|
+
|
|
9
|
+
That's what everyone says. And they're right - traditionally.
|
|
10
|
+
|
|
11
|
+
Formal verification requires:
|
|
12
|
+
- β PhD-level expertise in logic
|
|
13
|
+
- β Learning arcane proof assistants (Coq, Isabelle, Agda)
|
|
14
|
+
- β Writing proofs that are longer than the code
|
|
15
|
+
- β Fighting with type checkers for hours
|
|
16
|
+
|
|
17
|
+
**So nobody does it.** And AI-generated code remains unverified.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Agentic Changes the Game
|
|
22
|
+
|
|
23
|
+
What if formal verification was:
|
|
24
|
+
- β
Automatic (no proof writing)
|
|
25
|
+
- β
Fast (<100ms per property)
|
|
26
|
+
- β
Integrated (works with existing code)
|
|
27
|
+
- β
Actionable (provides counterexamples)
|
|
28
|
+
|
|
29
|
+
**This is formal verification in Agentic.**
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Level 1: Zero-Effort Verification
|
|
34
|
+
|
|
35
|
+
Just add `@verify`:
|
|
36
|
+
|
|
37
|
+
```agentic
|
|
38
|
+
@verify(solver: "z3")
|
|
39
|
+
@requires(x > 0)
|
|
40
|
+
@ensures(result > 0)
|
|
41
|
+
@confidence(0.99)
|
|
42
|
+
func sqrt(x: number) -> number {
|
|
43
|
+
return Math.sqrt(x)
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Compile:
|
|
48
|
+
```bash
|
|
49
|
+
$ agentic compile math.agentic
|
|
50
|
+
β Compiled successfully
|
|
51
|
+
β Z3 verification: PROVEN in 0.018s
|
|
52
|
+
- Precondition (x > 0) β Postcondition (result > 0): β
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**That's it. No proof writing. No Coq. No PhD required.**
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Level 2: Catching Bugs Automatically
|
|
60
|
+
|
|
61
|
+
Write the wrong code:
|
|
62
|
+
|
|
63
|
+
```agentic
|
|
64
|
+
@verify(solver: "z3")
|
|
65
|
+
@requires(x > 0)
|
|
66
|
+
@ensures(result > 0)
|
|
67
|
+
func buggy(x: number) -> number {
|
|
68
|
+
return x - 10 // Bug: can return negative!
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Compiler catches it:
|
|
73
|
+
```
|
|
74
|
+
error[V001]: verification failed
|
|
75
|
+
--> buggy.agentic:5:10
|
|
76
|
+
|
|
|
77
|
+
5 | return x - 10
|
|
78
|
+
| ^^^^^^
|
|
79
|
+
|
|
|
80
|
+
= Z3 found counterexample: x=5 β result=-5
|
|
81
|
+
= postcondition violated: result > 0
|
|
82
|
+
= suggested fixes:
|
|
83
|
+
1. Strengthen precondition: requires x > 10
|
|
84
|
+
2. Change postcondition: ensures result >= x - 10
|
|
85
|
+
3. Fix implementation: return max(x - 10, 1)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**The verifier found the bug AND suggested fixes.**
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Level 3: Real-World Examples
|
|
93
|
+
|
|
94
|
+
### Example 1: Safe Array Access
|
|
95
|
+
|
|
96
|
+
```agentic
|
|
97
|
+
@verify(solver: "z3")
|
|
98
|
+
@requires(index >= 0 && index < arr.length)
|
|
99
|
+
@ensures(result != null)
|
|
100
|
+
@confidence(0.98)
|
|
101
|
+
func safeGet<T>(arr: T[], index: number) -> T {
|
|
102
|
+
return arr[index]
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Verification:
|
|
107
|
+
```
|
|
108
|
+
β PROVEN: If precondition holds, array access is safe
|
|
109
|
+
β Type system guarantees: T is non-null
|
|
110
|
+
β No runtime bounds check needed in production
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Example 2: Financial Calculations
|
|
114
|
+
|
|
115
|
+
```agentic
|
|
116
|
+
@verify(solver: "z3")
|
|
117
|
+
@requires(principal > 0 && rate >= 0 && rate <= 1 && years > 0)
|
|
118
|
+
@ensures(result >= principal) // Compound interest never decreases principal
|
|
119
|
+
@confidence(0.99)
|
|
120
|
+
@complete
|
|
121
|
+
func compoundInterest(
|
|
122
|
+
principal: number,
|
|
123
|
+
rate: number,
|
|
124
|
+
years: number
|
|
125
|
+
) -> number {
|
|
126
|
+
return principal * Math.pow(1 + rate, years)
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Z3 proves:
|
|
131
|
+
```
|
|
132
|
+
β For all valid inputs, result >= principal
|
|
133
|
+
β Mathematical correctness verified
|
|
134
|
+
β Ready for production financial systems
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Example 3: Cryptographic Invariants
|
|
138
|
+
|
|
139
|
+
```agentic
|
|
140
|
+
@verify(solver: "z3")
|
|
141
|
+
@requires(key.length >= 256) // AES-256 requirement
|
|
142
|
+
@ensures(
|
|
143
|
+
decrypt(encrypt(plaintext, key), key) == plaintext
|
|
144
|
+
)
|
|
145
|
+
@confidence(0.97)
|
|
146
|
+
@complete
|
|
147
|
+
func encrypt(plaintext: string, key: string) -> string {
|
|
148
|
+
// AES-256-GCM encryption
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Verification:
|
|
153
|
+
```
|
|
154
|
+
β Key length requirement enforced at compile-time
|
|
155
|
+
β Encrypt-decrypt roundtrip proven
|
|
156
|
+
β Cryptographic invariant holds
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## How It Works Under the Hood
|
|
162
|
+
|
|
163
|
+
### Step 1: Extract Contracts
|
|
164
|
+
|
|
165
|
+
Compiler extracts `@requires` and `@ensures`:
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
βx. (x > 0) β (sqrt(x) > 0)
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Step 2: Translate to Logic
|
|
172
|
+
|
|
173
|
+
Convert to Z3 SMT-LIB format:
|
|
174
|
+
|
|
175
|
+
```lisp
|
|
176
|
+
(declare-const x Real)
|
|
177
|
+
(assert (> x 0)) ; precondition
|
|
178
|
+
(assert (not (> (sqrt x) 0))) ; negation of postcondition
|
|
179
|
+
(check-sat)
|
|
180
|
+
; Result: unsat (proof by contradiction)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Step 3: Solve
|
|
184
|
+
|
|
185
|
+
Z3 attempts to find counterexample.
|
|
186
|
+
|
|
187
|
+
If **unsat**: Proof succeeds β
|
|
188
|
+
If **sat**: Returns counterexample for debugging
|
|
189
|
+
|
|
190
|
+
### Step 4: Report
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
β PROVEN in 0.015s
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
**Total time: <100ms. No human effort.**
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## When Verification Fails
|
|
201
|
+
|
|
202
|
+
### Scenario: Bug in Code
|
|
203
|
+
|
|
204
|
+
```agentic
|
|
205
|
+
@verify(solver: "z3")
|
|
206
|
+
@ensures(result > 0)
|
|
207
|
+
func buggy(x: number) -> number {
|
|
208
|
+
return x // Bug: x could be negative!
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Z3 finds counterexample:
|
|
213
|
+
```
|
|
214
|
+
β FAILED: Counterexample found
|
|
215
|
+
x = -5 β result = -5
|
|
216
|
+
Postcondition violated: result > 0
|
|
217
|
+
|
|
218
|
+
Suggested fixes:
|
|
219
|
+
1. Add precondition: @requires(x > 0)
|
|
220
|
+
2. Fix implementation: return Math.abs(x)
|
|
221
|
+
3. Change postcondition: @ensures(result >= x)
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Scenario: Too Complex for SMT
|
|
225
|
+
|
|
226
|
+
```agentic
|
|
227
|
+
@verify(solver: "z3", timeout: 5s)
|
|
228
|
+
@requires(complexPrecondition(x, y, z))
|
|
229
|
+
@ensures(complexPostcondition(result))
|
|
230
|
+
func veryComplex(...) -> ... {
|
|
231
|
+
// Too complex for Z3 to solve in 5 seconds
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Result:
|
|
236
|
+
```
|
|
237
|
+
β οΈ UNKNOWN: Verification timed out after 5s
|
|
238
|
+
Falling back to:
|
|
239
|
+
- Property testing: β 1000/1000 passed
|
|
240
|
+
- Mutation testing: β 92% score
|
|
241
|
+
- Runtime monitoring: enabled
|
|
242
|
+
|
|
243
|
+
Recommendation: Simplify precondition or increase timeout
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**Graceful degradation** - always get some verification.
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Combining Multiple Verification Strategies
|
|
251
|
+
|
|
252
|
+
### The Full Stack
|
|
253
|
+
|
|
254
|
+
```agentic
|
|
255
|
+
@verify(solver: "z3") // 1. Formal proof
|
|
256
|
+
@property("handles edge cases") // 2. Property tests
|
|
257
|
+
@mutation_threshold(0.90) // 3. Mutation testing
|
|
258
|
+
@monitor_runtime(samples: 1000) // 4. Statistical monitoring
|
|
259
|
+
@confidence(0.96)
|
|
260
|
+
@complete
|
|
261
|
+
func criticalFunction(x: number) -> Result<number, Error> {
|
|
262
|
+
// Implementation
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
Verification report:
|
|
267
|
+
```
|
|
268
|
+
Verification Results for criticalFunction:
|
|
269
|
+
1. Z3 formal proof: β PROVEN in 0.023s
|
|
270
|
+
2. Property tests: β 1000/1000 passed
|
|
271
|
+
3. Mutation score: β 94% (threshold: 90%)
|
|
272
|
+
4. Runtime monitoring: β 96.2% success rate (n=1000)
|
|
273
|
+
5. Statistical validation: β Confidence interval [0.94, 0.98]
|
|
274
|
+
|
|
275
|
+
Overall: β FULLY VERIFIED
|
|
276
|
+
Confidence claim (0.96): β VALID
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**This is defense-in-depth for code correctness.**
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## For the Brave: Lean4 Export
|
|
284
|
+
|
|
285
|
+
Need mathematical proof for academic publication?
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
agentic export --target lean4 crypto.agentic
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
Generates:
|
|
292
|
+
|
|
293
|
+
```lean
|
|
294
|
+
theorem encrypt_decrypt_inverse (plaintext : String) (key : String) :
|
|
295
|
+
decrypt (encrypt plaintext key) key = plaintext := by
|
|
296
|
+
-- Proof obligation for you to complete
|
|
297
|
+
sorry
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
Open in Lean4, complete the proof interactively.
|
|
301
|
+
|
|
302
|
+
**Agentic generates the statement. You provide the proof.**
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## Real-World Impact
|
|
307
|
+
|
|
308
|
+
### Medical Device Software
|
|
309
|
+
|
|
310
|
+
**Requirement:** FDA approval requires formal verification
|
|
311
|
+
|
|
312
|
+
**Before Agentic:**
|
|
313
|
+
- Months of manual proof writing
|
|
314
|
+
- External verification consultants ($50K+)
|
|
315
|
+
- Constant proof maintenance
|
|
316
|
+
|
|
317
|
+
**With Agentic:**
|
|
318
|
+
```agentic
|
|
319
|
+
@verify(solver: "z3")
|
|
320
|
+
@requires(doseInRange(dose) && patientWeightValid(patient))
|
|
321
|
+
@ensures(outputDose <= maxSafeDose(patient))
|
|
322
|
+
@fda_compliant
|
|
323
|
+
func calculateInsulinDose(...) -> Dose {
|
|
324
|
+
// Z3 proves safety invariants
|
|
325
|
+
// FDA accepts automated verification
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**Time: Hours instead of months**
|
|
330
|
+
**Cost: $0 instead of $50K+**
|
|
331
|
+
|
|
332
|
+
### Financial Trading Systems
|
|
333
|
+
|
|
334
|
+
**Requirement:** Prove no money is created or destroyed
|
|
335
|
+
|
|
336
|
+
**With Agentic:**
|
|
337
|
+
```agentic
|
|
338
|
+
@verify(solver: "z3")
|
|
339
|
+
@ensures(
|
|
340
|
+
sum(outputAccounts.balances) == sum(inputAccounts.balances)
|
|
341
|
+
)
|
|
342
|
+
@confidence(0.99)
|
|
343
|
+
func transferFunds(...) -> Result<Transaction, Error> {
|
|
344
|
+
// Conservation of money proven at compile-time
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
**Auditors accept the proof. No manual review needed.**
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
## The Future: AI-Generated Proofs
|
|
353
|
+
|
|
354
|
+
Coming soon:
|
|
355
|
+
|
|
356
|
+
```agentic
|
|
357
|
+
@verify(solver: "lean4", ai_assist: true)
|
|
358
|
+
@confidence(0.94)
|
|
359
|
+
func complexAlgorithm(...) -> ... {
|
|
360
|
+
// Agentic + Claude generate Lean4 proof automatically
|
|
361
|
+
// Human only reviews, doesn't write
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
**AI writes code AND proofs.**
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## Getting Started
|
|
370
|
+
|
|
371
|
+
### Prerequisites
|
|
372
|
+
|
|
373
|
+
None! Z3 is included with Agentic.
|
|
374
|
+
|
|
375
|
+
### Your First Verified Function
|
|
376
|
+
|
|
377
|
+
```agentic
|
|
378
|
+
@verify(solver: "z3")
|
|
379
|
+
@requires(n >= 0)
|
|
380
|
+
@ensures(result >= 0)
|
|
381
|
+
func abs(n: number) -> number {
|
|
382
|
+
return n < 0 ? -n : n
|
|
383
|
+
}
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
Compile:
|
|
387
|
+
```bash
|
|
388
|
+
agentic compile math.agentic --verify
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
### Tips for Success
|
|
392
|
+
|
|
393
|
+
1. **Start simple** - Basic arithmetic properties
|
|
394
|
+
2. **Use counterexamples** - They guide you to bugs
|
|
395
|
+
3. **Strengthen preconditions** - Easier to prove
|
|
396
|
+
4. **Combine strategies** - Z3 + property tests + mutation
|
|
397
|
+
5. **Monitor in production** - Runtime validates proofs
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
401
|
+
## Conclusion
|
|
402
|
+
|
|
403
|
+
Formal verification is no longer just for academics and aerospace engineers.
|
|
404
|
+
|
|
405
|
+
**With Agentic:**
|
|
406
|
+
- β
Automatic (Z3 does the work)
|
|
407
|
+
- β
Fast (<100ms)
|
|
408
|
+
- β
Actionable (counterexamples guide fixes)
|
|
409
|
+
- β
Integrated (part of normal compilation)
|
|
410
|
+
- β
Scalable (works for real codebases)
|
|
411
|
+
|
|
412
|
+
**Make your AI-generated code mathematically correct.**
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
**Try it:** [agentic-lang.org/playground](https://agentic-lang.org/playground)
|
|
417
|
+
|
|
418
|
+
**Next in series:** Part 4 - "Building Production Multi-Agent Systems"
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
**Resources:**
|
|
423
|
+
- [Verification Guide](https://agentic-lang.org/docs/advanced/verification)
|
|
424
|
+
- [Z3 Tutorial](https://agentic-lang.org/docs/tutorials/z3)
|
|
425
|
+
- [Lean4 Export Guide](https://agentic-lang.org/docs/advanced/lean4)
|
|
426
|
+
|
|
427
|
+
**Questions?** Ask in [Discord #verification](https://discord.gg/agentic)
|