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,24 @@ 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+ 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+
2141judgment_fn ! {
2242 pub fn prove_wc(
2343 decls: Decls ,
@@ -48,6 +68,50 @@ judgment_fn! {
4868 ( prove_wc( decls, env, assumptions, WcData :: PR ( goal) ) => c)
4969 )
5070
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+
51115 (
52116 ( decls. impl_decls( & trait_ref. trait_id) => i)
53117 ( let ( env, subst) = env. existential_substitution( & i. binder) )
@@ -108,6 +172,24 @@ judgment_fn! {
108172 ( prove_wc( decls, env, assumptions, Predicate :: IsLocal ( trait_ref) ) => c)
109173 )
110174
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+
111193
112194 (
113195 ( prove_wf( decls, env, assumptions, p) => c)
0 commit comments