#![forbid(unsafe_code)]
use trit_eval::EquivalenceResult;
mod encode;
mod equiv;
mod order;
mod quantify;
pub use equiv::{
PremiseCheck, equivalent_bdd, equivalent_bdd_best, equivalent_bdd_best_with_limits,
equivalent_bdd_with, equivalent_bdd_with_limits, equivalent_bdd_with_order,
premise_counterexample_bdd, premise_counterexample_bdd_with,
premise_counterexample_bdd_with_order, satisfiable_bdd, satisfiable_bdd_with,
satisfiable_bdd_with_order,
};
pub use order::{VarOrder, order_variables};
pub use quantify::{
Quantified, Quantifier, quantify_bdd, quantify_bdd_best, quantify_bdd_best_with_limits,
quantify_bdd_with, quantify_bdd_with_order,
};
#[derive(Debug, thiserror::Error)]
pub enum BddError {
#[error("BDD 变量数 {0} 超过 u16 上限")]
TooManyVariables(usize),
#[error("BDD 缺少反例赋值")]
MissingWitness,
#[error("表达式里没有变量 {0}")]
UnknownVariable(String),
#[error("表达式超出预算: {0}")]
Limit(#[from] trit_core::limits::LimitError),
#[error("BDD 节点数超过上限 {limit}")]
BudgetExceeded {
limit: usize,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct BddLimits {
pub max_nodes: usize,
}
impl Default for BddLimits {
fn default() -> Self {
Self {
max_nodes: 1_000_000,
}
}
}
impl BddLimits {
pub const UNLIMITED: Self = Self {
max_nodes: usize::MAX,
};
}
#[derive(Debug, Clone, Copy, Default)]
pub struct BddRequest<'a> {
pub order: Option<&'a [String]>,
pub limits: BddLimits,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BddVerdict {
pub result: EquivalenceResult,
pub nodes: usize,
}