[API Coherence] Report for March 5, 2026 - BitVector/Array/FPA APIs #8876
Closed
Replies: 1 comment
-
|
This discussion was automatically closed because it expired on 2026-03-12T23:40:47.599Z.
|
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
Summary
This run analyzed 5 API families across 8 language bindings (Java, .NET, C++, Python, TypeScript, OCaml, Go, Rust), with a focus on:
Statistics
🎉 Resolution Updates
Great progress! The following cached issues from the previous run (Feb 24, 2026) have been resolved:
✅ 1. Solver.toDimacs() - FULLY RESOLVED
All languages now support converting solvers to DIMACS format:
Solver.toDimacs(boolean includeNames)- src/api/java/Solver.java:587Solver.ToDimacs(bool includeNames)- src/api/dotnet/Solver.cs:658Solver.dimacs(includeNames: boolean)- src/api/js/src/high-level/high-level.ts:2151Solver.ToDimacs(includeNames bool)- src/api/go/solver.go:398Solver.to_dimacs- src/api/ml/z3.ml:1967✅ 2. TypeScript Optimize.getLower()/getUpper() - RESOLVED
✅ 3. TypeScript Optimize APIs - RESOLVED
fromFile(),unsatCore(),objectives(),reasonUnknown()✅ 4. TypeScript Optimize.translate() - RESOLVED
Progress Tracking
Completed API Families (5/~20)
Next Run (Planned)
Medium Priority Issues
1. Z3_solver_translate missing in Go, Rust
What: Move solver to a different context (useful for multi-context applications)
Available in: Python, Java, .NET, C++, OCaml, TypeScript
Missing in: Go, Rust
Fix:
Solver.Translate(target *Context) *Solvermethod insrc/api/go/solver.goSolver::translate(&self, target: &Context) -> Solver<'_>method inz3/src/solver.rs2. Z3_solver_get_proof missing in Go
What: Retrieve proof object after UNSAT result (critical for proof-carrying code)
Available in: Python, Java, .NET, C++, OCaml, Rust, TypeScript
Missing in: Go
Fix: Add
Solver.Proof() *ASTmethod insrc/api/go/solver.go, callingZ3_solver_get_proof3. Z3_solver_add_simplifier missing in Java, Rust
What: Add a simplifier to solver's preprocessor (improves performance on complex formulas)
Available in: Python, .NET, C++, OCaml, TypeScript, Go
Missing in: Java, Rust
Fix:
Solver.addSimplifier(Simplifier s)method insrc/api/java/Solver.javaSolver::add_simplifier(&self, simplifier: &Simplifier)inz3/src/solver.rs4. Z3_optimize_translate missing in OCaml, Go, Rust
What: Move optimize instance to a different context
Available in: Python, Java, .NET, C++, TypeScript
Missing in: OCaml, Go, Rust
Fix:
Optimize.translatefunction insrc/api/ml/z3.mlOptimize.Translate(target *Context) *Optimizeinsrc/api/go/optimize.goOptimize::translate(&self, target: &Context) -> Optimize<'_>inz3/src/optimize.rs5. Z3_mk_array_ext missing in TypeScript, Go
What: Array extensionality - returns an index where two arrays differ (very useful for debugging array constraints)
C API:
Z3_mk_array_ext(ctx, a1, a2)returns an indexisuch thata1[i] != a2[i]Available in: Python, Java, .NET, C++, OCaml, Rust
Missing in: TypeScript, Go
Fix:
arrayExt(a1: Array, a2: Array): Exprto Context classMkArrayExt(a1, a2 *AST) *ASTmethod6. Rust z3 crate missing many Solver/Optimize APIs
What: The Rust high-level bindings lack several advanced solver features
Missing APIs:
Solver::interrupt()- cancel ongoing check() callSolver::cube()- get partial model as cubeSolver::get_trail()- get solver trail (assigned literals)Solver::congruence_*()- congruence closure queriesSolver::solve_for()- solve w.r.t. specific variablesSolver::set_initial_value()- set initial value hintSolver::add_simplifier()- add preprocessorSolver::from_file()- load from SMT2 fileSolver::register_on_clause()- clause callbackOptimize::from_file()- load from fileAvailable in: Python, Java, .NET, C++, OCaml, Go, TypeScript (most of these)
Missing in: Rust (external crate: prove-rs/z3.rs)
Fix: The Rust bindings maintainers should add wrappers for these in
z3/src/solver.rsandz3/src/optimize.rsLow Priority Issues
7. Z3_solver_register_on_clause missing in most languages
What: Register callback for learned clauses (advanced feature for CDCL integration)
Available in: Python, .NET, C++
Missing in: TypeScript, Go, Java, OCaml, Rust
Priority: Low - very advanced feature, rarely used
Note: Requires callback mechanism support in each language
8. Java BitVecExpr missing convenience methods
What: Java lacks instance methods for common bit-vector operations
Issue: Operations like
rotateLeft(),rotateRight(),signExt(),zeroExt()must be called asctx.MkBVRotateLeft(expr, n)instead ofexpr.rotateLeft(n)Available as instance methods in: Python, TypeScript, .NET
Missing in: Java (only available via Context.Mk* static methods)
Fix: Add convenience methods to
src/api/java/BitVecExpr.java:9. Rust z3-sys missing FFI bindings for newer C APIs
What: The low-level FFI layer (z3-sys) doesn't expose some newer C API functions
Missing bindings:
Z3_solver_interrupt,Z3_solver_add_simplifier,Z3_solver_get_trail,Z3_solver_register_on_clause,Z3_solver_congruence_*,Z3_solver_solve_for,Z3_solver_set_initial_valueImpact: Even if high-level Rust bindings wanted to add these, they can't without FFI access
Fix: Update
z3-sys/src/lib.rsto include these C function declarations (they're likely auto-generated from z3_api.h)Observations
BitVector Operations
All languages have good coverage of basic BitVector operations (add, sub, mul, div, shifts, logical ops). Key observations:
RotateLeft(),RotateRight(),SignExt(),ZeroExt()BitVec(Bits)classContext.MkBVRotateLeft(),MkSignExt(), etc., plus overloaded variantszext(),sext(), inline helper functionsContext.Mk*methods, not as instance methodsArray Theory APIs
Good consistency across languages for core operations (
select,store,const_array):Z3_mk_selectandZ3_mk_storeZ3_mk_array_extmissing in TypeScript and Go (medium priority - useful for debugging)Z3_mk_array_defaultavailable in all checked languagesFloating-Point APIs
Not deeply analyzed in this run, but spot checks show good coverage in Python, C++, .NET, Java. Will analyze more thoroughly in a future run.
Developer Experience Notes
Recommendations
For Z3 Maintainers
Solver.Translate()andSolver.Proof()- straightforward C API wrappersBitVecExprfor better ergonomicsFor Rust z3.rs Maintainers (prove-rs/z3.rs)
For Future Analysis
Next run should focus on:
Beta Was this translation helpful? Give feedback.
All reactions