Skip to content

Commit 96b5b08

Browse files
committed
Cherry-picked prove_sub to use Wcs::all_sub
1 parent d60541a commit 96b5b08

File tree

4 files changed

+77
-10
lines changed

4 files changed

+77
-10
lines changed

crates/formality-prove/src/prove.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ mod negation;
77
mod prove_after;
88
mod prove_eq;
99
pub mod prove_normalize;
10+
mod prove_sub;
1011
mod prove_via;
1112
mod prove_wc;
1213
mod prove_wc_list;
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
use formality_core::judgment_fn;
2+
use formality_types::grammar::{Parameter, Relation, RigidTy, TyData, Wcs};
3+
4+
use crate::{
5+
decls::Decls,
6+
prove::{prove, prove_after::prove_after, prove_normalize::prove_normalize},
7+
};
8+
9+
use super::{constraints::Constraints, env::Env};
10+
11+
judgment_fn! {
12+
pub fn prove_sub(
13+
_decls: Decls,
14+
env: Env,
15+
assumptions: Wcs,
16+
a: Parameter,
17+
b: Parameter,
18+
) => Constraints {
19+
debug(a, b, assumptions, env)
20+
21+
assert(a.kind() == b.kind())
22+
23+
trivial(a == b => Constraints::none(env))
24+
25+
(
26+
(prove_normalize(&decls, env, &assumptions, &x) => (c, y))
27+
(prove_after(&decls, c, &assumptions, Relation::sub(y, &z)) => c)
28+
----------------------------- ("normalize-l")
29+
(prove_sub(decls, env, assumptions, x, z) => c)
30+
)
31+
32+
(
33+
(prove_normalize(&decls, env, &assumptions, &y) => (c, z))
34+
(prove_after(&decls, c, &assumptions, Relation::sub(&x, &z)) => c)
35+
----------------------------- ("normalize-r")
36+
(prove_sub(decls, env, assumptions, x, y) => c)
37+
)
38+
39+
(
40+
(let RigidTy { name: a_name, parameters: a_parameters } = a)
41+
(let RigidTy { name: b_name, parameters: b_parameters } = b)
42+
(if a_name == b_name)!
43+
(prove(decls, env, assumptions, Wcs::all_sub(a_parameters, b_parameters)) => c)
44+
----------------------------- ("rigid")
45+
(prove_sub(decls, env, assumptions, TyData::RigidTy(a), TyData::RigidTy(b)) => c)
46+
)
47+
48+
// FIXME: uncomment this when adding prove_outlives
49+
//(
50+
// (prove_outlives(decls, env, assumptions, a, b) => c)
51+
// ----------------------------- ("lifetime => outlives")
52+
// (prove_sub(decls, env, assumptions, a: Lt, b: Lt) => c)
53+
//)
54+
}
55+
}

crates/formality-prove/src/prove/prove_wc.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ use crate::{
1010
prove,
1111
prove_after::prove_after,
1212
prove_eq::prove_eq,
13+
prove_sub::prove_sub,
1314
prove_via::prove_via,
1415
prove_wf::prove_wf,
1516
},
1617
};
1718

1819
use super::constraints::Constraints;
19-
use formality_types::grammar::Parameter::Ty;
2020

2121
judgment_fn! {
2222
/// The "heart" of the trait system -- prove that a where-clause holds given a set of declarations, variable environment, and set of assumptions.
@@ -56,15 +56,6 @@ judgment_fn! {
5656
(prove_wc(decls, env, assumptions, WcData::Relation(goal)) => c)
5757
)
5858

59-
// FIXME: improve the subtype rule after adding lifetime
60-
(
61-
(if let Ty(_) = param1.clone())!
62-
(if let Ty(_) = param2.clone())!
63-
(if param1 == param2)!
64-
----------------------------- ("subtype - reflexive")
65-
(prove_wc(_decls, env, _assumptions, WcData::Relation(Relation::Sub(param1, param2))) => Constraints::none(env))
66-
)
67-
6859
(
6960
(decls.impl_decls(&trait_ref.trait_id) => i)!
7061
(let (env, subst) = env.existential_substitution(&i.binder))
@@ -117,6 +108,12 @@ judgment_fn! {
117108
(prove_wc(decls, env, assumptions, Relation::Equals(a, b)) => c)
118109
)
119110

111+
(
112+
(prove_sub(decls, env, assumptions, a, b) => c)
113+
----------------------------- ("subtype")
114+
(prove_wc(decls, env, assumptions, WcData::Relation(Relation::Sub(a, b))) => c)
115+
)
116+
120117
(
121118
(for_all(&decls, &env, &assumptions, &trait_ref.parameters, &prove_wf) => c)
122119
(let t = decls.trait_decl(&trait_ref.trait_id))

crates/formality-types/src/grammar/wc.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@ impl Wcs {
2828
.upcasted()
2929
.collect()
3030
}
31+
32+
/// Goal(s) to prove `a` and `b` are subtypes.
33+
///
34+
/// FIXME: This should take variance into account.
35+
pub fn all_sub(a: impl Upcast<Vec<Parameter>>, b: impl Upcast<Vec<Parameter>>) -> Wcs {
36+
let a: Vec<Parameter> = a.upcast();
37+
let b: Vec<Parameter> = b.upcast();
38+
assert_eq!(a.len(), b.len());
39+
a.into_iter()
40+
.zip(b)
41+
.map(|(a, b)| Relation::sub(a, b))
42+
.upcasted()
43+
.collect()
44+
}
3145
}
3246

3347
impl<'w> IntoIterator for &'w Wcs {

0 commit comments

Comments
 (0)