[−][src]Struct chalk_engine::FlounderedSubgoal
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]
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, _TI> Fold<I, _TI> for FlounderedSubgoal<I> where
_TI: TargetInterner<I>, [src]
_TI: TargetInterner<I>,
type Result = FlounderedSubgoal<_TI>
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, _TI>,
outer_binder: DebruijnIndex
) -> Fallible<Self::Result> where
I: 'i,
_TI: 'i, [src]
&self,
folder: &mut dyn Folder<'i, I, _TI>,
outer_binder: DebruijnIndex
) -> Fallible<Self::Result> where
I: 'i,
_TI: 'i,
impl<I: Hash + Interner> Hash for FlounderedSubgoal<I>[src]
fn hash<__H: Hasher>(&self, state: &mut __H)[src]
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, R: VisitResult>(
&self,
visitor: &mut dyn Visitor<'i, I, Result = R>,
outer_binder: DebruijnIndex
) -> R where
I: 'i, [src]
&self,
visitor: &mut dyn Visitor<'i, I, Result = R>,
outer_binder: DebruijnIndex
) -> R 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,
fn borrow_mut(&mut self) -> &mut T[src]
impl<T> Cast for T[src]
fn cast<U>(self, interner: &<U as HasInterner>::Interner) -> U where
Self: CastTo<U>,
U: HasInterner, [src]
Self: CastTo<U>,
U: HasInterner,
impl<T> From<T> for T[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, I>, [src]
I: Interner,
T: Fold<I, I>,
fn shifted_in(&self, interner: &I) -> <T as Fold<I, I>>::Result[src]
fn shifted_in_from(
&self,
interner: &I,
source_binder: DebruijnIndex
) -> <T as Fold<I, I>>::Result[src]
&self,
interner: &I,
source_binder: DebruijnIndex
) -> <T as Fold<I, I>>::Result
fn shifted_out_to(
&self,
interner: &I,
target_binder: DebruijnIndex
) -> Result<<T as Fold<I, I>>::Result, NoSolution>[src]
&self,
interner: &I,
target_binder: DebruijnIndex
) -> Result<<T as Fold<I, I>>::Result, NoSolution>
fn shifted_out(
&self,
interner: &I
) -> Result<<T as Fold<I, I>>::Result, NoSolution>[src]
&self,
interner: &I
) -> Result<<T as Fold<I, I>>::Result, NoSolution>
impl<T> ToOwned for T where
T: Clone, [src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T[src]
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.
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.
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>,