Skip to content

Commit 0e156d5

Browse files
committed
simplify coherence definition
1 parent 7194c4b commit 0e156d5

File tree

2 files changed

+34
-17
lines changed

2 files changed

+34
-17
lines changed

crates/formality-check/src/coherence.rs

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -95,25 +95,26 @@ impl Check<'_> {
9595

9696
assert_eq!(trait_ref_a.trait_id, trait_ref_b.trait_id);
9797

98-
// If the parameters from the two impls cannot be equal, then they do not overlap.
99-
//
100-
// If we can prove `∀P_a, ∀P_b. not (T_a = T_b, Wc_a, Wc_b)`, then they do not overlap.
98+
// If we can prove that the parameters cannot be equated *or* the where-clauses don't hold,
99+
// in coherence mode, then they do not overlap.
101100
if let Ok(()) = self.prove_not_goal(
102101
&env.with_coherence_mode(true),
103-
(&a.where_clauses, &b.where_clauses),
104-
Wcs::all_eq(&trait_ref_a.parameters, &trait_ref_b.parameters),
102+
(),
103+
(
104+
Wcs::all_eq(&trait_ref_a.parameters, &trait_ref_b.parameters),
105+
&a.where_clauses,
106+
&b.where_clauses,
107+
),
105108
) {
106-
return Ok(());
107-
}
109+
tracing::debug!(
110+
"proved not {:?}",
111+
(
112+
Wcs::all_eq(&trait_ref_a.parameters, &trait_ref_b.parameters),
113+
&a.where_clauses,
114+
&b.where_clauses,
115+
)
116+
);
108117

109-
// If we can disprove the where clauses, then they do not overlap.
110-
//
111-
// If we can prove `∀P_a, ∀P_b. not [(T_a = T_b) => (Wc_a, Wc_b)]`, then they do not overlap.
112-
if let Ok(()) = self.prove_not_goal(
113-
&env.with_coherence_mode(true),
114-
Wcs::all_eq(&trait_ref_a.parameters, &trait_ref_b.parameters),
115-
(&a.where_clauses, &b.where_clauses),
116-
) {
117118
return Ok(());
118119
}
119120

@@ -129,18 +130,28 @@ impl Check<'_> {
129130
.chain(&b.where_clauses)
130131
.flat_map(|wc| wc.invert())
131132
.collect();
132-
if inverted.iter().any(|inverted_wc| {
133+
if let Some(inverted_wc) = inverted.iter().find(|inverted_wc| {
133134
self.prove_goal(
134135
&env,
135136
(
136137
Wcs::all_eq(&trait_ref_a.parameters, &trait_ref_b.parameters),
137138
&a.where_clauses,
138139
&b.where_clauses,
139140
),
140-
inverted_wc,
141+
&inverted_wc,
141142
)
142143
.is_ok()
143144
}) {
145+
tracing::debug!(
146+
"proved {:?} assuming {:?}",
147+
&inverted_wc,
148+
(
149+
Wcs::all_eq(&trait_ref_a.parameters, &trait_ref_b.parameters),
150+
&a.where_clauses,
151+
&b.where_clauses,
152+
)
153+
);
154+
144155
return Ok(());
145156
}
146157
bail!("impls may overlap: `{impl_a:?}` vs `{impl_b:?}`")

crates/formality-rust/src/prove.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,12 @@ upcast_to_wcs! {
327327
Relation,
328328
}
329329

330+
impl ToWcs for () {
331+
fn to_wcs(&self) -> Wcs {
332+
Wcs::t()
333+
}
334+
}
335+
330336
impl<A, B> ToWcs for (A, B)
331337
where
332338
A: ToWcs,

0 commit comments

Comments
 (0)