@@ -1586,6 +1586,10 @@ let instantiate_evar unify flags env evd evk body =
15861586 let allowed_evars = AllowedEvars. remove evk flags.allowed_evars in
15871587 let flags = { flags with allowed_evars } in
15881588 let evd' = check_evar_instance unify flags env evd evk body in
1589+ let evd' = try
1590+ let evk' = fst (EConstr. destEvar evd' (fst (EConstr. decompose_app evd' body))) in
1591+ if List. mem evk (Evd. shelf evd') then Evd. shelve evd' [evk'] else evd'
1592+ with DestKO -> evd' in
15891593 Evd. define evk body evd'
15901594
15911595(* We try to instantiate the evar assuming the body won't depend
@@ -1760,6 +1764,20 @@ let rec invert_definition unify flags choose imitate_defs
17601764 map_constr_with_full_binders env' ! evdref (fun d (env ,k ) -> push_rel d env, k+ 1 )
17611765 imitate envk t
17621766 with _ -> progress := p; imitate envk (whd_beta env' ! evdref t))
1767+ | App (f , args ) when EConstr. isEvar ! evdref f ->
1768+ progress := true ;
1769+ (* Tries to imitate the arguments. If this fails, i is Some i' with i' the index of the last argument we fail to imitate *)
1770+ let i, args' = Array. fold_left_map_i (fun i k a ->
1771+ try let a' = imitate envk a in (k, a')
1772+ with ex -> (Some i, a)) None args in
1773+ (match i with
1774+ | None ->
1775+ let f' = imitate envk f in
1776+ if f' == f && Array. for_all2 (== ) args args' then t else EConstr. mkApp (f', args')
1777+ | Some i ->
1778+ let args, args' = Array. chop (i+ 1 ) args in
1779+ let evd, e = Evardefine. evar_absorb_arguments env ! evdref (EConstr. destEvar ! evdref f) (Array. to_list args) in
1780+ evdref := evd; imitate envk (EConstr. mkApp (EConstr. mkEvar e, args')))
17631781 | _ ->
17641782 progress := true ;
17651783 match
0 commit comments