aboutsummaryrefslogtreecommitdiff
path: root/proofs/logic.ml
diff options
context:
space:
mode:
Diffstat (limited to 'proofs/logic.ml')
-rw-r--r--proofs/logic.ml40
1 files changed, 40 insertions, 0 deletions
diff --git a/proofs/logic.ml b/proofs/logic.ml
index b9cff0527d..a7538193b0 100644
--- a/proofs/logic.ml
+++ b/proofs/logic.ml
@@ -113,6 +113,35 @@ let clear_hyps2 sigma ids sign t cl =
(* The ClearBody tactic *)
+let recheck_typability (what,id) env sigma t =
+ try check_typability env sigma t
+ with e when Errors.noncritical e ->
+ let s = match what with
+ | None -> "the conclusion"
+ | Some id -> "hypothesis "^(Id.to_string id) in
+ error
+ ("The correctness of "^s^" relies on the body of "^(Id.to_string id))
+
+let remove_hyp_body env sigma id =
+ let sign =
+ apply_to_hyp_and_dependent_on (named_context_val env) id
+ (fun (_,c,t) _ ->
+ match c with
+ | None -> error ((Id.to_string id)^" is not a local definition.")
+ | Some c ->(id,None,t))
+ (fun (id',c,t as d) sign ->
+ (if !check then
+ begin
+ let env = reset_with_named_context sign env in
+ match c with
+ | None -> recheck_typability (Some id',id) env sigma t
+ | Some b ->
+ let b' = mkCast (b,DEFAULTcast, t) in
+ recheck_typability (Some id',id) env sigma b'
+ end;d))
+ in
+ reset_with_named_context sign env
+
(* Reordering of the context *)
(* faire le minimum d'echanges pour que l'ordre donne soit un *)
@@ -679,6 +708,17 @@ let prim_refiner r sigma goal =
let sigma = Goal.V82.partial_solution sigma goal ev in
([gl], sigma)
+ | ThinBody ids ->
+ let clear_aux env id =
+ let env' = remove_hyp_body env sigma id in
+ if !check then recheck_typability (None,id) env' sigma cl;
+ env'
+ in
+ let sign' = named_context_val (List.fold_left clear_aux env ids) in
+ let (sg,ev,sigma) = mk_goal sign' cl in
+ let sigma = Goal.V82.partial_solution sigma goal ev in
+ ([sg], sigma)
+
| Move (withdep, hfrom, hto) ->
let (left,right,declfrom,toleft) =
split_sign hfrom hto (named_context_of_val sign) in