#[derive(Debug)]
pub struct SolverConfig {
program: String,
args: Vec<String>,
}
impl SolverConfig {
pub fn default() -> Self { Self::cvc5() }
pub fn cvc5() -> Self {
let mut conf = Self::program("cvc5");
conf.add_args_array([
"--lang", "smt2",
"--force-logic", "ALL",
"--full-saturate-quant",
"--finite-model-find",
]);
conf
}
pub fn program<T: ToString>(name: T) -> Self {
Self {
program: name.to_string(),
args: Vec::new(),
}
}
pub fn add_arg<T: ToString>(&mut self, arg: T) {
self.args.push(arg.to_string())
}
pub fn add_args_array<T: ToString, const N: usize>(&mut self, args: [T;N]) {
for a in args {
self.add_arg(a)
}
}
pub fn add_args_vec(&mut self, mut args: Vec<String>) {
self.args.append(&mut args)
}
pub fn context_builder(&self) -> easy_smt::ContextBuilder {
println!("{:?}", self);
let mut builder = easy_smt::ContextBuilder::new();
builder.solver(&self.program, &self.args);
builder
}
}