pub type GoalData = GoalData<Interner>;
Aliased Type§
enum GoalData {
Quantified(QuantifierKind, Binders<Goal<Interner>>),
Implies(ProgramClauses<Interner>, Goal<Interner>),
All(Goals<Interner>),
Not(Goal<Interner>),
EqGoal(EqGoal<Interner>),
SubtypeGoal(SubtypeGoal<Interner>),
DomainGoal(DomainGoal<Interner>),
CannotProve,
}
Variants§
Quantified(QuantifierKind, Binders<Goal<Interner>>)
Introduces a binding at depth 0, shifting other bindings up (deBruijn index).
Implies(ProgramClauses<Interner>, Goal<Interner>)
A goal that holds given some clauses (like an if-statement).
All(Goals<Interner>)
List of goals that all should hold.
Not(Goal<Interner>)
Negation: the inner goal should not hold.
EqGoal(EqGoal<Interner>)
Make two things equal; the rules for doing so are well known to the logic
SubtypeGoal(SubtypeGoal<Interner>)
Make one thing a subtype of another; the rules for doing so are well known to the logic
DomainGoal(DomainGoal<Interner>)
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.