@@ -142,14 +142,15 @@ let def_of_fv (g:T.env) (fv:R.fv)
142142 | R. Sg_Inductive _nm _univs params typ _ -> None
143143
144144let unfold_head ( g : env ) ( t : term )
145- : T. Tac term
145+ : T. Tac ( term & string)
146146 = let rg = elab_env g in
147147 match T. hua t with
148148 | Some ( fv , u , args ) -> (
149149 (* zeta to allow unfolding recursive definitions. Should be only once
150150 unless it appears on the head of its own definition.. which should be impossible? *)
151- let t = T. norm_term_env rg [ hnf ; zeta ; delta_only [ T. implode_qn ( T. inspect_fv fv )]] t in
152- t
151+ let head_symbol = T. implode_qn ( T. inspect_fv fv ) in
152+ let t = T. norm_term_env rg [ hnf ; zeta ; delta_only [ head_symbol ]] t in
153+ t , head_symbol
153154 (* Something like this would be better, but we need to instantiate
154155 the universes, and we don't have a good way to do that yet.
155156 match def_of_fv rg fv with
@@ -166,16 +167,22 @@ let unfold_head (g : env) (t:term)
166167 fail g ( Some ( RU. range_of_term t ))
167168 ( Printf. sprintf " Cannot unfold %s, the head is not an fvar" ( T. term_to_string t ))
168169
169- let unfold_defs ( g : env ) ( defs : option ( list string)) ( t : term )
170- : T. Tac term
171- = let t = unfold_head g t in
170+ let unfold_defs' ( g : env ) ( defs : option ( list string)) ( t : term )
171+ : T. Tac ( term & string)
172+ = let t , head_sym = unfold_head g t in
172173 let t =
173174 match defs with
174175 | None -> t
175176 | Some defs -> unfold_all g defs t
176177 in
177178 let t = T. norm_term_env ( elab_env g ) [ hnf ; iota ; primops ] t in
178- t
179+ t , head_sym
180+
181+ let unfold_defs ( g : env ) ( defs : option ( list string)) ( t : term )
182+ : T. Tac ( term & string)
183+ = RU. profile ( fun () -> unfold_defs' g defs t )
184+ ( T. moduleof ( fstar_env g ))
185+ " Pulse.Checker.Unfold"
179186
180187let check_unfoldable g ( v : term ) : T. Tac unit =
181188 match inspect_term v with
@@ -445,8 +452,8 @@ let check
445452 (| x , x_ty , pre'' , g2 , k_elab_trans k_frame k |)
446453
447454
448- | UNFOLD { names ; p = v }
449- | FOLD { names ; p = v } ->
455+ | UNFOLD { p = v }
456+ | FOLD { p = v } ->
450457
451458 let (| uvs , v_opened , body_opened |) =
452459 let bs = infer_binder_types g bs v in
@@ -461,14 +468,15 @@ let check
461468 add_rem_uvs ( push_env g uvs ) t_rem ( mk_env ( fstar_env g )) v_opened in
462469 push_env uvs uvs_rem , v_opened in
463470
464- let lhs , rhs =
471+ let lhs , rhs , tac =
465472 match hint_type with
466473 | UNFOLD _ ->
467- v_opened ,
468- unfold_defs ( push_env g uvs ) None v_opened
474+ let rhs , head_sym = unfold_defs ( push_env g uvs ) None v_opened in
475+ v_opened , rhs , Pulse.Reflection.Util. slprop_equiv_unfold_tm head_sym
469476 | FOLD { names = ns } ->
470- unfold_defs ( push_env g uvs ) ns v_opened ,
471- v_opened in
477+ let lhs , head_sym = unfold_defs ( push_env g uvs ) ns v_opened in
478+ lhs , v_opened , Pulse.Reflection.Util. slprop_equiv_fold_tm head_sym
479+ in
472480
473481 let uvs_bs = uvs |> bindings_with_ppname |> L. rev in
474482 let uvs_closing = uvs_bs |> closing in
@@ -491,8 +499,7 @@ let check
491499 ] in
492500 info_doc_env g ( Some st . range ) msg
493501 end ;
494-
495- let rw = mk_term ( Tm_Rewrite { t1 = lhs ; t2 = rhs ; tac_opt = Some Pulse.Reflection.Util. slprop_equiv_norm_tm }) st . range in
502+ let rw = mk_term ( Tm_Rewrite { t1 = lhs ; t2 = rhs ; tac_opt = Some tac }) st . range in
496503 let rw = { rw with effect_tag = as_effect_hint STT_Ghost } in
497504
498505 let st = mk_term ( Tm_Bind { binder = as_binder ( wr (`unit) st . range ); head = rw ; body }) st . range in
0 commit comments