@@ -748,6 +748,15 @@ and evar_eqappr_x ?(rhs_is_already_stuck = false) flags env evd pbty
748
748
let quick_fail i = (* not costly, loses info *)
749
749
UnifFailure (i, NotSameHead )
750
750
in
751
+ let get_tc evd e =
752
+ if not (Evd. is_typeclass_evar evd e) then raise Not_found else
753
+ let tc_evars = Evd. get_typeclass_evars evd in
754
+ let evd = Evd. set_typeclass_evars evd (Evar.Set. singleton e) in
755
+ let evd = Typeclasses. resolve_typeclasses env evd in
756
+ if not (Evd. is_defined evd e) then raise Not_found else
757
+ let tc_evars = Evar.Set. union tc_evars (Evd. get_typeclass_evars evd) in
758
+ let tc_evars = Evar.Set. filter (fun e -> not (Evd. is_defined evd e)) tc_evars in
759
+ Evd. set_typeclass_evars evd tc_evars in
751
760
let miller_pfenning l2r fallback ev lF tM evd =
752
761
match is_unification_pattern_evar env evd ev lF tM with
753
762
| None -> fallback ()
@@ -876,9 +885,16 @@ and evar_eqappr_x ?(rhs_is_already_stuck = false) flags env evd pbty
876
885
| Construct u -> eta_constructor flags env evd u skR apprF
877
886
| _ -> UnifFailure (evd,NotSameHead )
878
887
in
888
+ let tc evd =
889
+ let (e, _) = EConstr. destEvar evd termF in
890
+ try let evd = get_tc evd e in
891
+ let apprF = whd_betaiota_deltazeta_for_iota_state flags.open_ts env evd apprF in
892
+ let apprR = whd_betaiota_deltazeta_for_iota_state flags.open_ts env evd apprR in
893
+ evar_eqappr_x flags env evd pbty keys lastUnfolded apprF apprR
894
+ with _ -> quick_fail evd in
879
895
match Stack. list_of_app_stack skF with
880
896
| None ->
881
- ise_try evd [consume_stack l2r apprF apprR; eta]
897
+ ise_try evd [consume_stack l2r apprF apprR; eta; tc ]
882
898
| Some lF ->
883
899
let tR = Stack. zip evd apprR in
884
900
miller_pfenning l2r
@@ -1044,8 +1060,19 @@ and evar_eqappr_x ?(rhs_is_already_stuck = false) flags env evd pbty
1044
1060
match consume true appr1 appr2 i with
1045
1061
| Success _ as x -> x
1046
1062
| UnifFailure _ -> quick_fail i
1063
+ and f6 i =
1064
+ try let evd = get_tc evd sp2 in
1065
+ evar_eqappr_x flags env evd pbty keys lastUnfolded
1066
+ (whd_betaiota_deltazeta_for_iota_state flags.open_ts env evd appr1)
1067
+ (whd_betaiota_deltazeta_for_iota_state flags.open_ts env evd appr2)
1068
+ with _ -> try
1069
+ let evd = get_tc evd sp1 in
1070
+ evar_eqappr_x flags env evd pbty keys lastUnfolded
1071
+ (whd_betaiota_deltazeta_for_iota_state flags.open_ts env evd appr1)
1072
+ (whd_betaiota_deltazeta_for_iota_state flags.open_ts env evd appr2)
1073
+ with _ -> quick_fail i
1047
1074
in
1048
- ise_try evd [f1; f2; f3; f4; f5]
1075
+ ise_try evd [f1; f2; f3; f4; f5; f6 ]
1049
1076
1050
1077
| Flexible ev1 , MaybeFlexible v2 ->
1051
1078
flex_maybeflex true ev1 appr1 appr2 v2
@@ -2018,7 +2045,7 @@ let solve_unconstrained_impossible_cases env evd =
2018
2045
(Evd. get_impossible_case_evars evd)
2019
2046
evd
2020
2047
2021
- let solve_unif_constraints_with_heuristics env
2048
+ let do_solve_unif_constraints_with_heuristics env
2022
2049
?(flags =default_flags env) ?(with_ho =false ) evd =
2023
2050
let evd = solve_unconstrained_evars_with_candidates flags env evd in
2024
2051
let rec aux evd pbs progress stuck =
@@ -2054,6 +2081,16 @@ let solve_unif_constraints_with_heuristics env
2054
2081
check_problems_are_solved env heuristic_solved_evd;
2055
2082
solve_unconstrained_impossible_cases env heuristic_solved_evd
2056
2083
2084
+ (* A little bit of gymnastics to disable solve_unif_constraints_with_heuristics without changing the whole API. *)
2085
+ let do_not_solve_unif_constraints_with_heuristics env
2086
+ ?(flags =default_flags env) ?(with_ho =false ) evd = evd
2087
+
2088
+ let ref_solve_unif_constraints_with_heuristics =
2089
+ ref do_solve_unif_constraints_with_heuristics
2090
+
2091
+ let solve_unif_constraints_with_heuristics env =
2092
+ ! ref_solve_unif_constraints_with_heuristics env
2093
+
2057
2094
(* Main entry points *)
2058
2095
2059
2096
exception UnableToUnify of evar_map * unification_error
@@ -2070,7 +2107,20 @@ let unify_delay ?flags env evd t1 t2 =
2070
2107
| Some flags -> flags
2071
2108
in
2072
2109
match evar_conv_x flags env evd CONV t1 t2 with
2073
- | Success evd' -> evd'
2110
+ | Success evd' -> (try
2111
+ let te1 = Evd. get_typeclass_evars evd in
2112
+ let te2 = Evd. get_typeclass_evars evd' in
2113
+ let ted = Evar.Set. diff te2 te1 in
2114
+ let evd = Evd. set_typeclass_evars evd' ted in
2115
+ let () = ref_solve_unif_constraints_with_heuristics := do_not_solve_unif_constraints_with_heuristics in
2116
+ let evd = Typeclasses. resolve_typeclasses env evd in
2117
+ let () = ref_solve_unif_constraints_with_heuristics := do_solve_unif_constraints_with_heuristics in
2118
+ let tei = Evar.Set. inter te2 te1 in
2119
+ let te2 = Evd. get_typeclass_evars evd in
2120
+ let te1 = tei in
2121
+ let evd = Evd. set_typeclass_evars evd (Evar.Set. union te1 te2) in
2122
+ evd
2123
+ with _ -> evd')
2074
2124
| UnifFailure (evd' ,e ) -> raise (UnableToUnify (evd',e))
2075
2125
2076
2126
let unify_leq_delay ?flags env evd t1 t2 =
@@ -2080,7 +2130,21 @@ let unify_leq_delay ?flags env evd t1 t2 =
2080
2130
| Some flags -> flags
2081
2131
in
2082
2132
match evar_conv_x flags env evd CUMUL t1 t2 with
2083
- | Success evd' -> evd'
2133
+ | Success evd' -> (try
2134
+ let te1 = Evd. get_typeclass_evars evd in
2135
+ let te1 = Evar.Set. map (fun e -> Option. default e (Evd. is_aliased_evar evd' e)) te1 in
2136
+ let te2 = Evd. get_typeclass_evars evd' in
2137
+ let ted = Evar.Set. diff te2 te1 in
2138
+ let tei = Evar.Set. inter te2 te1 in
2139
+ let evd = Evd. set_typeclass_evars evd' ted in
2140
+ let () = ref_solve_unif_constraints_with_heuristics := do_not_solve_unif_constraints_with_heuristics in
2141
+ let evd = Typeclasses. resolve_typeclasses env evd in
2142
+ let () = ref_solve_unif_constraints_with_heuristics := do_solve_unif_constraints_with_heuristics in
2143
+ let te2 = Evd. get_typeclass_evars evd in
2144
+ let te1 = tei in
2145
+ let evd = Evd. set_typeclass_evars evd (Evar.Set. union te1 te2) in
2146
+ evd
2147
+ with _ -> evd')
2084
2148
| UnifFailure (evd' ,e ) -> raise (UnableToUnify (evd',e))
2085
2149
2086
2150
let unify ?flags ?(with_ho =true ) env evd cv_pb ty1 ty2 =
@@ -2091,8 +2155,22 @@ let unify ?flags ?(with_ho=true) env evd cv_pb ty1 ty2 =
2091
2155
in
2092
2156
let res = evar_conv_x flags env evd cv_pb ty1 ty2 in
2093
2157
match res with
2094
- | Success evd ->
2095
- solve_unif_constraints_with_heuristics ~flags ~with_ho env evd
2158
+ | Success evd' ->
2159
+ let evd' = solve_unif_constraints_with_heuristics ~flags ~with_ho env evd' in
2160
+ (try
2161
+ let te1 = Evd. get_typeclass_evars evd in
2162
+ let te2 = Evd. get_typeclass_evars evd' in
2163
+ let ted = Evar.Set. diff te2 te1 in
2164
+ let tei = Evar.Set. inter te2 te1 in
2165
+ let evd = Evd. set_typeclass_evars evd' ted in
2166
+ let () = ref_solve_unif_constraints_with_heuristics := do_not_solve_unif_constraints_with_heuristics in
2167
+ let evd = Typeclasses. resolve_typeclasses env evd in
2168
+ let () = ref_solve_unif_constraints_with_heuristics := do_solve_unif_constraints_with_heuristics in
2169
+ let te2 = Evd. get_typeclass_evars evd in
2170
+ let te1 = tei in
2171
+ let evd = Evd. set_typeclass_evars evd (Evar.Set. union te1 te2) in
2172
+ evd
2173
+ with _ -> evd')
2096
2174
| UnifFailure (evd , reason ) ->
2097
2175
raise (PretypeError (env, evd, CannotUnify (ty1, ty2, Some reason)))
2098
2176
0 commit comments