use std::ops::Deref;
use std::sync::Arc;
use crate::formulas::{EncodedFormula, FormulaFactory, Literal};
use crate::solver::minisat::sat::Tristate::True;
use crate::solver::minisat::sat::{sign, var, MsVar};
use crate::solver::minisat::MiniSat;
impl MiniSat {
pub fn formula_on_solver(&self, f: &FormulaFactory) -> Arc<[EncodedFormula]> {
let mut formulas = Vec::new();
for clause_ref in &self.underlying_solver.clauses {
let lits: Vec<Literal> = clause_ref
.borrow()
.deref()
.data
.iter()
.map(|&lit| Literal::new(self.underlying_solver.variable_for_idx(var(lit)).unwrap(), !sign(lit)))
.collect();
formulas.push(f.clause(&lits));
}
self.underlying_solver
.vars
.iter()
.enumerate()
.filter(|(_, var)| var.level == Some(0))
.map(|(i, var)| Literal::new(self.underlying_solver.variable_for_idx(MsVar(i)).unwrap(), var.assignment == True))
.for_each(|lit| formulas.push(lit.into()));
if !self.underlying_solver.ok {
formulas.push(f.falsum());
}
formulas.into()
}
}