跳转到正文

Z3 SMT 求解器引擎 ​

Z3 是由微软研究院(Microsoft Research)开发的定理证明器与可满足性模理论(SMT, Satisfiability Modulo Theories)求解器。在 WaSHI 中,Z3 提供强大的命题逻辑推理与不可行模型的冲突诊断(Unsat Core 提取)能力。


安装 ​

Z3 作为可选的 peer dependency 提供:

bash
npm install z3-solver

何时选择 Z3? ​

  1. Unsat Core 冲突诊断: 当你的 MIP 或规则模型不可行(Infeasible / Unsat),需要定位究竟是哪些命名约束相互矛盾时。
  2. 布尔逻辑与规则引擎建模: 当问题包含复杂的逻辑关系(如蕴含 implies、异或 xor、取反 not 以及嵌套布尔表达式与算术约束的混合)时。
  3. 精确数学保证: Z3 支持精确有理数运算,能够避免浮点舍入误差带来的精度问题。

基本用法 ​

typescript
import { Model, expr } from "@ohtaman/washi";
import "@ohtaman/washi/solvers/z3";

const model = new Model({ solver: "z3" });

const x = model.integer("x", { lb: 0, ub: 10 });
const y = model.integer("y", { lb: 0, ub: 10 });

model.constraint(expr`${x} + ${y} == 15`, "sum_15");
model.constraint(expr`${x} >= 8`, "x_at_least_8");

await model.solve();
console.log(`x = ${x.value}, y = ${y.value}`);

提取不可行冲突核心 (model.check()) ​

配合 Z3 使用 await model.check() 可以检验模型的可满足性,并在模型不可满足("Unsat")时提取相互冲突的命名约束子集(conflicts / unsatCore):

typescript
const model = new Model({ solver: "z3" });
const a = model.continuous("a");

model.constraint(expr`${a} >= 10`, "req_A");
model.constraint(expr`${a} <= 5`, "req_B");

const result = await model.check();

if (result.status === "Unsat") {
  console.log("冲突的约束:", result.conflicts); // 或 model.conflicts / model.unsatCore
  // ["req_A", "req_B"]
}

浏览器安全要求(跨源隔离) ​

在浏览器环境中,Z3 WASM 引擎依赖 pthreads 多线程与 SharedArrayBuffer,因此需要配置跨源隔离响应头(COOP / COEP)。详细配置步骤请参阅 跨源隔离配置指南。

运行时故障恢复与线程清理 ​

如果 Z3 Worker 遇到致命的运行时错误,该实例上挂起的操作将显式 reject 并抛出错误,同时损坏的运行时实例会被作废(不会将运行时错误误判为 Sat 或 Unsat);后续调用 solve() 或 check() 时会自动初始化全新的 Z3 运行时。

在卸载浏览器视图或销毁工作线程池时,若需显式终止 Z3 的 pthread Worker 线程,可从 @ohtaman/washi/solvers/z3 导入并调用 killZ3Threads()。

Released under the MIT License.