with one click
prove
// Prove validity of logical statements by negation and satisfiability checking. If the negation is unsatisfiable, the original statement is valid. Otherwise a counterexample is returned.
// Prove validity of logical statements by negation and satisfiability checking. If the negation is unsatisfiable, the original statement is valid. Otherwise a counterexample is returned.
Run AddressSanitizer and UndefinedBehaviorSanitizer on the Z3 test suite to detect memory errors, undefined behavior, and leaks. Logs each finding to z3agent.db.
Run Clang Static Analyzer (scan-build) on Z3 source and log structured findings to z3agent.db.
Measure Z3 performance on a formula or file. Collects wall-clock time, theory solver statistics, memory usage, and conflict counts. Results are logged to z3agent.db for longitudinal tracking.
Translate constraint problems into SMT-LIB2 or Z3 Python API code. Handles common problem classes including scheduling, graph coloring, arithmetic puzzles, and verification conditions.
Parse and interpret Z3 output for human consumption. Handles models, unsat cores, proofs, statistics, and error messages. Translates solver internals into plain-language explanations.
Solve constrained optimization problems using Z3. Supports minimization and maximization of objective functions over integer, real, and bitvector domains.
| name | prove |
| description | Prove validity of logical statements by negation and satisfiability checking. If the negation is unsatisfiable, the original statement is valid. Otherwise a counterexample is returned. |
Given a conjecture (an SMT-LIB2 assertion or a natural language claim), determine whether it holds universally. The method is standard: negate the conjecture and check satisfiability. If the negation is unsatisfiable, the original is valid. If satisfiable, the model is a counterexample.
Action:
Wrap the conjecture in (assert (not ...)) and append
(check-sat)(get-model).
Expectation: A complete SMT-LIB2 formula that negates the original conjecture with all variables declared.
Result: If the negation is well-formed, proceed to Step 2. If the conjecture is natural language, run encode first.
Example: to prove that (> x 3) implies (> x 1):
(declare-const x Int)
(assert (not (=> (> x 3) (> x 1))))
(check-sat)
(get-model)
Action: Invoke prove.py with the conjecture and variable declarations.
Expectation:
The script prints valid, invalid (with counterexample), unknown,
or timeout. A run entry is logged to z3agent.db.
Result:
On valid: proceed to explain if the user needs a summary.
On invalid: report the counterexample directly.
On unknown/timeout: try simplify first, or increase the timeout.
python3 scripts/prove.py --conjecture "(=> (> x 3) (> x 1))" --vars "x:Int"
For file input where the file contains the full negated formula:
python3 scripts/prove.py --file negated.smt2
With debug tracing:
python3 scripts/prove.py --conjecture "(=> (> x 3) (> x 1))" --vars "x:Int" --debug
Action: Read the prover output to determine validity of the conjecture.
Expectation:
One of valid, invalid (with counterexample), unknown, or timeout.
Result:
On valid: the conjecture holds universally.
On invalid: the model shows a concrete counterexample.
On unknown/timeout: the conjecture may require auxiliary lemmas or induction.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| conjecture | string | no | the assertion to prove (without negation) | |
| vars | string | no | variable declarations as "name:sort" pairs, comma-separated | |
| file | path | no | .smt2 file with the negated formula | |
| timeout | int | no | 30 | seconds |
| z3 | path | no | auto | path to z3 binary |
| debug | flag | no | off | verbose tracing |
| db | path | no | .z3-agent/z3agent.db | logging database |
Either conjecture (with vars) or file must be provided.