]> matita.cs.unibo.it Git - helm.git/blobdiff - components/tactics/inversion.ml
"the thesis becomes" now always performs a change.
[helm.git] / components / tactics / inversion.ml
index 0ff369a9a6d4b4367cfeec9bce090c386eeeb029..e7adcb7a8ac5145496b50e431a4fb5a2750ca9c8 100644 (file)
@@ -171,6 +171,7 @@ let isSetType paramty = ((Pervasives.compare
   (get_sort_type paramty)
   (Cic.Sort Cic.Prop)) != 0) 
 
+exception EqualityNotDefinedYet
 let private_inversion_tac ~term =
  let module T = CicTypeChecker in
  let module R = CicReduction in
@@ -181,7 +182,11 @@ let private_inversion_tac ~term =
  
  (*DEBUG*) debug_print (lazy  ("private inversion begins"));
  let (_,metasenv,_,_) = proof in
- let uri_of_eq = LibraryObjects.eq_URI () in
+ let uri_of_eq =
+  match LibraryObjects.eq_URI () with
+     None -> raise EqualityNotDefinedYet
+  | Some uri -> uri
+ in
  let (_,context,goalty) = CicUtil.lookup_meta goal metasenv in
  let termty,_ = T.type_of_aux' metasenv context term CicUniv.empty_ugraph in
  let uri = baseuri_of_term termty in  
@@ -209,8 +214,7 @@ let private_inversion_tac ~term =
   (List.map 
    (fun t -> (
     match (T.type_of_aux' metasenv context t CicUniv.empty_ugraph) with
-     (term,graph) -> term
-     |_ -> assert false))
+     (term,graph) -> term))
    parameters) 
  in
  let consno = List.length cons_list in
@@ -220,7 +224,7 @@ let private_inversion_tac ~term =
   parameters_tys goalty uri_of_eq in
  (*DEBUG*)  debug_print (lazy ("cut term " ^ CicPp.ppterm cut_term));
   debug_print (lazy ("CONTEXT before apply HCUT: " ^ 
-   (CicMetaSubst.ppcontext [] context )));
+   (CicMetaSubst.ppcontext ~metasenv [] context )));
   debug_print (lazy ("termty " ^ CicPp.ppterm termty));
  (* cut DXn=DXn \to GOAL *)
  let proof1,gl1 = PET.apply_tactic (P.cut_tac cut_term) (proof,goal) in
@@ -251,7 +255,7 @@ let private_inversion_tac ~term =
  debug_print 
   (lazy ("Right param: " ^ (CicPp.ppterm (Cic.Appl rightparameters))));
  debug_print (lazy ("CONTEXT before refinement: " ^ 
-  (CicMetaSubst.ppcontext [] context )));
+  (CicMetaSubst.ppcontext ~metasenv [] context )));
   (*DEBUG*) debug_print (lazy  ("private inversion: term before refinement: " ^ 
    CicPp.ppterm t));
  let (ref_t,_,metasenv'',_) = CicRefine.type_of_aux' metasenv context t 
@@ -302,14 +306,17 @@ let inversion_tac ~term =
   let (_,metasenv,_,_) = proof in
   let (_,context,goalty) = CicUtil.lookup_meta goal metasenv in
   let termty,_ = T.type_of_aux' metasenv context term CicUniv.empty_ugraph in
-  let uri = baseuri_of_term termty in  
+  let uri, typeno = 
+    match termty with
+      | Cic.MutInd (uri,typeno,_) 
+      | Cic.Appl(Cic.MutInd (uri,typeno,_)::_) -> uri,typeno
+      | _ -> assert false
+  in
+  (* let uri = baseuri_of_term termty in *)
   let obj,_ = CicEnvironment.get_obj CicUniv.empty_ugraph uri in
   let name,nleft,arity,cons_list =
    match obj with
     Cic.InductiveDefinition (tys,_,nleft,_) ->
-     (*we suppose there is only one inductiveType in the definition, 
-     so typeno=0 identically *)
-     let typeno = 0 in
      let (name,_,arity,cons_list) = List.nth tys typeno in 
         (name,nleft,arity,cons_list)
    |_ -> assert false