use super::common::{SmtCheckResult, SmtChecker, SmtObligation};
use crate::verify::{contract::Property, forward_visit::ForwardVisitResult, helpers::Callsite};
pub(crate) fn check<'tcx>(
checker: &SmtChecker<'tcx>,
callsite: &Callsite<'tcx>,
property: &Property<'tcx>,
forward: &ForwardVisitResult<'tcx>,
) -> SmtCheckResult {
let Some(predicates) = checker.property_numeric_predicates(callsite, property) else {
return SmtCheckResult::unknown("ValidNum predicates could not be resolved");
};
let smt_predicates = predicates
.iter()
.map(|predicate| checker.numeric_predicate_to_smt_predicate(callsite.caller, predicate))
.collect::<Option<Vec<_>>>();
let Some(smt_predicates) = smt_predicates else {
return SmtCheckResult::unknown("ValidNum predicate could not be lowered to SMT");
};
checker.prove_obligation(
callsite,
forward,
SmtObligation::Predicate {
predicates: smt_predicates,
},
)
}