pub fn prove<F, PW, DomainField, Challenger, Backend>(
    oracles: &mut MultilinearOracleSet<F>,
    witness_index: &mut MultilinearExtensionIndex<'_, PW::Underlier, PW::Scalar>,
    claims: impl IntoIterator<Item = EvalcheckClaim<F>>,
    switchover_fn: impl Fn(usize) -> usize + Clone + 'static,
    challenger: &mut Challenger,
    domain_factory: impl EvaluationDomainFactory<DomainField>,
    backend: Backend
) -> Result<GreedyEvalcheckProveOutput<F>, Error>
where F: TowerField + From<PW::Scalar>, PW: PackedFieldIndexable + PackedExtension<DomainField> + WithUnderlier, PW::Scalar: TowerField + From<F> + ExtensionField<DomainField>, PW::Underlier: PackScalar<PW::Scalar, Packed = PW>, DomainField: TowerField, Challenger: CanObserve<F> + CanSample<F>, Backend: ComputationBackend,