#[cfg(doc)]
use crate::Solver;
use crate::branching::Brancher;
use crate::engine::ConstraintSatisfactionSolver;
use crate::engine::constraint_satisfaction_solver::CoreExtractionResult;
use crate::predicates::Predicate;
#[derive(Debug)]
pub struct UnsatisfiableUnderAssumptions<'solver, 'brancher, B: Brancher> {
pub(crate) solver: &'solver mut ConstraintSatisfactionSolver,
pub(crate) brancher: &'brancher mut B,
}
impl<'solver, 'brancher, B: Brancher> UnsatisfiableUnderAssumptions<'solver, 'brancher, B> {
pub fn new(
solver: &'solver mut ConstraintSatisfactionSolver,
brancher: &'brancher mut B,
) -> Self {
UnsatisfiableUnderAssumptions { solver, brancher }
}
pub fn extract_core(&mut self) -> Box<[Predicate]> {
match self.solver.extract_clausal_core(self.brancher) {
CoreExtractionResult::ConflictingAssumption(conflicting_assumption) => {
panic!(
"Conflicting assumptions were provided, found both {conflicting_assumption:?} and {:?}",
!conflicting_assumption
)
}
CoreExtractionResult::Core(core) => core.into(),
}
}
}
impl<B: Brancher> Drop for UnsatisfiableUnderAssumptions<'_, '_, B> {
fn drop(&mut self) {
self.solver.restore_state_at_root(self.brancher)
}
}