]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/cic_proof_checking/cicTypeChecker.ml
Missing whd.
[helm.git] / helm / software / components / cic_proof_checking / cicTypeChecker.ml
index 35015e541202d36fe82a245ddd167e7322fc2c1c..88219ee37d2e9a95a05894db3fce055db3c156af 100644 (file)
@@ -1328,7 +1328,7 @@ and type_of_aux' ~logger ?(subst = []) metasenv context t ugraph =
     | C.Var (uri,exp_named_subst) ->
       incr fdebug ;
        let ugraph1 = 
-         check_exp_named_subst ~logger ~subst context exp_named_subst ugraph 
+         check_exp_named_subst uri ~logger ~subst context exp_named_subst ugraph 
        in 
        let ty,ugraph2 = type_of_variable ~logger uri ugraph1 in
        let ty1 = CicSubstitution.subst_vars exp_named_subst ty in
@@ -1441,7 +1441,7 @@ and type_of_aux' ~logger ?(subst = []) metasenv context t ugraph =
    | C.Const (uri,exp_named_subst) ->
        incr fdebug ;
        let ugraph1 = 
-        check_exp_named_subst ~logger ~subst  context exp_named_subst ugraph 
+        check_exp_named_subst uri ~logger ~subst  context exp_named_subst ugraph 
        in
        let cty,ugraph2 = type_of_constant ~logger uri ugraph1 in
        let cty1 =
@@ -1452,11 +1452,9 @@ and type_of_aux' ~logger ?(subst = []) metasenv context t ugraph =
    | C.MutInd (uri,i,exp_named_subst) ->
       incr fdebug ;
        let ugraph1 = 
-        check_exp_named_subst ~logger  ~subst context exp_named_subst ugraph 
+        check_exp_named_subst uri ~logger  ~subst context exp_named_subst ugraph 
        in
-        (* TASSI: da me c'era anche questa, ma in CVS no *)
        let mty,ugraph2 = type_of_mutual_inductive_defs ~logger uri i ugraph1 in
-        (* fine parte dubbia *)
        let cty =
         CicSubstitution.subst_vars exp_named_subst mty
        in
@@ -1464,9 +1462,8 @@ and type_of_aux' ~logger ?(subst = []) metasenv context t ugraph =
         cty,ugraph2
    | C.MutConstruct (uri,i,j,exp_named_subst) ->
        let ugraph1 = 
-        check_exp_named_subst ~logger ~subst context exp_named_subst ugraph 
+        check_exp_named_subst uri ~logger ~subst context exp_named_subst ugraph
        in
-        (* TASSI: idem come sopra *)
        let mty,ugraph2 = 
         type_of_mutual_inductive_constr ~logger uri i j ugraph1 
        in
@@ -1773,7 +1770,24 @@ end;
        let (_,ty,_) = List.nth fl i in
         ty,ugraph2
 
- and check_exp_named_subst ~logger ~subst context =
+ and check_exp_named_subst uri ~logger ~subst context ens ugraph =
+   let params =
+    let obj,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
+    (match obj with
+        Cic.Constant (_,_,_,params,_) -> params
+      | Cic.Variable (_,_,_,params,_) -> params
+      | Cic.CurrentProof (_,_,_,_,params,_) -> params
+      | Cic.InductiveDefinition (_,params,_,_) -> params
+    ) in
+   let rec check_same_order params ens =
+    match params,ens with
+     | _,[] -> ()
+     | [],_::_ ->
+        raise (TypeCheckerFailure (lazy "Bad explicit named substitution"))
+     | uri::tl,(uri',_)::tl' when UriManager.eq uri uri' ->
+        check_same_order tl tl'
+     | _::tl,l -> check_same_order tl l
+   in
    let rec check_exp_named_subst_aux ~logger esubsts l ugraph =
      match l with
         [] -> ugraph
@@ -1799,7 +1813,8 @@ end;
                 raise (TypeCheckerFailure (lazy "Wrong Explicit Named Substitution"))
                end
    in
-     check_exp_named_subst_aux ~logger []
+    check_same_order params ens ;
+    check_exp_named_subst_aux ~logger [] ens ugraph
        
  and sort_of_prod ~subst context (name,s) (t1, t2) ugraph =
   let module C = Cic in