#![allow(clippy::useless_format)]
use std::{collections::HashSet, fmt::Write};
use crate::{
db::ClauseKey,
structures::{clause::Clause, literal::Literal},
};
use super::Transcriber;
impl Transcriber {
fn write_id_to_string(key: &ClauseKey, string: &mut String) {
match key {
ClauseKey::OriginalUnit(literal) => match literal.polarity() {
true => write!(string, "0110{}", literal.atom()),
false => write!(string, "0100{}", literal.atom()),
},
ClauseKey::AdditionUnit(literal) => match literal.polarity() {
true => write!(string, "0210{}", literal.atom()),
false => write!(string, "0200{}", literal.atom()),
},
ClauseKey::OriginalBinary(index) => write!(string, "0300{index}"),
ClauseKey::AdditionBinary(index) => write!(string, "0400{index}"),
ClauseKey::Original(index) => write!(string, "0500{index}"),
ClauseKey::Addition(index, _) => write!(string, "0600{index}"),
};
}
fn write_clause_to_string(&self, clause: &impl Clause, string: &mut String) {
for literal in clause.literals() {
let atom = literal.atom();
match literal.polarity() {
true => write!(string, " {atom} "),
false => write!(string, "-{atom} "),
};
}
}
pub fn flush(&mut self) {
for step in &self.step_buffer {
let _ = std::io::Write::write(&mut self.file, step.as_bytes());
}
self.step_buffer.clear();
}
pub fn transcribe_unsatisfiable_clause(&mut self) {
let mut step = String::new();
writeln!(step, "a 1 0\n"); writeln!(step, "f 1 0\n");
self.step_buffer.push(step)
}
pub fn transcribe_clause(
&mut self,
step_id: char,
key: &ClauseKey,
clause: &impl Clause,
premises: bool,
) {
let mut step = format!("{step_id} ");
Transcriber::write_id_to_string(key, &mut step);
write!(step, " ");
self.write_clause_to_string(clause, &mut step);
writeln!(step, "0");
if premises {
let Some(steps) = self.resolution_queue.pop_front() else {
panic!("Err(err::FRATError::CorruptResolutionQ)")
};
write!(step, " l ");
for premise in steps.into_iter() {
Transcriber::write_id_to_string(&premise, &mut step);
write!(step, " ");
}
writeln!(step, "0");
}
self.step_buffer.push(step);
}
pub fn note_resolution(&mut self, premises: &HashSet<ClauseKey>) {
self.resolution_queue
.push_back(premises.iter().copied().collect());
}
pub fn transcribe_active(&mut self, key: ClauseKey, clause: &impl Clause) {
let mut step = format!("f ");
Transcriber::write_id_to_string(&key, &mut step);
write!(step, " ");
self.write_clause_to_string(clause, &mut step);
writeln!(step, "0");
self.step_buffer.push(step);
}
}