use otter_sat::{
config::Config,
context::Context,
reports::Report,
structures::{
atom::Atom,
literal::{CLiteral, Literal},
valuation::Valuation,
},
};
fn main() {
let mut context: Context = Context::from_config(Config::default());
let characters = "model".chars().collect::<Vec<_>>();
let mut atom_count: u32 = 0;
for _character in &characters {
match context.fresh_atom() {
Ok(_) => atom_count += 1,
Err(_) => {
panic!("Atom limit exhausted.")
}
}
}
let mut model_count = 0;
while let Ok(Report::Satisfiable) = context.solve() {
model_count += 1;
let mut valuation_representation = String::new();
let mut exclusion_clause = Vec::new();
for (atom, value) in context.atom_db.valuation().atom_valued_pairs() {
match value {
true => valuation_representation.push(' '),
false => valuation_representation.push('-'),
}
valuation_representation.push(characters[(atom as usize) - 1]);
valuation_representation.push(' ');
exclusion_clause.push(CLiteral::new(atom as Atom, !value));
}
valuation_representation.pop();
println!("{model_count}\t {}", valuation_representation);
context.refresh();
match context.add_clause(exclusion_clause) {
Ok(_) => {}
Err(_) => break,
};
}
assert_eq!(model_count, 2_usize.pow(atom_count));
}