pub enum GoalData<I: Interner> {
Quantified(QuantifierKind, Binders<Goal<I>>),
Implies(ProgramClauses<I>, Goal<I>),
All(Goals<I>),
Not(Goal<I>),
EqGoal(EqGoal<I>),
SubtypeGoal(SubtypeGoal<I>),
DomainGoal(DomainGoal<I>),
CannotProve,
}
Expand description
A general goal; this is the full range of questions you can pose to Chalk.
Variants
Quantified(QuantifierKind, Binders<Goal<I>>)
Introduces a binding at depth 0, shifting other bindings up (deBruijn index).
Implies(ProgramClauses<I>, Goal<I>)
A goal that holds given some clauses (like an if-statement).
All(Goals<I>)
List of goals that all should hold.
Not(Goal<I>)
Negation: the inner goal should not hold.
EqGoal(EqGoal<I>)
Make two things equal; the rules for doing so are well known to the logic
SubtypeGoal(SubtypeGoal<I>)
Make one thing a subtype of another; the rules for doing so are well known to the logic
DomainGoal(DomainGoal<I>)
A “domain goal” indicates some base sort of goal that can be proven via program clauses
CannotProve
Indicates something that cannot be proven to be true or false
definitively. This can occur with overflow but also with
unifications of skolemized variables like forall<X,Y> { X = Y }
. Of course, that statement is false, as there exist types
X, Y where X = Y
is not true. But we treat it as “cannot
prove” so that forall<X,Y> { not { X = Y } }
also winds up
as cannot prove.
Implementations
Trait Implementations
sourceimpl<I: Interner> HasInterner for GoalData<I>
impl<I: Interner> HasInterner for GoalData<I>
type Interner = I
type Interner = I
sourceimpl<I: PartialEq + Interner> PartialEq<GoalData<I>> for GoalData<I>
impl<I: PartialEq + Interner> PartialEq<GoalData<I>> for GoalData<I>
sourceimpl<I: Interner> TypeFoldable<I> for GoalData<I>
impl<I: Interner> TypeFoldable<I> for GoalData<I>
sourcefn try_fold_with<E>(
self,
folder: &mut dyn FallibleTypeFolder<I, Error = E>,
outer_binder: DebruijnIndex
) -> Result<Self, E>
fn try_fold_with<E>(
self,
folder: &mut dyn FallibleTypeFolder<I, Error = E>,
outer_binder: DebruijnIndex
) -> Result<Self, E>
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 moresourcefn fold_with(
self,
folder: &mut dyn TypeFolder<I>,
outer_binder: DebruijnIndex
) -> Self
fn fold_with(
self,
folder: &mut dyn TypeFolder<I>,
outer_binder: DebruijnIndex
) -> Self
try_fold_with
for use with infallible
folders. Do not override this method, to ensure coherence with
try_fold_with
. Read moresourceimpl<I: Interner> TypeVisitable<I> for GoalData<I>
impl<I: Interner> TypeVisitable<I> for GoalData<I>
sourcefn visit_with<B>(
&self,
visitor: &mut dyn TypeVisitor<I, BreakTy = B>,
outer_binder: DebruijnIndex
) -> ControlFlow<B>
fn visit_with<B>(
&self,
visitor: &mut dyn TypeVisitor<I, BreakTy = B>,
outer_binder: DebruijnIndex
) -> ControlFlow<B>
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 moreimpl<I: Interner> Copy for GoalData<I>where
I::InternedType: Copy,
I::InternedLifetime: Copy,
I::InternedGenericArg: Copy,
I::InternedSubstitution: Copy,
I::InternedGoal: Copy,
I::InternedGoals: Copy,
I::InternedProgramClauses: Copy,
I::InternedVariableKinds: Copy,
impl<I: Eq + Interner> Eq for GoalData<I>
impl<I: Interner> StructuralEq for GoalData<I>
impl<I: Interner> StructuralPartialEq for GoalData<I>
Auto Trait Implementations
impl<I> RefUnwindSafe for GoalData<I>where
<I as Interner>::DefId: RefUnwindSafe,
<I as Interner>::InternedGenericArg: RefUnwindSafe,
<I as Interner>::InternedGoal: RefUnwindSafe,
<I as Interner>::InternedGoals: RefUnwindSafe,
<I as Interner>::InternedLifetime: RefUnwindSafe,
<I as Interner>::InternedProgramClauses: RefUnwindSafe,
<I as Interner>::InternedSubstitution: RefUnwindSafe,
<I as Interner>::InternedType: RefUnwindSafe,
<I as Interner>::InternedVariableKinds: RefUnwindSafe,
impl<I> Send for GoalData<I>where
<I as Interner>::DefId: Send,
<I as Interner>::InternedGenericArg: Send,
<I as Interner>::InternedGoal: Send,
<I as Interner>::InternedGoals: Send,
<I as Interner>::InternedLifetime: Send,
<I as Interner>::InternedProgramClauses: Send,
<I as Interner>::InternedSubstitution: Send,
<I as Interner>::InternedType: Send,
<I as Interner>::InternedVariableKinds: Send,
impl<I> Sync for GoalData<I>where
<I as Interner>::DefId: Sync,
<I as Interner>::InternedGenericArg: Sync,
<I as Interner>::InternedGoal: Sync,
<I as Interner>::InternedGoals: Sync,
<I as Interner>::InternedLifetime: Sync,
<I as Interner>::InternedProgramClauses: Sync,
<I as Interner>::InternedSubstitution: Sync,
<I as Interner>::InternedType: Sync,
<I as Interner>::InternedVariableKinds: Sync,
impl<I> Unpin for GoalData<I>where
<I as Interner>::DefId: Unpin,
<I as Interner>::InternedGenericArg: Unpin,
<I as Interner>::InternedGoal: Unpin,
<I as Interner>::InternedGoals: Unpin,
<I as Interner>::InternedLifetime: Unpin,
<I as Interner>::InternedProgramClauses: Unpin,
<I as Interner>::InternedSubstitution: Unpin,
<I as Interner>::InternedType: Unpin,
<I as Interner>::InternedVariableKinds: Unpin,
impl<I> UnwindSafe for GoalData<I>where
<I as Interner>::DefId: UnwindSafe,
<I as Interner>::InternedGenericArg: UnwindSafe,
<I as Interner>::InternedGoal: UnwindSafe,
<I as Interner>::InternedGoals: UnwindSafe,
<I as Interner>::InternedLifetime: UnwindSafe,
<I as Interner>::InternedProgramClauses: UnwindSafe,
<I as Interner>::InternedSubstitution: UnwindSafe,
<I as Interner>::InternedType: UnwindSafe,
<I as Interner>::InternedVariableKinds: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
sourceimpl<T> Cast for T
impl<T> Cast for T
sourcefn cast<U>(self, interner: U::Interner) -> Uwhere
Self: CastTo<U>,
U: HasInterner,
fn cast<U>(self, interner: U::Interner) -> Uwhere
Self: CastTo<U>,
U: HasInterner,
U
using CastTo
.sourceimpl<T, I> CouldMatch<T> for Twhere
T: Zip<I> + HasInterner<Interner = I> + ?Sized,
I: Interner,
impl<T, I> CouldMatch<T> for Twhere
T: Zip<I> + HasInterner<Interner = I> + ?Sized,
I: Interner,
sourcefn could_match(
&self,
interner: I,
db: &dyn UnificationDatabase<I>,
other: &T
) -> bool
fn could_match(
&self,
interner: I,
db: &dyn UnificationDatabase<I>,
other: &T
) -> bool
self
and other
could possibly match.sourceimpl<T, I> Shift<I> for Twhere
T: TypeFoldable<I>,
I: Interner,
impl<T, I> Shift<I> for Twhere
T: TypeFoldable<I>,
I: Interner,
sourcefn shifted_in(self, interner: I) -> T
fn shifted_in(self, interner: I) -> T
sourcefn shifted_in_from(self, interner: I, source_binder: DebruijnIndex) -> T
fn shifted_in_from(self, interner: I, source_binder: DebruijnIndex) -> T
outer_binder
so that it is
valid at the innermost binder. See DebruijnIndex::shifted_in_from
for a detailed explanation. Read moresourcefn shifted_out_to(
self,
interner: I,
target_binder: DebruijnIndex
) -> Result<T, NoSolution>
fn shifted_out_to(
self,
interner: I,
target_binder: DebruijnIndex
) -> Result<T, NoSolution>
outer_binder
. See DebruijnIndex::shifted_out_to
for a detailed explanation. Read more