1
1
use formality_types:: {
2
- grammar:: { Predicate , Relation , Wc , WcData , Wcs } ,
2
+ cast:: Upcasted ,
3
+ grammar:: { Const , ExhaustiveState , Predicate , Relation , Scalar , Ty , Wc , WcData , Wcs } ,
3
4
judgment_fn,
4
5
} ;
5
6
6
7
use crate :: {
7
8
decls:: Decls ,
9
+ derive_links:: Parameter ,
8
10
prove:: {
9
11
env:: Env ,
10
12
is_local:: { is_local_trait_ref, may_be_remote} ,
@@ -18,6 +20,23 @@ use crate::{
18
20
19
21
use super :: constraints:: Constraints ;
20
22
23
+ pub fn is_covering ( vals : & [ ExhaustiveState ] , params : & [ Parameter ] ) -> Wcs {
24
+ assert_eq ! ( vals. len( ) , params. len( ) ) ;
25
+ vals. iter ( )
26
+ . zip ( params. iter ( ) )
27
+ . filter_map ( |( a, b) | match a {
28
+ ExhaustiveState :: ExactMatch => None ,
29
+ ExhaustiveState :: ConstCover ( cs) => {
30
+ let Parameter :: Const ( c) = b else {
31
+ todo ! ( ) ;
32
+ } ;
33
+ Some ( Predicate :: Covers ( cs. clone ( ) , c. clone ( ) ) )
34
+ }
35
+ } )
36
+ . upcasted ( )
37
+ . collect ( )
38
+ }
39
+
21
40
judgment_fn ! {
22
41
pub fn prove_wc(
23
42
decls: Decls ,
@@ -48,6 +67,50 @@ judgment_fn! {
48
67
( prove_wc( decls, env, assumptions, WcData :: PR ( goal) ) => c)
49
68
)
50
69
70
+ (
71
+ ( decls. impl_decls( & trait_ref. trait_id) => i)
72
+ ( let ( env, subst) = env. existential_substitution( & i. binder) )
73
+ ( let i = i. binder. instantiate_with( & subst) . unwrap( ) )
74
+ ( let co_assumptions = ( & assumptions, & trait_ref) )
75
+ ( prove( & decls, env, & co_assumptions, Wcs :: all_eq( & trait_ref. parameters, & i. trait_ref. parameters) ) => c)
76
+ ( let t = decls. trait_decl( & i. trait_ref. trait_id) . binder. instantiate_with( & i. trait_ref. parameters) . unwrap( ) )
77
+ ( prove_after( & decls, c, & co_assumptions, & i. where_clause) => c)
78
+ ( prove_after( & decls, c, & assumptions, & t. where_clause) => c)
79
+ ----------------------------- ( "positive impl" )
80
+ ( prove_wc( decls, env, assumptions, Predicate :: IsImplemented ( trait_ref) ) => c. pop_subst( & subst) )
81
+ )
82
+
83
+ (
84
+ ( let mut covering_consts = vec![ ExhaustiveState :: ExactMatch ; trait_ref. parameters. len( ) ] )
85
+ ( let ass = & assumptions)
86
+ ( let d = & decls)
87
+ ( d. impl_decls( & trait_ref. trait_id) . flat_map( |i| {
88
+
89
+ let ( env, subst) = env. clone( ) . existential_substitution( & i. binder) ;
90
+ let i = i. binder. instantiate_with( & subst) . unwrap( ) ;
91
+ let co_assumptions = ( ass, & trait_ref) ;
92
+ let cs = prove(
93
+ & decls, env, & co_assumptions,
94
+ Wcs :: eq_or_cover(
95
+ & i. trait_ref. parameters, & trait_ref. parameters, & mut covering_consts
96
+ )
97
+ ) . into_iter( ) . collect:: <Vec <_>>( ) ;
98
+ let cs = cs. into_iter( ) . flat_map( move |c| {
99
+ prove_after( d, c, & co_assumptions, & i. where_clause)
100
+ . into_iter( )
101
+ } ) . into_iter( ) . collect:: <Vec <_>>( ) ;
102
+ let cs : Vec <Constraints > = cs. into_iter( ) . flat_map( move |c| {
103
+ let t = d. trait_decl( & i. trait_ref. trait_id)
104
+ . binder. instantiate_with( & i. trait_ref. parameters) . unwrap( ) ;
105
+ prove_after( d, c, ass, & t. where_clause) . into_iter( )
106
+ } ) . collect:: <Vec <_>>( ) ;
107
+ cs
108
+ } ) . collect:: <Vec <_>>( ) . into_iter( ) => c)
109
+ ( prove_after( d, c, ass, is_covering( & covering_consts, & trait_ref. parameters) ) => _c)
110
+ ----------------------------- ( "exhaustive positive impl" )
111
+ ( prove_wc( _d, env, _ass, Predicate :: IsImplemented ( trait_ref) ) => Constraints :: none( env. clone( ) ) )
112
+ )
113
+
51
114
(
52
115
( decls. impl_decls( & trait_ref. trait_id) => i)
53
116
( let ( env, subst) = env. existential_substitution( & i. binder) )
@@ -108,6 +171,24 @@ judgment_fn! {
108
171
( prove_wc( decls, env, assumptions, Predicate :: IsLocal ( trait_ref) ) => c)
109
172
)
110
173
174
+ (
175
+ ( let ( ) = vals. sort_unstable( ) )
176
+ ( prove( & decls, env, & assumptions, Predicate :: ConstHasType ( var, Ty :: bool ( ) ) ) => c)
177
+ ( vals. iter( ) . cloned( ) => v)
178
+ ( prove_after( & decls, & c, & assumptions, Predicate :: ConstHasType ( v, Ty :: bool ( ) ) ) => c)
179
+ ( if vals. len( ) == 2 )
180
+ ( vals. iter( )
181
+ . enumerate( )
182
+ . flat_map( |( i, v) |
183
+ prove_after(
184
+ & decls, & c, & assumptions,
185
+ Relation :: eq( Const :: valtree( Scalar :: new( i as u128 ) , Ty :: bool ( ) ) , v)
186
+ )
187
+ ) . collect:: <Vec <_>>( ) . into_iter( ) => c)
188
+ ----------------------------- ( "exhausttive bool values cover variable" )
189
+ ( prove_wc( decls, env, assumptions, Predicate :: Covers ( mut vals, var) ) => c)
190
+ )
191
+
111
192
112
193
(
113
194
( prove_wf( decls, env, assumptions, p) => c)
0 commit comments