Struct chalk_engine::Minimums

source ·
pub(crate) struct Minimums {
    pub(crate) positive: TimeStamp,
    pub(crate) negative: TimeStamp,
}
Expand description

The Minimums structure is used to track the dependencies between some item E on the evaluation stack. In particular, it tracks cases where the success of E depends (or may depend) on items deeper in the stack than E (i.e., with lower DFNs).

positive tracks the lowest index on the stack to which we had a POSITIVE dependency (e.g. foo(X) :- bar(X)) – meaning that in order for E to succeed, the dependency must succeed. It is initialized with the index of the predicate on the stack. So imagine we have a stack like this:

    // 0 foo(X)   <-- bottom of stack
    // 1 bar(X)
    // 2 baz(X)   <-- top of stack

In this case, positive would be initially 0, 1, and 2 for foo, bar, and baz respectively. This reflects the fact that the answers for foo(X) depend on the answers for foo(X). =)

Now imagine that we had a clause baz(X) :- foo(X), inducing a cycle. In this case, we would update positive for baz(X) to be 0, reflecting the fact that its answers depend on the answers for foo(X). Similarly, the minimum for bar would (eventually) be updated, since it too transitively depends on foo. foo is unaffected.

negative tracks the lowest index on the stack to which we had a NEGATIVE dependency (e.g., foo(X) :- not { bar(X) }) – meaning that for E to succeed, the dependency must fail. This is initially usize::MAX, reflecting the fact that the answers for foo(X) do not depend on not(foo(X)). When negative cycles are encountered, however, this value must be updated.

Fields§

§positive: TimeStamp§negative: TimeStamp

Implementations§

source§

impl Minimums

source

pub(crate) const MAX: Minimums = _

source

pub(crate) fn take_minimums(&mut self, other: &Minimums)

Update our fields to be the minimum of our current value and the values from other.

source

pub(crate) fn minimum_of_pos_and_neg(&self) -> TimeStamp

Trait Implementations§

source§

impl Clone for Minimums

source§

fn clone(&self) -> Minimums

Returns a copy 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 Minimums

source§

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

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

impl Copy for Minimums

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
§

impl<T> Cast for T

§

fn cast<U>(self, interner: <U as HasInterner>::Interner) -> U
where Self: CastTo<U>, U: HasInterner,

Cast a value to type U using CastTo.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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,

§

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>,

§

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>,

§

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.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more