aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--pretyping/typeclasses.ml11
-rw-r--r--pretyping/typeclasses.mli1
-rw-r--r--tactics/btermdn.ml2
-rw-r--r--tactics/class_tactics.ml47
-rw-r--r--tactics/termdn.ml1
5 files changed, 15 insertions, 7 deletions
diff --git a/pretyping/typeclasses.ml b/pretyping/typeclasses.ml
index 0d15034ce..04b34db38 100644
--- a/pretyping/typeclasses.ml
+++ b/pretyping/typeclasses.ml
@@ -357,10 +357,17 @@ let mark_unresolvables sigma =
Evd.add evs ev (mark_unresolvable evi))
sigma Evd.empty
+let rec is_class_type c =
+ match kind_of_term c with
+ | Prod (_, _, t) -> is_class_type t
+ | _ -> class_of_constr c <> None
+
+let is_class_evar evi =
+ is_class_type evi.Evd.evar_concl
+
let has_typeclasses evd =
Evd.fold (fun ev evi has -> has ||
- (evi.evar_body = Evar_empty && class_of_constr evi.evar_concl <> None
- && is_resolvable evi))
+ (evi.evar_body = Evar_empty && is_class_evar evi && is_resolvable evi))
evd false
let solve_instanciations_problem = ref (fun _ _ _ _ _ -> assert false)
diff --git a/pretyping/typeclasses.mli b/pretyping/typeclasses.mli
index 8960ab21b..ce0975c69 100644
--- a/pretyping/typeclasses.mli
+++ b/pretyping/typeclasses.mli
@@ -75,6 +75,7 @@ val bool_out : Dyn.t -> bool
val is_resolvable : evar_info -> bool
val mark_unresolvable : evar_info -> evar_info
val mark_unresolvables : evar_map -> evar_map
+val is_class_evar : evar_info -> bool
val resolve_typeclasses : ?onlyargs:bool -> ?split:bool -> ?fail:bool ->
env -> evar_defs -> evar_defs
diff --git a/tactics/btermdn.ml b/tactics/btermdn.ml
index 2412968a1..379949f46 100644
--- a/tactics/btermdn.ml
+++ b/tactics/btermdn.ml
@@ -52,7 +52,7 @@ let bounded_constr_val_discr (t,depth) =
match constr_val_discr t with
| Dn.Label (c,l) -> Dn.Label(c,List.map (fun c -> (c,depth-1)) l)
| Dn.Nothing -> Dn.Nothing
- | Dn.Everything -> Dn.Nothing
+ | Dn.Everything -> Dn.Everything
type 'a t = (global_reference,constr_pattern * int,'a) Dn.t
diff --git a/tactics/class_tactics.ml4 b/tactics/class_tactics.ml4
index 64ea47a9b..16e8bce3a 100644
--- a/tactics/class_tactics.ml4
+++ b/tactics/class_tactics.ml4
@@ -515,11 +515,10 @@ let resolve_typeclass_evars d p env evd onlyargs split fail =
let pred =
if onlyargs then
(fun ev evi -> Typeclasses.is_implicit_arg (snd (Evd.evar_source ev evd)) &&
- class_of_constr evi.Evd.evar_concl <> None)
- else
- (fun ev evi -> class_of_constr evi.Evd.evar_concl <> None)
+ Typeclasses.is_class_evar evi)
+ else (fun ev evi -> Typeclasses.is_class_evar evi)
in resolve_all_evars d p env pred evd split fail
-
+
let solve_inst debug mode depth env evd onlyargs split fail =
resolve_typeclass_evars debug (mode, depth) env evd onlyargs split fail
diff --git a/tactics/termdn.ml b/tactics/termdn.ml
index 995183dc9..591b2947c 100644
--- a/tactics/termdn.ml
+++ b/tactics/termdn.ml
@@ -70,6 +70,7 @@ let constr_val_discr t =
| Ind ind_sp -> Label(IndRef ind_sp,l)
| Construct cstr_sp -> Label((ConstructRef cstr_sp),l)
| Var id -> Label(VarRef id,l)
+ | Const _ -> Everything
| _ -> Nothing
let constr_val_discr_st (idpred,cpred) t =