]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/tactics/declarative.ml
The rewritingstep declarative command now takes also a list of arguments
[helm.git] / helm / software / components / tactics / declarative.ml
index 3a24b0d5fd737624da42532c8d4bba173b998f51..7e276a8bcef73f63b273e9ed00ae3f61541f7d09 100644 (file)
@@ -34,53 +34,91 @@ let assume id t =
 ;;
 
 let suppose t id ty =
-(*BUG: ty not used *)
+(*BUG: check on t missing *)
+ let ty = match ty with None -> t | Some ty -> ty in
  Tacticals.then_
    ~start:
-       (Tactics.intros ~howmany:1
-             ~mk_fresh_name_callback:(fun _ _ _ ~typ -> Cic.Name id) ())
+     (Tactics.intros ~howmany:1
+       ~mk_fresh_name_callback:(fun _ _ _ ~typ -> Cic.Name id) ())
    ~continuation:
-            (Tactics.change ~pattern:(None,[id,Cic.Implicit (Some `Hole)],None)  
-              (fun _ metasenv ugraph -> t,metasenv,ugraph))
+     (Tactics.change ~pattern:(None,[id,Cic.Implicit (Some `Hole)],None)  
+      (fun _ metasenv ugraph -> ty,metasenv,ugraph))
 ;;
 
-let by_term_we_proved t ty id ty' =
-(*BUG: ty' not used *)
- match t with
-    None -> assert false
-  | Some t ->
-     Tacticals.thens
-     ~start:
-       (Tactics.cut ty
-         ~mk_fresh_name_callback:(fun _ _ _  ~typ -> Cic.Name id))
-     ~continuations:
-       [ Tacticals.id_tac ; Tactics.apply t ]
+let by_term_we_proved ~dbd ~universe t ty id ty' =
+ let just =
+  match t with
+     None -> Tactics.auto ~dbd ~params:[] ~universe
+   | Some t -> Tactics.apply t
+ in
+  match id with
+     None ->
+      (match ty' with
+          None -> assert false
+        | Some ty' ->
+           Tacticals.then_
+            ~start:(Tactics.change
+              ~pattern:(ProofEngineTypes.conclusion_pattern None)
+              (fun _ metasenv ugraph -> ty,metasenv,ugraph))
+            ~continuation:just
+      )
+   | Some id ->
+       let continuation =
+        match ty' with
+           None -> Tacticals.id_tac
+         | Some ty' ->
+             Tactics.change ~pattern:(None,[id,Cic.Implicit (Some `Hole)],None)
+              (fun _ metasenv ugraph -> ty',metasenv,ugraph)
+       in
+        Tacticals.thens
+        ~start:
+          (Tactics.cut ty
+            ~mk_fresh_name_callback:(fun _ _ _  ~typ -> Cic.Name id))
+        ~continuations:[ continuation ; just ]
 ;;
 
-let bydone t =
-   match t with
-    None -> assert false
-  | Some t ->
-    (Tactics.apply ~term:t)
+let bydone ~dbd ~universe t =
+ let just =
+  match t with
+     None -> Tactics.auto ~dbd ~params:[] ~universe
+   | Some t -> Tactics.apply t
+ in
+  just
 ;;
 
 let we_need_to_prove t id ty =
-(*BUG: ty not used *)
- let aux status =
-  let proof,goals =
-   ProofEngineTypes.apply_tactic
-    (Tactics.cut t
-      ~mk_fresh_name_callback:(fun _ _ _  ~typ -> Cic.Name id))
-    status
-  in
-   let goals' =
-    match goals with
-       [fst; snd] -> [snd; fst]
-     | _ -> assert false
-   in
-    proof,goals'
- in
-  ProofEngineTypes.mk_tactic aux
+ match id with
+    None ->
+     (match ty with
+         None -> Tacticals.id_tac (*BUG: check missing here *)
+       | Some ty ->
+          Tactics.change ~pattern:(ProofEngineTypes.conclusion_pattern None)
+           (fun _ metasenv ugraph -> ty,metasenv,ugraph))
+  | Some id ->
+     let aux status =
+      let cont,cutted =
+       match ty with
+          None -> Tacticals.id_tac,t
+        | Some ty ->
+           Tactics.change ~pattern:(None,[id,Cic.Implicit (Some `Hole)],None)
+             (fun _ metasenv ugraph -> t,metasenv,ugraph), ty in
+      let proof,goals =
+       ProofEngineTypes.apply_tactic
+        (Tacticals.thens
+          ~start:
+           (Tactics.cut cutted
+             ~mk_fresh_name_callback:(fun _ _ _  ~typ -> Cic.Name id))
+          ~continuations:[cont])
+        status
+      in
+       let goals' =
+        match goals with
+           [fst; snd] -> [snd; fst]
+         | _ -> assert false
+       in
+        proof,goals'
+     in
+      ProofEngineTypes.mk_tactic aux
 ;;
 
 let existselim t id1 t1 id2 t2 =
@@ -96,13 +134,13 @@ let existselim t id1 t1 id2 t2 =
 
 let andelim = existselim;;
 
-let rewritingstep lhs rhs just conclude =
+let rewritingstep ~dbd ~universe lhs rhs just conclude =
  let aux ((proof,goal) as status) =
   let (curi,metasenv,proofbo,proofty) = proof in
   let _,context,_ = CicUtil.lookup_meta goal metasenv in
   let eq,trans =
    match LibraryObjects.eq_URI () with
-      None -> assert false (*TODO*)
+      None -> raise (ProofEngineTypes.Fail (lazy "You need to register the default equality first. Please use the \"default\" command"))
     | Some uri ->
       Cic.MutInd (uri,0,[]), Cic.Const (LibraryObjects.trans_eq_URI ~eq:uri,[])
   in
@@ -110,8 +148,18 @@ let rewritingstep lhs rhs just conclude =
    CicTypeChecker.type_of_aux' metasenv context rhs CicUniv.empty_ugraph in
   let just =
    match just with
-      None -> assert false (*TOOD*)
-    | Some just -> just
+      `Auto params ->
+        let params =
+         if not (List.exists (fun (k,_) -> k = "paramodulation") params) then
+          ("paramodulation","1")::params
+         else params in
+        let params =
+         if not (List.exists (fun (k,_) -> k = "timeout") params) then
+          ("timeout","3")::params
+         else params
+        in
+         Tactics.auto ~dbd ~params ~universe
+    | `Term just -> Tactics.apply just 
   in
    match lhs with
       None ->
@@ -136,7 +184,9 @@ let rewritingstep lhs rhs just conclude =
                 ~continuations:
                   [ Tactics.apply prhs ;
                     Tactics.apply (Cic.Rel 1) ;
-                    Tactics.apply just]) status
+                    Tacticals.then_
+                     ~start:(Tactics.clear ~hyps:[last_hyp_name])
+                     ~continuation:just]) status
           | Some name ->
              let mk_fresh_name_callback =
              fun metasenv context _ ~typ ->
@@ -154,11 +204,13 @@ let rewritingstep lhs rhs just conclude =
                       ~continuations:
                         [ Tactics.apply prhs ;
                           Tactics.apply (Cic.Rel 1) ;
-                          Tactics.apply just]
+                          Tacticals.then_
+                           ~start:(Tactics.clear ~hyps:[last_hyp_name])
+                           ~continuation:just]
                    ]) status)
     | Some lhs ->
        match conclude with
-          None -> ProofEngineTypes.apply_tactic (Tactics.apply just) status
+          None -> ProofEngineTypes.apply_tactic just status
         | Some name ->
             let mk_fresh_name_callback =
             fun metasenv context _ ~typ ->
@@ -170,16 +222,42 @@ let rewritingstep lhs rhs just conclude =
                 ~start:
                   (Tactics.cut ~mk_fresh_name_callback
                     (Cic.Appl [eq ; ty ; lhs ; rhs]))
-                ~continuations:[ Tacticals.id_tac ; Tactics.apply just ]) status
+                ~continuations:[ Tacticals.id_tac ; just ]) status
  in
   ProofEngineTypes.mk_tactic aux
 ;;
 
-let case _ = assert false
+let we_proceed_by_induction_on t pat =
+ (*BUG here: pat unused *)
+ Tactics.elim_intros ~depth:0 t
 ;;
-let thesisbecomes _ = assert false
-;;
-let byinduction _ = assert false
+
+let case id ~params =
+ (*BUG here: id unused*)
+ (*BUG here: it does not verify that the previous branch is closed *)
+ (*BUG here: the params should be parsed telescopically*)
+ (*BUG here: the tactic_terms should be terms*)
+ let rec aux ~params ((proof,goal) as status) =
+  match params with
+     [] -> proof,[goal]
+   | (id,t)::tl ->
+      match ProofEngineTypes.apply_tactic (assume id t) status with
+         proof,[goal] -> aux tl (proof,goal)
+       | _ -> assert false
+ in
+  ProofEngineTypes.mk_tactic (aux ~params)
 ;;
-let we_proceed_by_induction_on _ = assert false
+
+let thesisbecomes t =
+let ty = None in
+ match ty with
+    None ->
+     Tactics.change ~pattern:(None,[],Some (Cic.Implicit (Some `Hole)))
+      (fun _ metasenv ugraph -> t,metasenv,ugraph)
+  | Some ty ->
+     (*BUG here: missing check on t *)
+     Tactics.change ~pattern:(None,[],Some (Cic.Implicit (Some `Hole)))
+      (fun _ metasenv ugraph -> ty,metasenv,ugraph)
 ;;
+
+let byinduction t id  = suppose t id None;;