Struct chalk_engine::FlounderedSubgoal [−][src]
A “floundered” subgoal is one that contains unbound existential variables for which it cannot produce a value. The classic example of floundering is a negative subgoal:
not { Implemented(?T: Foo) }
The way the prolog solver works, it basically enumerates all the
ways that a given goal can be true. But we can’t use this
technique to find all the ways that ?T: Foo can be false – so
we call it floundered. In other words, we can evaluate a negative
goal, but only if we know what ?T is – we can’t use the
negative goal to help us figuring out ?T.
In addition to negative goals, we use floundering to prevent the
trait solver from trying to enumerate very large goals with tons
of answers. For example, we consider a goal like ?T: Sized to
“flounder”, since we can’t hope to enumerate all types that are
Sized. The same is true for other special traits like Clone.
Floundering can also occur indirectly. For example:
trait Foo { }
impl<T> Foo for T { }
trying to solve ?T: Foo would immediately require solving ?T: Sized, and hence would flounder.
Fields
floundered_literal: Literal<I>Literal that floundered.
floundered_time: TimeStampCurrent value of the strand’s clock at the time of floundering.
Trait Implementations
impl<I: Clone + Interner> Clone for FlounderedSubgoal<I>[src]
fn clone(&self) -> FlounderedSubgoal<I>[src]
pub fn clone_from(&mut self, source: &Self)1.0.0[src]
impl<I: Debug + Interner> Debug for FlounderedSubgoal<I>[src]
impl<I: Eq + Interner> Eq for FlounderedSubgoal<I>[src]
impl<I: Interner> Fold<I> for FlounderedSubgoal<I>[src]
type Result = FlounderedSubgoal<I>
The type of value that will be produced once folding is done.
Typically this is Self, unless Self contains borrowed
values, in which case owned values are produced (for example,
one can fold over a &T value where T: Fold, in which case
you get back a T, not a &T). Read more
fn fold_with<'i>(
self,
folder: &mut dyn Folder<'i, I>,
outer_binder: DebruijnIndex
) -> Fallible<Self::Result> where
I: 'i, [src]
self,
folder: &mut dyn Folder<'i, I>,
outer_binder: DebruijnIndex
) -> Fallible<Self::Result> where
I: 'i,
impl<I: Hash + Interner> Hash for FlounderedSubgoal<I>[src]
fn hash<__H: Hasher>(&self, state: &mut __H)[src]
pub fn hash_slice<H>(data: &[Self], state: &mut H) where
H: Hasher, 1.3.0[src]
H: Hasher,
impl<I: PartialEq + Interner> PartialEq<FlounderedSubgoal<I>> for FlounderedSubgoal<I>[src]
fn eq(&self, other: &FlounderedSubgoal<I>) -> bool[src]
fn ne(&self, other: &FlounderedSubgoal<I>) -> bool[src]
impl<I: Interner> StructuralEq for FlounderedSubgoal<I>[src]
impl<I: Interner> StructuralPartialEq for FlounderedSubgoal<I>[src]
impl<I: Interner> Visit<I> for FlounderedSubgoal<I>[src]
fn visit_with<'i, B>(
&self,
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
outer_binder: DebruijnIndex
) -> ControlFlow<B> where
I: 'i, [src]
&self,
visitor: &mut dyn Visitor<'i, I, BreakTy = B>,
outer_binder: DebruijnIndex
) -> ControlFlow<B> where
I: 'i,
Auto Trait Implementations
impl<I> RefUnwindSafe for FlounderedSubgoal<I> where
<I as Interner>::InternedGoal: RefUnwindSafe,
<I as Interner>::InternedProgramClauses: RefUnwindSafe,
<I as Interner>::InternedGoal: RefUnwindSafe,
<I as Interner>::InternedProgramClauses: RefUnwindSafe,
impl<I> Send for FlounderedSubgoal<I> where
<I as Interner>::InternedGoal: Send,
<I as Interner>::InternedProgramClauses: Send,
<I as Interner>::InternedGoal: Send,
<I as Interner>::InternedProgramClauses: Send,
impl<I> Sync for FlounderedSubgoal<I> where
<I as Interner>::InternedGoal: Sync,
<I as Interner>::InternedProgramClauses: Sync,
<I as Interner>::InternedGoal: Sync,
<I as Interner>::InternedProgramClauses: Sync,
impl<I> Unpin for FlounderedSubgoal<I> where
<I as Interner>::InternedGoal: Unpin,
<I as Interner>::InternedProgramClauses: Unpin,
<I as Interner>::InternedGoal: Unpin,
<I as Interner>::InternedProgramClauses: Unpin,
impl<I> UnwindSafe for FlounderedSubgoal<I> where
<I as Interner>::InternedGoal: UnwindSafe,
<I as Interner>::InternedProgramClauses: UnwindSafe,
<I as Interner>::InternedGoal: UnwindSafe,
<I as Interner>::InternedProgramClauses: UnwindSafe,
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized, [src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized, [src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized, [src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T[src]
impl<T> Cast for T[src]
pub fn cast<U>(self, interner: &<U as HasInterner>::Interner) -> U where
Self: CastTo<U>,
U: HasInterner, [src]
Self: CastTo<U>,
U: HasInterner,
impl<Q, K> Equivalent<K> for Q where
K: Borrow<Q> + ?Sized,
Q: Eq + ?Sized, [src]
K: Borrow<Q> + ?Sized,
Q: Eq + ?Sized,
pub fn equivalent(&self, key: &K) -> bool[src]
impl<T> From<T> for T[src]
impl<T> Instrument for T[src]
pub fn instrument(self, span: Span) -> Instrumented<Self>[src]
pub fn in_current_span(self) -> Instrumented<Self>[src]
impl<T, U> Into<U> for T where
U: From<T>, [src]
U: From<T>,
impl<T, I> Shift<I> for T where
I: Interner,
T: Fold<I>, [src]
I: Interner,
T: Fold<I>,
pub fn shifted_in(self, interner: &I) -> <T as Fold<I>>::Result[src]
pub fn shifted_in_from(
self,
interner: &I,
source_binder: DebruijnIndex
) -> <T as Fold<I>>::Result[src]
self,
interner: &I,
source_binder: DebruijnIndex
) -> <T as Fold<I>>::Result
pub fn shifted_out_to(
self,
interner: &I,
target_binder: DebruijnIndex
) -> Result<<T as Fold<I>>::Result, NoSolution>[src]
self,
interner: &I,
target_binder: DebruijnIndex
) -> Result<<T as Fold<I>>::Result, NoSolution>
pub fn shifted_out(
self,
interner: &I
) -> Result<<T as Fold<I>>::Result, NoSolution>[src]
self,
interner: &I
) -> Result<<T as Fold<I>>::Result, NoSolution>
impl<T> ToOwned for T where
T: Clone, [src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T[src]
pub fn clone_into(&self, target: &mut T)[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>, [src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>, [src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>[src]
impl<T, I> VisitExt<I> for T where
I: Interner,
T: Visit<I>, [src]
I: Interner,
T: Visit<I>,