1个不稳定版本
使用旧的Rust 2015
0.1.0 | 2016年1月18日 |
---|
#37 in #sat-solver
12KB
142 行
sat
Rust中定义和解决布尔可满足性(SAT)问题的接口。
lib.rs
:
定义和解决SAT问题的接口。
布尔可满足性问题(简称SAT)询问,对于给定的布尔公式,是否存在对公式变量的赋值(真或假),使得公式评估为真。
SAT是NP完全,这意味着两件事
-
许多重要问题(例如在程序分析、电路设计或物流规划中)可能被视为SAT的实例。
-
人们相信不存在一种算法可以有效地解决所有SAT的实例。
尽管(2)存在,但观察(1)是重要的,因为存在一些算法(如DPLL)可以有效地解决实践中遇到的SAT实例。
这个crate允许用户制定SAT的实例,并使用现成的SAT求解器来解决它们。
// Create a SAT instance.
let mut i = sat::Instance::new();
let x = i.fresh_var();
let y = i.fresh_var();
let z = i.fresh_var();
i.assert_any(&[x, z]); // (x OR z)
i.assert_any(&[!x, !y, !z]); // AND (!x OR !y OR !z)
i.assert_any(&[y]); // AND (y = TRUE)
// Use the external program `minisat` as a solver.
let s = sat::solver::Dimacs::new(|| Command::new("minisat"));
// Solve the instance and check that it meets our requirements.
let a = s.solve(&i).unwrap();
assert!(a.get(x) || a.get(z));
assert!(!a.get(x) || !a.get(y) || !a.get(z));
assert!(a.get(y));
// Add a clause which makes the instance impossible to satisfy,
// and check that the solver recognizes as much.
i.assert_any(&[!y]);
assert!(s.solve(&i).is_none());
要查看更详细的示例,请参阅examples/petersen.rs
,该文件生成Petersen图的3色图。
依赖关系
~415–660KB