11use formality_types:: {
2- grammar:: { Predicate , Relation , Wc , WcData , Wcs } ,
2+ cast:: Upcasted ,
3+ grammar:: { Const , ExhaustiveState , Predicate , Relation , Scalar , Ty , Wc , WcData , Wcs } ,
34 judgment_fn,
45} ;
56
67use crate :: {
78 decls:: Decls ,
9+ derive_links:: Parameter ,
810 prove:: {
911 env:: Env ,
1012 is_local:: { is_local_trait_ref, may_be_remote} ,
@@ -18,6 +20,23 @@ use crate::{
1820
1921use super :: constraints:: Constraints ;
2022
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+
2140judgment_fn ! {
2241 pub fn prove_wc(
2342 decls: Decls ,
@@ -48,6 +67,50 @@ judgment_fn! {
4867 ( prove_wc( decls, env, assumptions, WcData :: PR ( goal) ) => c)
4968 )
5069
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+
51114 (
52115 ( decls. impl_decls( & trait_ref. trait_id) => i)
53116 ( let ( env, subst) = env. existential_substitution( & i. binder) )
@@ -108,6 +171,24 @@ judgment_fn! {
108171 ( prove_wc( decls, env, assumptions, Predicate :: IsLocal ( trait_ref) ) => c)
109172 )
110173
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+
111192
112193 (
113194 ( prove_wf( decls, env, assumptions, p) => c)
0 commit comments