1#![forbid(unsafe_code)]
16
17use trit_eval::EquivalenceResult;
18
19mod encode;
20mod equiv;
21mod order;
22mod quantify;
23
24pub use equiv::{
25 PremiseCheck, equivalent_bdd, equivalent_bdd_best, equivalent_bdd_best_with_limits,
26 equivalent_bdd_with, equivalent_bdd_with_limits, equivalent_bdd_with_order,
27 premise_counterexample_bdd, premise_counterexample_bdd_with,
28 premise_counterexample_bdd_with_order, satisfiable_bdd, satisfiable_bdd_with,
29 satisfiable_bdd_with_order,
30};
31pub use order::{VarOrder, order_variables};
32pub use quantify::{
33 Quantified, Quantifier, quantify_bdd, quantify_bdd_best, quantify_bdd_best_with_limits,
34 quantify_bdd_with, quantify_bdd_with_order,
35};
36
37#[derive(Debug, thiserror::Error)]
39pub enum BddError {
40 #[error("BDD 变量数 {0} 超过 u16 上限")]
42 TooManyVariables(usize),
43 #[error("BDD 缺少反例赋值")]
45 MissingWitness,
46 #[error("表达式里没有变量 {0}")]
48 UnknownVariable(String),
49 #[error("表达式超出预算: {0}")]
51 Limit(#[from] trit_core::limits::LimitError),
52 #[error("BDD 节点数超过上限 {limit}")]
54 BudgetExceeded {
55 limit: usize,
57 },
58}
59
60#[derive(Debug, Clone, Copy, PartialEq, Eq)]
66pub struct BddLimits {
67 pub max_nodes: usize,
69}
70
71impl Default for BddLimits {
72 fn default() -> Self {
73 Self {
74 max_nodes: 1_000_000,
75 }
76 }
77}
78
79impl BddLimits {
80 pub const UNLIMITED: Self = Self {
82 max_nodes: usize::MAX,
83 };
84}
85
86#[derive(Debug, Clone, Copy, Default)]
88pub struct BddRequest<'a> {
89 pub order: Option<&'a [String]>,
91 pub limits: BddLimits,
93}
94
95#[derive(Debug, Clone, PartialEq, Eq)]
97pub struct BddVerdict {
98 pub result: EquivalenceResult,
100 pub nodes: usize,
102}