use crate::Primitives;
pub trait BoundedRecursion<P: Primitives> {
type DescentMeasure: DescentMeasure<P>;
fn measure(&self) -> &Self::DescentMeasure;
type BaseCase: BaseCase<P>;
fn base_case(&self) -> &Self::BaseCase;
type RecursiveCase: RecursiveCase<P>;
fn recursive_case(&self) -> &Self::RecursiveCase;
type Predicate: crate::kernel::predicate::Predicate<P>;
fn base_predicate(&self) -> &Self::Predicate;
type ComputationDatum: crate::user::morphism::ComputationDatum<P>;
fn recursion_body(&self) -> &Self::ComputationDatum;
fn initial_measure(&self) -> P::NonNegativeInteger;
}
pub trait DescentMeasure<P: Primitives> {
fn measure_value(&self) -> P::NonNegativeInteger;
}
pub trait BaseCase<P: Primitives>: crate::kernel::predicate::MatchArm<P> {}
pub trait RecursiveCase<P: Primitives>: crate::kernel::predicate::MatchArm<P> {}
pub trait RecursiveStep<P: Primitives> {
type Transform: crate::user::morphism::Transform<P>;
fn step_decomposition(&self) -> &Self::Transform;
type DescentMeasure: DescentMeasure<P>;
fn step_measure_pre(&self) -> &Self::DescentMeasure;
fn step_measure_post(&self) -> &Self::DescentMeasure;
}
pub trait RecursionTrace<P: Primitives>: crate::bridge::trace::ComputationTrace<P> {}
pub trait StructuralRecursion<P: Primitives>: BoundedRecursion<P> {}