use vyre_primitives::dnnf::{
compile_dnnf as primitive_compile, model_count as primitive_count, DnnfDag,
};
#[must_use]
pub fn compile_precondition(
clauses: &[Vec<(u32, bool)>],
num_vars: u32,
max_depth: u32,
) -> DnnfDag {
use crate::observability::{bump, dataflow_fixpoint_calls};
bump(&dataflow_fixpoint_calls);
primitive_compile(clauses, num_vars, max_depth)
}
#[must_use]
pub fn count_models(dag: &DnnfDag) -> u64 {
use crate::observability::{bump, dataflow_fixpoint_calls};
bump(&dataflow_fixpoint_calls);
primitive_count(dag)
}
#[must_use]
pub fn is_satisfiable(dag: &DnnfDag) -> bool {
count_models(dag) > 0
}
#[must_use]
pub fn is_tautology(dag: &DnnfDag, num_vars: u32) -> bool {
if num_vars >= 64 {
return false; }
count_models(dag) == 1u64 << num_vars
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_formula_is_tautology() {
let dag = compile_precondition(&[], 3, 4);
assert!(is_tautology(&dag, 3));
assert!(is_satisfiable(&dag));
}
#[test]
fn contradiction_is_unsatisfiable() {
let clauses = vec![vec![(0u32, true)], vec![(0, false)]];
let dag = compile_precondition(&clauses, 1, 4);
assert!(!is_satisfiable(&dag));
assert!(!is_tautology(&dag, 1));
}
#[test]
fn single_literal_satisfiable_not_tautology() {
let dag = compile_precondition(&[vec![(0u32, true)]], 2, 4);
assert!(is_satisfiable(&dag));
assert!(!is_tautology(&dag, 2));
assert_eq!(count_models(&dag), 2);
}
#[test]
fn matches_primitive_directly() {
let clauses = vec![vec![(0u32, true), (1, false)], vec![(1, true), (2, true)]];
let via_substrate = compile_precondition(&clauses, 3, 8);
let via_primitive = primitive_compile(&clauses, 3, 8);
assert_eq!(via_substrate, via_primitive);
assert_eq!(
count_models(&via_substrate),
primitive_count(&via_primitive)
);
}
#[test]
fn depth_budget_terminates() {
let clauses = vec![vec![(0u32, true), (1, true)], vec![(2, true), (3, true)]];
let dag = compile_precondition(&clauses, 4, 1);
assert!(count_models(&dag) > 0);
}
#[test]
fn tautology_conservative_at_64_vars() {
let dag = compile_precondition(&[], 64, 4);
assert!(!is_tautology(&dag, 64));
}
}