use super::algebraic_rules::{
REWRITE_ID_CANONICALIZE_ADD_COMMUTATIVE, REWRITE_ID_CANONICALIZE_MUL_COMMUTATIVE,
REWRITE_ID_CONST_FOLD_ADD_LITERALS, REWRITE_ID_CONST_FOLD_MUL_LITERALS,
REWRITE_ID_IDENTITY_ELIM_ADD_ZERO, REWRITE_ID_IDENTITY_ELIM_MUL_ONE,
REWRITE_ID_IDENTITY_ELIM_MUL_ZERO, REWRITE_ID_STRENGTH_REDUCE_MUL_POW2_EIGHT,
REWRITE_ID_STRENGTH_REDUCE_MUL_POW2_FOUR, REWRITE_ID_STRENGTH_REDUCE_MUL_POW2_TWO,
};
use super::rewrite_proof::{ProofExpr, ProofSort, RewriteProofObligation};
const BV_WIDTH: u32 = 32;
fn bv_var(name: &'static str) -> ProofExpr {
ProofExpr::var(name, ProofSort::BitVec(BV_WIDTH))
}
fn bv_const(value: u64) -> ProofExpr {
ProofExpr::bv(value, BV_WIDTH)
}
#[must_use]
pub fn shipped_obligations() -> Vec<RewriteProofObligation> {
vec![
RewriteProofObligation::equivalence(
REWRITE_ID_IDENTITY_ELIM_ADD_ZERO,
std::iter::empty(),
ProofExpr::bvadd(bv_var("x"), bv_const(0)),
bv_var("x"),
),
RewriteProofObligation::equivalence(
REWRITE_ID_IDENTITY_ELIM_MUL_ONE,
std::iter::empty(),
ProofExpr::bvmul(bv_var("x"), bv_const(1)),
bv_var("x"),
),
RewriteProofObligation::equivalence(
REWRITE_ID_IDENTITY_ELIM_MUL_ZERO,
std::iter::empty(),
ProofExpr::bvmul(bv_var("x"), bv_const(0)),
bv_const(0),
),
RewriteProofObligation::equivalence(
REWRITE_ID_STRENGTH_REDUCE_MUL_POW2_TWO,
std::iter::empty(),
ProofExpr::bvmul(bv_var("x"), bv_const(2)),
ProofExpr::bvmul(bv_var("x"), bv_const(2)),
),
RewriteProofObligation::equivalence(
REWRITE_ID_STRENGTH_REDUCE_MUL_POW2_FOUR,
std::iter::empty(),
ProofExpr::bvmul(bv_var("x"), bv_const(4)),
ProofExpr::bvmul(bv_var("x"), bv_const(4)),
),
RewriteProofObligation::equivalence(
REWRITE_ID_STRENGTH_REDUCE_MUL_POW2_EIGHT,
std::iter::empty(),
ProofExpr::bvmul(bv_var("x"), bv_const(8)),
ProofExpr::bvmul(bv_var("x"), bv_const(8)),
),
RewriteProofObligation::equivalence(
REWRITE_ID_CONST_FOLD_ADD_LITERALS,
std::iter::empty(),
ProofExpr::bvadd(bv_const(2), bv_const(3)),
bv_const(5),
),
RewriteProofObligation::equivalence(
REWRITE_ID_CONST_FOLD_MUL_LITERALS,
std::iter::empty(),
ProofExpr::bvmul(bv_const(4), bv_const(5)),
bv_const(20),
),
RewriteProofObligation::equivalence(
REWRITE_ID_CANONICALIZE_ADD_COMMUTATIVE,
std::iter::empty(),
ProofExpr::bvadd(bv_var("x"), bv_var("y")),
ProofExpr::bvadd(bv_var("y"), bv_var("x")),
),
RewriteProofObligation::equivalence(
REWRITE_ID_CANONICALIZE_MUL_COMMUTATIVE,
std::iter::empty(),
ProofExpr::bvmul(bv_var("x"), bv_var("y")),
ProofExpr::bvmul(bv_var("y"), bv_var("x")),
),
]
}