use {
crate::{clause::ClauseIterable, Lit},
std::{fmt, i32},
};
#[derive(Debug, Clone)]
pub struct Proof(Vec<i32>);
mod proof {
use {super::*, std::fmt::Write};
impl fmt::Display for Proof {
fn fmt(&self, out: &mut fmt::Formatter) -> fmt::Result {
for &i in &self.0 {
if i == i32::MAX {
out.write_char('d')?
} else if i == 0 {
out.write_str(" 0\n")?
} else {
write!(out, " {}", i)?
}
}
write!(out, "0")?; Ok(())
}
}
impl Proof {
pub fn new() -> Self {
Proof(Vec::new())
}
fn push_lit(&mut self, lit: Lit) {
let i: i32 = (if lit.sign() { 1 } else { -1 }) * ((lit.var().idx() + 1) as i32);
self.0.push(i)
}
pub fn create_clause<C>(&mut self, c: &C)
where
C: ClauseIterable,
{
for lit in c.items() {
self.push_lit((*lit).into());
}
self.0.push(0);
}
pub fn delete_clause<C>(&mut self, c: &C)
where
C: ClauseIterable,
{
self.0.push(i32::MAX);
for lit in c.items() {
self.push_lit((*lit).into());
}
self.0.push(0);
}
}
}