Skip to content

Commit 0f195ad

Browse files
authored
Merge pull request #469 from zaharidichev/zd/improve-trivial-cycle-detection
Check for trivial cycles in persue_answer
2 parents 08956d4 + f8b72c1 commit 0f195ad

File tree

2 files changed

+19
-34
lines changed

2 files changed

+19
-34
lines changed

chalk-engine/src/logic.rs

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -909,14 +909,9 @@ impl<'forest, C: Context + 'forest, CO: ContextOps<C> + 'forest> SolveState<'for
909909
// we might have to build on it (see the
910910
// Delayed Trivial Self Cycle, Variant 3
911911
// example).
912-
let (_, _, _, table_goal) = self
913-
.context
914-
.instantiate_ucanonical_goal(&self.forest.tables[table].table_goal);
915912

916913
let answer = self.forest.answer(table, answer_index);
917-
if let Some(strand) =
918-
self.create_refinement_strand(table, answer, table_goal)
919-
{
914+
if let Some(strand) = self.create_refinement_strand(table, answer) {
920915
self.forest.tables[table].enqueue_strand(strand);
921916
}
922917

@@ -964,7 +959,6 @@ impl<'forest, C: Context + 'forest, CO: ContextOps<C> + 'forest> SolveState<'for
964959
&self,
965960
table: TableIndex,
966961
answer: &Answer<C>,
967-
table_goal: C::Goal,
968962
) -> Option<CanonicalStrand<C>> {
969963
// If there are no delayed subgoals, then there is no need for
970964
// a refinement strand.
@@ -977,16 +971,8 @@ impl<'forest, C: Context + 'forest, CO: ContextOps<C> + 'forest> SolveState<'for
977971
.context
978972
.instantiate_answer_subst(num_universes, &answer.subst);
979973

980-
// FIXME: it would be nice if these delayed subgoals didn't get added to the answer
981-
// at all. However, we can't compare the delayed subgoals with the table goal until
982-
// we call `canonicalize_answer_subst` in `pursue_answer`. However, at this point,
983-
// it's a bit late since `pursue_answer` doesn't know about the table goal. This could
984-
// be refactored a bit.
985-
let filtered_delayed_subgoals = delayed_subgoals
974+
let delayed_subgoals = delayed_subgoals
986975
.into_iter()
987-
.filter(|delayed_subgoal| {
988-
*C::goal_from_goal_in_environment(delayed_subgoal) != table_goal
989-
})
990976
.map(Literal::Positive)
991977
.collect();
992978

@@ -996,7 +982,7 @@ impl<'forest, C: Context + 'forest, CO: ContextOps<C> + 'forest> SolveState<'for
996982
subst,
997983
ambiguous: answer.ambiguous,
998984
constraints,
999-
subgoals: filtered_delayed_subgoals,
985+
subgoals: delayed_subgoals,
1000986
delayed_subgoals: Vec::new(),
1001987
answer_time: TimeStamp::default(),
1002988
floundered_subgoals: Vec::new(),
@@ -1328,11 +1314,23 @@ impl<'forest, C: Context + 'forest, CO: ContextOps<C> + 'forest> SolveState<'for
13281314
return None;
13291315
}
13301316

1317+
let table_goal = &self.forest.tables[table].table_goal;
1318+
1319+
//FIXME: Avoid double canonicalization
1320+
let filtered_delayed_subgoals = delayed_subgoals
1321+
.into_iter()
1322+
.filter(|delayed_subgoal| {
1323+
let (canonicalized, _) =
1324+
infer.fully_canonicalize_goal(self.context.interner(), delayed_subgoal);
1325+
*table_goal != canonicalized
1326+
})
1327+
.collect();
1328+
13311329
let subst = infer.canonicalize_answer_subst(
13321330
self.context.interner(),
13331331
subst,
13341332
constraints,
1335-
delayed_subgoals,
1333+
filtered_delayed_subgoals,
13361334
);
13371335
debug!("answer: table={:?}, subst={:?}", table, subst);
13381336

chalk-solve/src/solve/slg/resolvent.rs

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -236,10 +236,6 @@ impl<I: Interner> context::ResolventOps<SlgContext<I>> for TruncatingInferenceTa
236236
.infer
237237
.instantiate_canonical(interner, &canonical_answer_subst);
238238

239-
let table_goal = self
240-
.infer
241-
.instantiate_canonical(interner, &answer_table_goal);
242-
243239
AnswerSubstitutor::substitute(
244240
interner,
245241
&mut self.infer,
@@ -250,18 +246,9 @@ impl<I: Interner> context::ResolventOps<SlgContext<I>> for TruncatingInferenceTa
250246
selected_goal,
251247
)?;
252248
ex_clause.constraints.extend(answer_constraints);
253-
254-
for delayed_subgoal in delayed_subgoals {
255-
// FIXME: is this always valid or would we ever run
256-
// into an issue with normalization? (Would this even
257-
// be a "trivial self-cycle"?)
258-
// Only add the delayed_subgoals to the ex-clause if
259-
// it isn't a trivial self-cycle
260-
if delayed_subgoal.goal != table_goal.goal {
261-
ex_clause.delayed_subgoals.push(delayed_subgoal);
262-
}
263-
}
264-
249+
// at that point we should only have goals that stemmed
250+
// from non trivial self cycles
251+
ex_clause.delayed_subgoals.extend(delayed_subgoals);
265252
Ok(())
266253
}
267254
}

0 commit comments

Comments
 (0)