]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/cic_proof_checking/cicReduction.ml
Avoid generating invalid names with "'" in the middle of them.
[helm.git] / helm / software / components / cic_proof_checking / cicReduction.ml
index ce8f66deb04aa554763f84ecf26299622aed11ac..f4880e426de66ffd74b78808eea763cb4b761a71 100644 (file)
@@ -856,10 +856,14 @@ prerr_endline ("%%%%%%: " ^ CicPp.ppterm term' ^ " <==> " ^ CicPp.ppterm t1);
             with  CicUtil.Subst_not_found _ -> false,ugraph)
           (* TASSI: CONSTRAINTS *)
         | (C.Sort (C.Type t1), C.Sort (C.Type t2)) when test_equality_only ->
-            true,(CicUniv.add_eq t2 t1 ugraph)
+            (try
+              true,(CicUniv.add_eq t2 t1 ugraph)
+             with CicUniv.UniverseInconsistency _ -> false,ugraph)
           (* TASSI: CONSTRAINTS *)
         | (C.Sort (C.Type t1), C.Sort (C.Type t2)) ->
-            true,(CicUniv.add_ge t2 t1 ugraph)
+            (try
+              true,(CicUniv.add_ge t2 t1 ugraph)
+             with CicUniv.UniverseInconsistency _ -> false,ugraph)
           (* TASSI: CONSTRAINTS *)
         | (C.Sort s1, C.Sort (C.Type _)) -> (not test_equality_only),ugraph
           (* TASSI: CONSTRAINTS *)
@@ -1116,7 +1120,7 @@ let normalize ?delta ?subst ctx term =
   
   
 (* performs an head beta/cast reduction *)
-let rec head_beta_reduce =
+let rec head_beta_reduce ?(delta=false) =
  function
     (Cic.Appl (Cic.Lambda (_,_,t)::he'::tl')) ->
       let he'' = CicSubstitution.subst he' t in
@@ -1128,8 +1132,33 @@ let rec head_beta_reduce =
             Cic.Appl l -> Cic.Appl (l@tl')
           | _ -> Cic.Appl (he''::tl')
         in
-         head_beta_reduce he'''
-  | Cic.Cast (te,_) -> head_beta_reduce te
+         head_beta_reduce ~delta he'''
+  | Cic.Cast (te,_) -> head_beta_reduce ~delta te
+  | Cic.Appl (Cic.Const (uri,ens)::tl) as t when delta=true ->
+     let bo =
+      match fst (CicEnvironment.get_cooked_obj CicUniv.empty_ugraph uri) with
+         Cic.Constant (_,bo,_,_,_) -> bo
+       | Cic.Variable _ -> raise ReferenceToVariable
+       | Cic.CurrentProof (_,_,bo,_,_,_) -> Some bo
+       | Cic.InductiveDefinition _ -> raise ReferenceToInductiveDefinition
+     in
+      (match bo with
+          None -> t
+        | Some bo ->
+           head_beta_reduce
+            ~delta (Cic.Appl ((CicSubstitution.subst_vars ens bo)::tl)))
+  | Cic.Const (uri,ens) as t when delta=true ->
+     let bo =
+      match fst (CicEnvironment.get_cooked_obj CicUniv.empty_ugraph uri) with
+         Cic.Constant (_,bo,_,_,_) -> bo
+       | Cic.Variable _ -> raise ReferenceToVariable
+       | Cic.CurrentProof (_,_,bo,_,_,_) -> Some bo
+       | Cic.InductiveDefinition _ -> raise ReferenceToInductiveDefinition
+     in
+      (match bo with
+          None -> t
+        | Some bo ->
+           head_beta_reduce ~delta (CicSubstitution.subst_vars ens bo))
   | t -> t
 
 (*