@@ -41,7 +41,7 @@ type env = {
4141 f : RT. fstar_top_env ;
4242 bs : list ( var & typ );
4343 f_bs : ( f_bs : R. env { f_bs == extend_env_l f bs });
44- names : list ppname ;
44+ names : ns : list ppname { List. length ns == List. length bs } ;
4545 m : m : bmap { related bs m /\ L. length names == L. length bs };
4646 ctxt : Pulse.RuntimeUtils. context ;
4747
@@ -52,13 +52,11 @@ type env = {
5252let fstar_env g = RU. env_set_context g . f g . ctxt
5353
5454let bindings g = g . bs
55- let rec bindings_with_ppname_aux ( bs : list ( var & typ )) ( names : list ppname )
56- : T. Tac ( list ( ppname & var & typ )) =
57-
55+ let rec bindings_with_ppname_aux ( bs : list ( var & typ )) ( names : list ppname { List. length bs == List. length names })
56+ : list ( ppname & var & typ ) =
5857 match bs , names with
5958 | [], [] -> []
6059 | ( x , t ):: bs , n :: names -> ( n , x , t )::( bindings_with_ppname_aux bs names )
61- | _ -> T. fail " impossible! env bs and names have different lengths"
6260let bindings_with_ppname g = bindings_with_ppname_aux g . bs g . names
6361
6462
@@ -104,7 +102,7 @@ let mk_env_dom _ = assert (Set.equal (Map.domain empty_bmap) Set.empty)
104102let push_binding g x p t =
105103 { g with bs = ( x , t ):: g . bs ;
106104 names = p :: g . names ;
107- f_bs = RT. extend_env g . f_bs x t ;
105+ f_bs = R. push_binding g . f_bs { ppname = p . name ; uniq = x ; sort = t } ;
108106 m = Map. upd g . m x t }
109107
110108let push_binding_bs _ _ _ _ = ()
@@ -129,12 +127,20 @@ let rec append_memP (#a:Type) (l1 l2:list a) (x:a)
129127 | [] -> ()
130128 | _ :: tl -> append_memP tl l2 x
131129
130+ let rec extend_env_impl ( f : R. env ) ( g : env_bindings ) ( ns : list ppname { List. length ns == List. length g }) :
131+ f' : R. env { f' == extend_env_l f g } =
132+ match g , ns with
133+ | [], [] -> f
134+ | ( x , t ):: g , n :: ns ->
135+ let f = extend_env_impl f g ns in
136+ R. push_binding f { ppname = ( n <: ppname ). name ; uniq = x ; sort = t }
137+
132138let push_env ( g1 : env ) ( g2 : env { disjoint g1 g2 }) : env =
133139 assume ( extend_env_l ( extend_env_l g1 . f g1 . bs ) g2 . bs == extend_env_l g1 . f ( g2 . bs @ g1 . bs ));
134140 {
135141 f = g1 . f ;
136142 bs = g2 . bs @ g1 . bs ;
137- f_bs = extend_env_l g1 . f_bs g2 . bs ;
143+ f_bs = extend_env_impl g1 . f_bs g2 . bs g2 . names ;
138144 names = g2 . names @ g1 . names ;
139145 m = Map. concat g2 . m g1 . m ;
140146 ctxt = g1 . ctxt ;
@@ -177,7 +183,7 @@ let rec remove_binding_aux (g:env)
177183 fst b = != x ));
178184
179185 let g' = { g with bs = prefix ;
180- f_bs = extend_env_l g . f prefix ; // Recomputing, not ideal
186+ f_bs = extend_env_impl g . f prefix prefix_names ; // Recomputing, not ideal
181187 names = prefix_names ;
182188 m
183189 } in
@@ -192,14 +198,14 @@ let remove_binding g =
192198 remove_binding_aux g [] [] g . bs g . names
193199
194200let remove_latest_binding g =
195- match g . bs with
196- | ( x , t ):: rest ->
201+ match g . bs , g . names with
202+ | ( x , t ):: rest , _ :: names_rest ->
197203 let m = Map. restrict ( Set. complement ( Set. singleton x )) ( Map. upd g . m x tm_unknown ) in
198204 // we need uniqueness invariant in the representation
199205 assume ( forall ( b : var & typ ). List.Tot. memP b rest <==> ( List.Tot. memP b g . bs /\
200206 fst b = != x ));
201207 let g' = { g with bs = rest ;
202- f_bs = extend_env_l g . f rest ; // Recomputing, not ideal
208+ f_bs = extend_env_impl g . f rest names_rest ; // Recomputing, not ideal
203209 names = L. tl g . names ;
204210 m ;
205211 } in
@@ -278,7 +284,7 @@ let diff g1 g2 =
278284 let g3 = {
279285 f = g1 . f ;
280286 bs = bs3 ;
281- f_bs = extend_env_l g1 . f bs3 ; // Recomputing, but probably ok
287+ f_bs = extend_env_impl g1 . f bs3 names3 ; // Recomputing, but probably ok
282288 names = names3 ;
283289 m = m3 ;
284290 ctxt = g1 . ctxt ;
@@ -393,7 +399,7 @@ let env_to_doc' (simplify:bool) (e:env) : T.Tac document =
393399 vtns |> T. filter ( fun (( n , t ), x ) ->
394400 let is_unit = FStar.Reflection.TermEq. term_eq t (`unit) in
395401 let x : ppname = x in
396- let is_wild = T. unseal x . name = " _ " in
402+ let is_wild = T. unseal x . name = " __ " in
397403 not ( is_unit && is_wild )
398404 )
399405 else
0 commit comments