A production-ready auto-active verification system for Python, similar to Dafny and Verus
Project description
Veripy
A production-ready auto-active verification system for Python, similar to Dafny and Verus.
Overview
Veripy transforms Python code verification from a work-in-progress into a production-ready system with automatic invariant inference, comprehensive error reporting, and a professional CLI.
Soundness note
Veripy is not sound for full Python today. The core VC engine is intended to be sound for a restricted, “verification-oriented” subset (roughly: side-effect-free code over int/bool plus mathematical arrays, with structured if/while, and user-supplied invariants), and it rejects or approximates many Python features (exceptions, dynamic dispatch, aliasing/mutation semantics of real lists/dicts/objects, etc.).
Recent work is moving toward a Dafny/Boogie-style explicit heap model for aliasing + mutation (lists/dicts/fields as references) and for exception safety (e.g., bounds and div/mod by zero become proof obligations). This is still a work in progress and many Python features remain unsupported.
Key Features
Auto-Active Verification
- Automatic loop invariant inference
- Type-based constraint generation
- Arithmetic lemma automation
- Multiple inference strategies (NONE, SIMPLE, AGGRESSIVE, FULL)
Production Readiness
- Professional CLI with multiple commands
- Rich terminal output with syntax highlighting
- JSON output for CI/CD
- Comprehensive error reporting with counterexamples
- Source location tracking
Recursive Functions
- Termination checking with decreases clauses
- Tail recursion detection
- Call graph analysis
Installation
pip install py-veripy
For development:
make install-dev
Usage
Basic Verification
import veripy as vp
vp.enable_verification()
@vp.verify(requires=['x > 0'], ensures=['ans == x * 2'])
def double(x: int) -> int:
return x * 2
vp.verify_all()
Deppy-Style Contracts
import veripy as vp
vp.enable_verification()
vp.scope("demo")
@vp.verify()
@vp.requires("x > 0")
@vp.guarantee("result > x")
def succ(x: int) -> int:
return x + 1
vp.verify_all()
Veripy normalizes Deppy-style result postconditions to its internal ans
binding and also exposes lightweight sidecar metadata helpers such as
@vp.about(...), @vp.proof_for(...), and @vp.z3_hint(...).
Lean4 Export
import veripy as vp
@vp.verify(requires=["x > 0"], ensures=["ans > x"])
def succ(x: int) -> int:
return x + 1
cert = vp.compile_to_lean(succ)
print(cert.render())
# Optional, if Lean is installed locally:
# cert.verify_with_lean()
The Lean backend now exports Veripy's actual heap-lowered VC obligations rather
than re-translating raw Python syntax. In practice that means the generated Lean
theorems track the same pre => wp and side-condition formulas the SMT backend
checks, including summary assumptions for verified callees and explicit heap
state binders when lists/dicts/fields are involved.
CLI Usage
# Verify files
veripy verify file.py
# With counterexamples and statistics
veripy verify --counterexample --statistics file.py
# JSON output for CI/CD
veripy verify --output json file.py
Auto-Active Features
from veripy.auto_active import auto_infer_invariants
invariants = auto_infer_invariants({
"loop_var": "i",
"init": 0,
"condition": "i < n",
"body": []
})
Architecture
veripy/
├── core/ # Verification condition generation, AST transformation
├── auto_active/ # Auto-active features (invariant inference, lemmas)
├── cli/ # Command-line interface
├── parser/ # Syntax parsing
├── typecheck/ # Type checking
├── error_reporter.py
├── recursive.py
└── prettyprint.py
Development
make test # Run tests
make test-cov # With coverage
make lint # Linting
make format # Formatting
make typecheck # Type checking
make check # All checks
Dependencies
z3-solver- SMT solverrich- Terminal outputclick- CLI frameworkpyparsing- Expression parsingapronpy- Abstract interpretation
Related Work
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file py_veripy-0.1.0.tar.gz.
File metadata
- Download URL: py_veripy-0.1.0.tar.gz
- Upload date:
- Size: 105.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
951956db11d6a255cf562ad97469c392a644e5c2cac8fd5dada544d2e1255a9b
|
|
| MD5 |
15133763a55f310666552d9553086baa
|
|
| BLAKE2b-256 |
9059f67a47391133a38f0fd6be66b4e65da07d252e693df50c2800e387d4f589
|
File details
Details for the file py_veripy-0.1.0-py3-none-any.whl.
File metadata
- Download URL: py_veripy-0.1.0-py3-none-any.whl
- Upload date:
- Size: 124.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f507c04ef50f65f86b04d0138d24d26adc536c2ca037dca0989bc0caa330d9c4
|
|
| MD5 |
cb506ffeaffeb8b7b0aa88870cc33ff0
|
|
| BLAKE2b-256 |
26abbfd83d38396a18c78d0e24818e6d9b7edcf6549545a1e5fea91302afeda5
|