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