# Struct chalk_engine::FlounderedSubgoal

``````pub struct FlounderedSubgoal<I: Interner> {
pub floundered_literal: Literal<I>,
pub floundered_time: TimeStamp,
}``````
Expand description

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: TimeStamp`

Current value of the strand’s clock at the time of floundering.

## Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from `source`. Read more

Formats the value using the given formatter. Read more

Feeds this value into the given `Hasher`. Read more

Feeds a slice of this type into the given `Hasher`. Read more

This method tests for `self` and `other` values to be equal, and is used by `==`. Read more

This method tests for `!=`.

Apply the given folder `folder` to `self`; `binders` is the number of binders that are in scope when beginning the folder. Typically `binders` starts as 0, but is adjusted when we encounter `Binders<T>` in the IR or other similar constructs. Read more

Apply the given visitor `visitor` to `self`; `binders` is the number of binders that are in scope when beginning the visitor. Typically `binders` starts as 0, but is adjusted when we encounter `Binders<T>` in the IR or other similar constructs. Read more

## Blanket Implementations

Gets the `TypeId` of `self`. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Cast a value to type `U` using `CastTo`.

Compare self to `key` and return `true` if they are equal.

Returns the argument unchanged.

Instruments this type with the provided `Span`, returning an `Instrumented` wrapper. Read more

Instruments this type with the current `Span`, returning an `Instrumented` wrapper. Read more

Calls `U::from(self)`.

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

Shifts this term in one level of binders.

Shifts a term valid at `outer_binder` so that it is valid at the innermost binder. See `DebruijnIndex::shifted_in_from` for a detailed explanation. Read more

Shifts a term valid at the innermost binder so that it is valid at `outer_binder`. See `DebruijnIndex::shifted_out_to` for a detailed explanation. Read more

Shifts this term out one level of binders.

The resulting type after obtaining ownership.

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

🔬 This is a nightly-only experimental API. (`toowned_clone_into`)

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

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

Check whether there are free (non-bound) variables.

Attaches the provided `Subscriber` to this type, returning a `WithDispatch` wrapper. Read more

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