[API Coherence] Report for 2026-02-24 - Solver APIs & Optimize APIs #8757
Closed
Replies: 1 comment
-
|
This discussion was automatically closed because it expired on 2026-03-03T16:54:39.535Z.
|
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
Run #1 — Solver APIs & Optimize APIs
Progress
High Priority Issues
1. TypeScript
Optimize— cannot retrieve optimization results (getLower/getUppermissing)What's missing: The TypeScript
Optimizeinterface exposesmaximize(expr)andminimize(expr)methods, but both returnvoid— discarding the handle index returned by the C API. As a result, users have no way to retrieve optimization bounds after callingcheck(). The C API functionsZ3_optimize_get_lower(ctx, opt, idx)andZ3_optimize_get_upper(ctx, opt, idx)are never called from the TypeScript binding.Available in: Python (
lower(obj),upper(obj)), Java (Handle.getLower(),Handle.getUpper()), .NET (Handle.Lower,Handle.Upper), C++ (optimize::upper(),optimize::lower()), Go (GetLower(index),GetUpper(index)), OCaml (get_lower,get_upper)Missing in: TypeScript/JavaScript
Suggested fix:
maximize(expr)andminimize(expr)intypes.tsto return a numeric handle index (or an opaqueHandleobject).getLower(index: number): Expr(Name)andgetUpper(index: number): Expr(Name)to theOptimize(Name)interface.high-level.ts.getLowerAsVector(index: number)andgetUpperAsVector(index: number)for boxed/epsilon bounds.File:
src/api/js/src/high-level/types.ts,src/api/js/src/high-level/high-level.tsVerified: Checked
high-level.tslines 2309–2315 —Z3.optimize_maximizereturn value is discarded; nooptimize_get_lower/optimize_get_uppercalls found anywhere in the TypeScript high-level binding.2. TypeScript
Optimize— missing utility APIsWhat's missing: Several
OptimizeAPI methods present in all other languages are absent from the TypeScriptOptimizeinterface:Z3_optimize_from_fileZ3_optimize_get_unsat_coreZ3_optimize_get_objectivesZ3_optimize_get_reason_unknownSuggested fix: Add these methods to the
Optimize(Name)interface intypes.tsand implement them inOptimizeImplinhigh-level.ts:fromFile(filename: string): void— wrapsZ3_optimize_from_fileunsatCore(): AstVector(Name, Bool<Name)>— wrapsZ3_optimize_get_unsat_coreobjectives(): AstVector(Name, Expr<Name)>— wrapsZ3_optimize_get_objectivesreasonUnknown(): string— wrapsZ3_optimize_get_reason_unknownFile:
src/api/js/src/high-level/types.ts,src/api/js/src/high-level/high-level.tsMedium Priority Issues
3.
Z3_solver_to_dimacs_string— missing in Java, .NET, TypeScript, Go, OCaml, RustWhat's missing: Converting a solver's Boolean formula to DIMACS CNF format (used with external SAT solvers).
Available in: Python (
Solver.dimacs(include_names=True)at line 7930), C++ (solver::dimacs()atz3++.h:3114)Missing in: Java, .NET (Solver class; Goal has
ToDimacsbut not Solver), TypeScript, Go, OCaml, RustSuggested fix:
public String toDimacs(boolean includeNames)toSolver.javacallingNative.solverToDimacsString(...)public string ToDimacs(bool includeNames = true)toSolver.cscallingNative.Z3_solver_to_dimacs_string(...)dimacs(includeNames?: boolean): stringtoSolver(Name)interface and implement inhigh-level.tsfunc (s *Solver) Dimacs(includeNames bool) stringtosolver.golet to_dimacs x include_names = Z3native.solver_to_dimacs_string (gc x) x include_namesC API:
Z3_solver_to_dimacs_string(ctx, solver, include_names)inz3_api.h4.
Z3_solver_translate— missing in TypeScript, Go, RustWhat's missing: Translating a solver to a different context (needed when working with multiple Z3 contexts).
Available in: Python (
Solver.translate(target_ctx)at line 7906), Java (Solver.translate(ctx)at line 564), .NET (Solver.Translate(ctx)at line 591), C++ (solver::solver(solver, translate)constructor, line 2948), OCaml (Solver.translateat line 1956)Missing in: TypeScript, Go, Rust
Suggested fix:
translate(target: Context(Name)): Solver(Name)toSolver(Name)interface; implement usingZ3.solver_translate(ctx, ptr, target.ptr)func (s *Solver) Translate(target *Context) *Solvertosolver.gopub fn translate(&self, target: &Context) -> Solvertosolver.rs; noteZ3_solver_translateis already inz3-sys5.
Z3_solver_get_proof— missing in TypeScript, GoWhat's missing: Retrieving a proof of unsatisfiability after a solver returns
unsat(requires solver with proof generation enabled).Available in: Python (
Solver.proof()at line 7817), Java (Solver.getProof()at line 315), .NET (Solver.Proofat line 478), C++, OCaml (Solver.get_proofat line 1936), Rust (Solver::get_proof())Missing in: TypeScript, Go
Suggested fix:
proof(): Expr(Name) | nulltoSolver(Name)interface; implement usingZ3.solver_get_prooffunc (s *Solver) GetProof() *Exprtosolver.go6.
Z3_solver_add_simplifier— missing in Java, Go, RustWhat's missing: Attaching a simplifier to the solver to pre-process assertions before solving.
Available in: Python (
SolverFor(..., simplifier)pattern), .NET (via constructor), C++ (solver::solver(solver, simplifier)at line 3406), OCaml (Solver.add_simplifierat line 1955), TypeScript (Solver.addSimplifier())Missing in: Java, Go, Rust
Suggested fix:
public Solver addSimplifier(Simplifier simplifier)toSolver.javafunc (s *Solver) AddSimplifier(simplifier *Simplifier) *Solvertosolver.gopub fn add_simplifier(&self, simplifier: &Simplifier) -> Solvertosolver.rs7.
Z3_solver_register_on_clause— missing in TypeScript, Go, Java, OCaml, RustWhat's missing: Registering a callback to be notified when the solver derives a new clause (for monitoring/proof logging).
Available in: Python (via
OnClauseclass at line 12117), .NET (viaOnClause.cs), C++ (viaon_clauseclass,z3++.h:4601)Missing in: TypeScript, Go, Java, OCaml, Rust
Suggested fix:
registerOnClause(callback: (proof_hint: Expr(Name), clause: AstVector(Name)) => void): voidto theSolver(Name)interfacefunc (s *Solver) RegisterOnClause(callback func(*Expr, []*Expr))tosolver.goOnClausehelper class similar to Python's/C#'s implementationlet register_on_clause ...binding toz3.ml8.
Z3_optimize_translate— missing in TypeScript, OCaml, Go, RustWhat's missing: Translating an Optimize object to a different context.
Available in: Python (check), Java (not found), .NET (not found), C++ (
optimize::translate(),z3++.h:3560), Go (not found)Missing in: TypeScript, OCaml, Go, Rust
Note: This is less widely supported; mainly available in C++ but still an API gap for users who work with multiple contexts.
9. Rust
z3crate — broadly missing newer Solver/Optimize APIsWhat's missing: The high-level Rust
z3crate is missing many solver diagnostic and advanced APIs that are available in other language bindings. Thez3-syslow-level crate also needs updates for some newer C API functions.Missing from Rust
z3crateSolver:interrupt()—Z3_solver_interruptcube()—Z3_solver_cube(z3-sys has it, high-level crate doesn't)get_units()/get_non_units()— (z3-sys hasget_units; z3 crate doesn't expose either)get_trail()—Z3_solver_get_trailcongruence_root()/congruence_next()/congruence_explain()set_initial_value()—Z3_solver_set_initial_valueadd_simplifier()—Z3_solver_add_simplifiersolve_for()—Z3_solver_solve_forfrom_file()—Z3_solver_from_fileto_dimacs()—Z3_solver_to_dimacs_stringtranslate()—Z3_solver_translate(z3-sys has it; z3 crate doesn't wrap it)Missing from Rust
z3crateOptimize:get_lower()/get_upper()from_file()—Z3_optimize_from_filetranslate()—Z3_optimize_translateregister_model_eh()—Z3_optimize_register_model_ehMissing from
z3-sys(FFI bindings not exposed):Z3_solver_interruptZ3_solver_to_dimacs_stringZ3_solver_add_simplifierZ3_solver_get_trailZ3_solver_register_on_clauseZ3_solver_congruence_root/_next/_explainZ3_solver_solve_forZ3_solver_set_initial_valueSuggested fix: Contributions to https://github.com/prove-rs/z3.rs to update
z3-sysFFI bindings and add high-level wrappers.Low Priority Issues
10.
Z3_solver_to_dimacs_stringinconsistency —.NEThas it forGoalbut not forSolverWhat's missing:
.NET'sGoal.csexposesToDimacs()(line 228) viaZ3_goal_to_dimacs_string, but theSolverclass has no equivalent forZ3_solver_to_dimacs_string. Users working with SAT problems inSolvermust useGoalas a workaround.Comparison Tables
Solver API Coverage Matrix
Z3_solver_checkZ3_solver_assertZ3_solver_get_modelZ3_solver_get_proofZ3_solver_translateZ3_solver_to_dimacs_stringZ3_solver_add_simplifierZ3_solver_interruptZ3_solver_cubeZ3_solver_get_unitsZ3_solver_get_non_unitsZ3_solver_get_trailZ3_solver_congruence_*Z3_solver_set_initial_valueZ3_solver_register_on_clauseZ3_solver_solve_forZ3_solver_from_fileOptimize API Coverage Matrix
Z3_optimize_checkZ3_optimize_get_lowerZ3_optimize_get_upperZ3_optimize_get_lower_as_vectorZ3_optimize_get_upper_as_vectorZ3_optimize_get_unsat_coreZ3_optimize_get_objectivesZ3_optimize_get_reason_unknownZ3_optimize_from_fileZ3_optimize_translateZ3_optimize_register_model_ehZ3_optimize_set_initial_valueNotes on Analysis Method
src/api/z3_api.handsrc/api/z3_optimization.hsrc/api/python/z3/z3.pysrc/api/dotnet/Solver.cs,src/api/dotnet/Optimize.cs,src/api/dotnet/OnClause.cssrc/api/c++/z3++.hsrc/api/java/Solver.java,src/api/java/Optimize.javasrc/api/js/src/high-level/types.ts,src/api/js/src/high-level/high-level.tssrc/api/go/solver.go,src/api/go/optimize.gosrc/api/ml/z3.ml,src/api/ml/z3.mlihttps://github.com/prove-rs/z3.rs(cloned at commit HEAD)Beta Was this translation helpful? Give feedback.
All reactions