use vampire_prover::{Function, Options, Problem, ProofRes, Term, forall};
fn main() {
let mult = Function::new("mult", 2);
let inv = Function::new("inv", 1);
let one = Function::constant("1");
let mul = |x: Term, y: Term| -> Term { mult.with([x, y]) };
let right_identity = forall(|x| mul(x, one).eq(x));
let right_inverse = forall(|x| {
let inv_x = inv.with(x);
mul(x, inv_x).eq(one)
});
let associativity = forall(|x| forall(|y| forall(|z| mul(mul(x, y), z).eq(mul(x, mul(y, z))))));
let left_identity = forall(|x| mul(one, x).eq(x));
let (solution, proof) = Problem::new(Options::new())
.with_axiom(right_identity)
.with_axiom(right_inverse)
.with_axiom(associativity)
.conjecture(left_identity)
.solve_and_prove();
if let Some(proof) = proof {
println!("{}", proof);
}
assert_eq!(solution, ProofRes::Proved);
}