Skip to main content

Unreduced

Enum Unreduced 

Source
pub enum Unreduced {
    Cyclic,
    BudgetSpent,
    TooDeep,
}
Expand description

Why a reduction stopped before reaching a normal form.

normalize hands back a bare Term, so “this is the normal form” and “this is as far as I got” are THE SAME ANSWER — and the caller cannot tell them apart. That is not a precision loss, it is a soundness channel: a conversion check that compares two abandoned reductions and finds them equal has certified nothing.

A δ-cycle (a := b, b := a) proves no fuel constant can close the gap, because that reduction has no normal form at all. Only an error channel can.

It is nevertheless CONSERVATIVE rather than unsound, and the reason is worth stating because it is what a future change can break: reduce_step_opt is a FUNCTION of the term, so two reductions holding the same term after the same number of steps hold it forever after and therefore have the same normal form. A conversion check built on “normalise both sides, then compare” can be INCOMPLETE when a budget runs out — never wrong. The same determinism makes the cycle answer safe: normalize hands the INPUT back, and the only term that can be mistaken for is itself. Collapsing every non-normalising term to one answer instead — a shared Hole, say — would identify two unrelated cycles and let refl prove an equation between two well-typed terms that are not equal.

Variants§

§

Cyclic

The reduction returned to a term it had already produced, so it cycles forever. The term has NO normal form.

§

BudgetSpent

The step budget ran out. The term may or may not have a normal form.

§

TooDeep

The term nests deeper than the kernel will descend, so the reducer never started.

Trait Implementations§

Source§

impl Clone for Unreduced

Source§

fn clone(&self) -> Unreduced

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Unreduced

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Unreduced

Source§

fn eq(&self, other: &Unreduced) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for Unreduced

Source§

impl Eq for Unreduced

Source§

impl StructuralPartialEq for Unreduced

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.