]> matita.cs.unibo.it Git - helm.git/blobdiff - components/tactics/primitiveTactics.ml
added some code to print the praamodulation proofs with a graph
[helm.git] / components / tactics / primitiveTactics.ml
index 9f9da081830c94da80fdba1bde8df4d3e30e9333..1012fc9355b931ae19a770a9abc90b9f1a54f430 100644 (file)
@@ -251,7 +251,7 @@ let apply_with_subst ~term ~subst ~maxmeta (proof, goal) =
  let module T = CicTypeChecker in
  let module R = CicReduction in
  let module C = Cic in
-  let (_,metasenv,_,_) = proof in
+  let (_,metasenv,_,_, _) = proof in
   let metano,context,ty = CicUtil.lookup_meta goal metasenv in
   let newmeta = max (CicMkImplicit.new_meta metasenv subst) maxmeta in
    let exp_named_subst_diff,newmeta',newmetasenvfragment,term' =
@@ -365,7 +365,7 @@ let intros_tac ?howmany ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_
  =
   let module C = Cic in
   let module R = CicReduction in
-   let (_,metasenv,_,_) = proof in
+   let (_,metasenv,_,_, _) = proof in
    let metano,context,ty = CicUtil.lookup_meta goal metasenv in
     let newmeta = ProofEngineHelpers.new_meta_of_proof ~proof in
      let (context',ty',bo') =
@@ -385,7 +385,7 @@ let cut_tac ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_name ~subst:
   term (proof, goal)
  =
   let module C = Cic in
-   let curi,metasenv,pbo,pty = proof in
+   let curi,metasenv,pbo,pty, attrs = proof in
    let metano,context,ty = CicUtil.lookup_meta goal metasenv in
     let newmeta1 = ProofEngineHelpers.new_meta_of_proof ~proof in
     let newmeta2 = newmeta1 + 1 in
@@ -420,7 +420,7 @@ let letin_tac ?(mk_fresh_name_callback=FreshNamesGenerator.mk_fresh_name ~subst:
   term (proof, goal)
  =
   let module C = Cic in
-   let curi,metasenv,pbo,pty = proof in
+   let curi,metasenv,pbo,pty, attrs = proof in
    (* occur check *)
    let occur i t =
      let m = CicUtil.metas_of_term t in 
@@ -456,7 +456,7 @@ let letin_tac ?(mk_fresh_name_callback=FreshNamesGenerator.mk_fresh_name ~subst:
 let exact_tac ~term =
  let exact_tac ~term (proof, goal) =
   (* Assumption: the term bo must be closed in the current context *)
-  let (_,metasenv,_,_) = proof in
+  let (_,metasenv,_,_, _) = proof in
   let metano,context,ty = CicUtil.lookup_meta goal metasenv in
   let module T = CicTypeChecker in
   let module R = CicReduction in
@@ -474,13 +474,13 @@ let exact_tac ~term =
   mk_tactic (exact_tac ~term)
 
 (* not really "primitive" tactics .... *)
-let elim_tac ~term = 
- let elim_tac ~term (proof, goal) =
+let elim_tac ?using ~term = 
+ let elim_tac (proof, goal) =
   let module T = CicTypeChecker in
   let module U = UriManager in
   let module R = CicReduction in
   let module C = Cic in
-   let (curi,metasenv,proofbo,proofty) = proof in
+   let (curi,metasenv,proofbo,proofty, attrs) = proof in
    let metano,context,ty = CicUtil.lookup_meta goal metasenv in
     let termty,_ = T.type_of_aux' metasenv context term CicUniv.empty_ugraph in
     let termty = CicReduction.whd context termty in
@@ -517,7 +517,10 @@ let elim_tac ~term =
       in
        U.uri_of_string (buri ^ "/" ^ name ^ ext ^ ".con")
      in
-      let eliminator_ref = C.Const (eliminator_uri,exp_named_subst) in
+      let eliminator_ref = match using with
+         | None   -> C.Const (eliminator_uri,exp_named_subst)
+         | Some t -> t 
+       in
        let ety,_ = 
          T.type_of_aux' metasenv' context eliminator_ref CicUniv.empty_ugraph in
         let rec find_args_no =
@@ -544,20 +547,20 @@ let elim_tac ~term =
             ProofEngineHelpers.compare_metasenvs
              ~oldmetasenv:metasenv ~newmetasenv:metasenv''
            in
-           let proof' = curi,metasenv'',proofbo,proofty in
+           let proof' = curi,metasenv'',proofbo,proofty, attrs in
             let proof'', new_goals' =
              apply_tactic (apply_tac ~term:refined_term) (proof',goal)
             in
              (* The apply_tactic can have closed some of the new_goals *)
              let patched_new_goals =
-              let (_,metasenv''',_,_) = proof'' in
+              let (_,metasenv''',_,_, _) = proof'' in
                List.filter
                 (function i -> List.exists (function (j,_,_) -> j=i) metasenv'''
                 ) new_goals @ new_goals'
              in
               proof'', patched_new_goals
  in
-  mk_tactic (elim_tac ~term)
+  mk_tactic elim_tac
 ;;
 
 let cases_intros_tac ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_name ~subst:[]) term =
@@ -566,7 +569,7 @@ let cases_intros_tac ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_nam
   let module U = UriManager in
   let module R = CicReduction in
   let module C = Cic in
-   let (curi,metasenv,proofbo,proofty) = proof in
+   let (curi,metasenv,proofbo,proofty, attrs) = proof in
    let metano,context,ty = CicUtil.lookup_meta goal metasenv in
     let termty,_ = T.type_of_aux' metasenv context term CicUniv.empty_ugraph in
     let termty = CicReduction.whd context termty in
@@ -581,10 +584,10 @@ let cases_intros_tac ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_nam
           (uri,exp_named_subst,typeno,args)
       | _ -> raise NotAnInductiveTypeToEliminate
     in
-     let paramsno,patterns =
+     let paramsno,itty,patterns =
       match CicEnvironment.get_obj CicUniv.empty_ugraph uri with
          C.InductiveDefinition (tys,_,paramsno,_),_ ->
-          let _,_,_,cl = List.nth tys typeno in
+          let _,_,itty,cl = List.nth tys typeno in
           let rec aux n context t =
            match n,CicReduction.whd context t with
               0,C.Prod (name,source,target) ->
@@ -605,7 +608,7 @@ let cases_intros_tac ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_nam
             | 0,_ -> C.Implicit None
             | _,_ -> assert false
           in
-           paramsno,
+           paramsno,itty,
            List.map (function (_,cty) -> aux paramsno context cty) cl 
        | _ -> assert false
      in
@@ -623,12 +626,11 @@ let cases_intros_tac ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_nam
             0 -> target
           | n -> C.Lambda (C.Name "fixme",C.Implicit None,add_lambdas (n-1))
         in
-         add_lambdas paramsno
+         add_lambdas (count_prods context itty - paramsno)
       in
        let term_to_refine =
         C.MutCase (uri,typeno,outtype,term,patterns)
        in
-prerr_endline (CicMetaSubst.ppterm_in_context ~metasenv:metasenv' [] term_to_refine context);
         let refined_term,_,metasenv'',_ = 
          CicRefine.type_of_aux' metasenv' context term_to_refine
            CicUniv.empty_ugraph
@@ -637,13 +639,13 @@ prerr_endline (CicMetaSubst.ppterm_in_context ~metasenv:metasenv' [] term_to_ref
           ProofEngineHelpers.compare_metasenvs
            ~oldmetasenv:metasenv ~newmetasenv:metasenv''
          in
-         let proof' = curi,metasenv'',proofbo,proofty in
+         let proof' = curi,metasenv'',proofbo,proofty, attrs in
           let proof'', new_goals' =
            apply_tactic (apply_tac ~term:refined_term) (proof',goal)
           in
            (* The apply_tactic can have closed some of the new_goals *)
            let patched_new_goals =
-            let (_,metasenv''',_,_) = proof'' in
+            let (_,metasenv''',_,_,_) = proof'' in
              List.filter
               (function i -> List.exists (function (j,_,_) -> j=i) metasenv'''
               ) new_goals @ new_goals'
@@ -656,14 +658,14 @@ prerr_endline (CicMetaSubst.ppterm_in_context ~metasenv:metasenv' [] term_to_ref
 
 let elim_intros_tac ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_name ~subst:[]) 
                     ?depth ?using what =
- Tacticals.then_ ~start:(elim_tac ~term:what)
+ Tacticals.then_ ~start:(elim_tac ?using ~term:what)
   ~continuation:(intros_tac ~mk_fresh_name_callback ?howmany:depth ())
 ;;
 
 (* The simplification is performed only on the conclusion *)
 let elim_intros_simpl_tac ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_name ~subst:[])
                           ?depth ?using what =
- Tacticals.then_ ~start:(elim_tac ~term:what)
+ Tacticals.then_ ~start:(elim_tac ?using ~term:what)
   ~continuation:
    (Tacticals.thens
      ~start:(intros_tac ~mk_fresh_name_callback ?howmany:depth ())
@@ -680,7 +682,7 @@ let letout_tac =
    let mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_name ~subst:[] in
    let term = C.Sort C.Set in
    let letout_tac (proof, goal) =
-      let curi, metasenv, pbo, pty = proof in
+      let curi, metasenv, pbo, pty, attrs = proof in
       let metano, context, ty = CicUtil.lookup_meta goal metasenv in
       let newmeta = ProofEngineHelpers.new_meta_of_proof ~proof in
       let fresh_name = mk_fresh_name_callback metasenv context (Cic.Name "hole") ~typ:term in