use formally::smt::backends::z3::Z3;
use formally::{smt::*, support::*};
#[test]
fn solve() -> Result<()> {
let mut solver = Solver::new(&Config::new().backend(Z3))?;
let p = solver.declare(Declaration::constant("p", theories::Core::Bool()))?;
let q = solver.declare(Declaration::constant("q", theories::Core::Bool()))?;
solver.require(term!(=> #p #q))?;
solver.require(p)?;
solver.push()?;
solver.require(term!(not q))?;
assert_eq!(solver.check()?, Answer::No);
solver.pop()?;
let answer = solver.check()?;
match answer {
Answer::Yes => match solver.model()? {
Some(model) => assert_eq!(model.value(&q), Some(ModelValue::from(true))),
None => panic!("there is no model!"),
},
_ => panic!("wrong answer: {answer:?}"),
}
Ok(())
}