]> matita.cs.unibo.it Git - helm.git/commitdiff
head_beta_reduce can now optionally perform delta reduction too
authorClaudio Sacerdoti Coen <claudio.sacerdoticoen@unibo.it>
Tue, 18 Jul 2006 14:30:57 +0000 (14:30 +0000)
committerClaudio Sacerdoti Coen <claudio.sacerdoticoen@unibo.it>
Tue, 18 Jul 2006 14:30:57 +0000 (14:30 +0000)
components/cic_proof_checking/cicReduction.ml
components/cic_proof_checking/cicReduction.mli

index ce8f66deb04aa554763f84ecf26299622aed11ac..b636c2a729aa2ef688d99a8c8a42e0c173b795f5 100644 (file)
@@ -1116,7 +1116,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 +1128,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
 
 (*
index e3619053d0d2163add738b5ebe8039f0cc9b1fbe..bee4607d509d240e0e8453c8e243f51ffa209dcf 100644 (file)
@@ -38,5 +38,6 @@ val are_convertible :
 val normalize:
   ?delta:bool -> ?subst:Cic.substitution -> Cic.context -> Cic.term -> Cic.term
  
-(* performs an head beta/cast reduction *)
-val head_beta_reduce: Cic.term -> Cic.term
+(* performs an head beta/cast reduction; the default is to not perform
+   delta reduction *)
+val head_beta_reduce: ?delta:bool -> Cic.term -> Cic.term