]> matita.cs.unibo.it Git - helm.git/blobdiff - components/grafite_parser/grafiteDisambiguate.ml
now destruct takes an optional list of term rather than a sigle optional term
[helm.git] / components / grafite_parser / grafiteDisambiguate.ml
index 0e96aaf2dc871b303ed8436d158ab8a9c3229701..53142e252bfe90a135405bfe32dd00c008d7b91d 100644 (file)
@@ -1,4 +1,4 @@
-(* Copyright (C) 2005, HELM Team.
+(*
  * 
  * This file is part of HELM, an Hypertextual, Electronic
  * Library of Mathematics, developed at the Computer Science
@@ -98,7 +98,6 @@ let disambiguate_reduction_kind text prefix_len lexicon_status_ref = function
   | `Unfold (Some t) ->
       let t = disambiguate_lazy_term text prefix_len lexicon_status_ref t in
       `Unfold (Some t)
-  | `Demodulate
   | `Normalize
   | `Reduce
   | `Simpl
@@ -106,7 +105,7 @@ let disambiguate_reduction_kind text prefix_len lexicon_status_ref = function
   | `Whd as kind -> kind
 ;;
 
-let disambiguate_tactic 
+let rec disambiguate_tactic 
   lexicon_status_ref context metasenv (text,prefix_len,tactic) 
 =
   let disambiguate_term = 
@@ -117,20 +116,77 @@ let disambiguate_tactic
     disambiguate_reduction_kind text prefix_len lexicon_status_ref in
   let disambiguate_lazy_term = 
     disambiguate_lazy_term text prefix_len lexicon_status_ref in
+  let disambiguate_tactic metasenv tac =
+   disambiguate_tactic lexicon_status_ref context metasenv (text,prefix_len,tac)
+  in
    match tactic with
+    (* Higher  order tactics *)
+    | GrafiteAst.Progress (loc,tac) ->
+        let metasenv,tac = disambiguate_tactic metasenv tac in
+        metasenv,GrafiteAst.Progress (loc,tac)
+    | GrafiteAst.Solve (loc,tacl) ->
+        let metasenv,tacl =
+         List.fold_right
+          (fun tac (metasenv,tacl) ->
+            let metasenv,tac = disambiguate_tactic metasenv tac in
+             metasenv,tac::tacl
+          ) tacl (metasenv,[])
+        in
+         metasenv,GrafiteAst.Solve (loc,tacl)
+    | GrafiteAst.Try (loc,tac) ->
+        let metasenv,tac = disambiguate_tactic metasenv tac in
+        metasenv,GrafiteAst.Try (loc,tac)
+    | GrafiteAst.First (loc,tacl) ->
+        let metasenv,tacl =
+         List.fold_right
+          (fun tac (metasenv,tacl) ->
+            let metasenv,tac = disambiguate_tactic metasenv tac in
+             metasenv,tac::tacl
+          ) tacl (metasenv,[])
+        in
+         metasenv,GrafiteAst.First (loc,tacl)
+    | GrafiteAst.Seq (loc,tacl) ->
+        let metasenv,tacl =
+         List.fold_right
+          (fun tac (metasenv,tacl) ->
+            let metasenv,tac = disambiguate_tactic metasenv tac in
+             metasenv,tac::tacl
+          ) tacl (metasenv,[])
+        in
+         metasenv,GrafiteAst.Seq (loc,tacl)
+    | GrafiteAst.Repeat (loc,tac) ->
+        let metasenv,tac = disambiguate_tactic metasenv tac in
+        metasenv,GrafiteAst.Repeat (loc,tac)
+    | GrafiteAst.Do (loc,n,tac) ->
+        let metasenv,tac = disambiguate_tactic metasenv tac in
+        metasenv,GrafiteAst.Do (loc,n,tac)
+    | GrafiteAst.Then (loc,tac,tacl) ->
+        let metasenv,tac = disambiguate_tactic metasenv tac in
+        let metasenv,tacl =
+         List.fold_right
+          (fun tac (metasenv,tacl) ->
+            let metasenv,tac = disambiguate_tactic metasenv tac in
+             metasenv,tac::tacl
+          ) tacl (metasenv,[])
+        in
+         metasenv,GrafiteAst.Then (loc,tac,tacl)
+    (* First order tactics *)
     | GrafiteAst.Absurd (loc, term) -> 
         let metasenv,cic = disambiguate_term context metasenv term in
         metasenv,GrafiteAst.Absurd (loc, cic)
     | GrafiteAst.Apply (loc, term) ->
         let metasenv,cic = disambiguate_term context metasenv term in
         metasenv,GrafiteAst.Apply (loc, cic)
-    | GrafiteAst.ApplyS (loc, term) ->
+    | GrafiteAst.ApplyS (loc, term, params) ->
         let metasenv,cic = disambiguate_term context metasenv term in
-        metasenv,GrafiteAst.ApplyS (loc, cic)
+        metasenv,GrafiteAst.ApplyS (loc, cic, params)
     | GrafiteAst.Assumption loc ->
         metasenv,GrafiteAst.Assumption loc
-    | GrafiteAst.Auto (loc,depth,width,paramodulation,full) ->
-        metasenv,GrafiteAst.Auto (loc,depth,width,paramodulation,full)
+    | GrafiteAst.AutoBatch (loc,params) ->
+        metasenv,GrafiteAst.AutoBatch (loc,params)
+    | GrafiteAst.Cases (loc, what, idents) ->
+        let metasenv,what = disambiguate_term context metasenv what in
+        metasenv,GrafiteAst.Cases (loc, what, idents)
     | GrafiteAst.Change (loc, pattern, with_what) -> 
         let with_what = disambiguate_lazy_term with_what in
         let pattern = disambiguate_pattern pattern in
@@ -139,6 +195,16 @@ let disambiguate_tactic
         metasenv,GrafiteAst.Clear (loc,id)
     | GrafiteAst.ClearBody (loc,id) ->
        metasenv,GrafiteAst.ClearBody (loc,id)
+    | GrafiteAst.Compose (loc, t1, t2, times, spec) ->
+        let metasenv,t1 = disambiguate_term context metasenv t1 in
+        let metasenv,t2 = 
+          match t2 with
+          | None -> metasenv, None
+          | Some t2 -> 
+              let m, t2 = disambiguate_term context metasenv t2 in
+              m, Some t2
+        in
+        metasenv,   GrafiteAst.Compose (loc, t1, t2, times, spec)
     | GrafiteAst.Constructor (loc,n) ->
         metasenv,GrafiteAst.Constructor (loc,n)
     | GrafiteAst.Contradiction loc ->
@@ -146,44 +212,38 @@ let disambiguate_tactic
     | GrafiteAst.Cut (loc, ident, term) -> 
         let metasenv,cic = disambiguate_term context metasenv term in
         metasenv,GrafiteAst.Cut (loc, ident, cic)
-    | GrafiteAst.Decompose (loc, types, what, names) ->
-        let disambiguate (metasenv,types) = function
-           | GrafiteAst.Type _   -> assert false
-           | GrafiteAst.Ident id ->
-              (match
-                disambiguate_term context metasenv
-                 (CicNotationPt.Ident(id, None))
-               with
-                | metasenv,Cic.MutInd (uri, tyno, _) ->
-                    metasenv,(GrafiteAst.Type (uri, tyno) :: types)
-                | _ ->
-                  raise (GrafiteDisambiguator.DisambiguationError
-                   (0,[[None,lazy "Decompose works only on inductive types"]])))
-        in
-        let metasenv,types =
-         List.fold_left disambiguate (metasenv,[]) types
+    | GrafiteAst.Decompose (loc, names) ->
+         metasenv,GrafiteAst.Decompose (loc, names)
+    | GrafiteAst.Demodulate loc ->
+        metasenv,GrafiteAst.Demodulate loc
+    | GrafiteAst.Destruct (loc, Some terms) ->
+        let map term (metasenv, terms) =
+           let metasenv, term = disambiguate_term context metasenv term in
+           metasenv, term :: terms
         in
-         metasenv,GrafiteAst.Decompose (loc, types, what, names)
-    | GrafiteAst.Discriminate (loc,term) ->
-        let metasenv,term = disambiguate_term context metasenv term in
-        metasenv,GrafiteAst.Discriminate(loc,term)
+        let metasenv, terms = List.fold_right map terms (metasenv, []) in 
+       metasenv, GrafiteAst.Destruct(loc, Some terms)
+    | GrafiteAst.Destruct (loc, None) ->
+        metasenv,GrafiteAst.Destruct(loc,None)
     | GrafiteAst.Exact (loc, term) -> 
         let metasenv,cic = disambiguate_term context metasenv term in
         metasenv,GrafiteAst.Exact (loc, cic)
-    | GrafiteAst.Elim (loc, what, Some using, depth, idents) ->
-        let metasenv,what = disambiguate_term context metasenv what in
+    | GrafiteAst.Elim (loc, what, Some using, pattern, specs) ->
+       let metasenv,what = disambiguate_term context metasenv what in
         let metasenv,using = disambiguate_term context metasenv using in
-        metasenv,GrafiteAst.Elim (loc, what, Some using, depth, idents)
-    | GrafiteAst.Elim (loc, what, None, depth, idents) ->
-        let metasenv,what = disambiguate_term context metasenv what in
-        metasenv,GrafiteAst.Elim (loc, what, None, depth, idents)
-    | GrafiteAst.ElimType (loc, what, Some using, depth, idents) ->
+       let pattern = disambiguate_pattern pattern in
+        metasenv,GrafiteAst.Elim (loc, what, Some using, pattern, specs)
+    | GrafiteAst.Elim (loc, what, None, pattern, specs) ->
+       let metasenv,what = disambiguate_term context metasenv what in
+       let pattern = disambiguate_pattern pattern in
+        metasenv,GrafiteAst.Elim (loc, what, None, pattern, specs)
+    | GrafiteAst.ElimType (loc, what, Some using, specs) ->
         let metasenv,what = disambiguate_term context metasenv what in
         let metasenv,using = disambiguate_term context metasenv using in
-        metasenv,GrafiteAst.ElimType (loc, what, Some using, depth, idents)
-    | GrafiteAst.ElimType (loc, what, None, depth, idents) ->
+        metasenv,GrafiteAst.ElimType (loc, what, Some using, specs)
+    | GrafiteAst.ElimType (loc, what, None, specs) ->
         let metasenv,what = disambiguate_term context metasenv what in
-        metasenv,GrafiteAst.ElimType (loc, what, None, depth, idents)
+        metasenv,GrafiteAst.ElimType (loc, what, None, specs)
     | GrafiteAst.Exists loc ->
         metasenv,GrafiteAst.Exists loc 
     | GrafiteAst.Fail loc ->
@@ -200,26 +260,21 @@ let disambiguate_tactic
     | GrafiteAst.Generalize (loc,pattern,ident) ->
         let pattern = disambiguate_pattern pattern in
         metasenv,GrafiteAst.Generalize (loc,pattern,ident)
-    | GrafiteAst.Goal (loc, g) ->
-        metasenv,GrafiteAst.Goal (loc, g)
     | GrafiteAst.IdTac loc ->
         metasenv,GrafiteAst.IdTac loc
-    | GrafiteAst.Injection (loc, term) ->
-        let metasenv,term = disambiguate_term context metasenv term in
-        metasenv,GrafiteAst.Injection (loc,term)
-    | GrafiteAst.Intros (loc, num, names) ->
-        metasenv,GrafiteAst.Intros (loc, num, names)
+    | GrafiteAst.Intros (loc, specs) ->
+        metasenv,GrafiteAst.Intros (loc, specs)
     | GrafiteAst.Inversion (loc, term) ->
        let metasenv,term = disambiguate_term context metasenv term in
         metasenv,GrafiteAst.Inversion (loc, term)
-    | GrafiteAst.LApply (loc, depth, to_what, what, ident) ->
-       let f term to_what =
-          let metasenv,term = disambiguate_term context metasenv term in
-          term :: to_what
+    | GrafiteAst.LApply (loc, linear, depth, to_what, what, ident) ->
+       let f term (metasenv, to_what) =
+          let metasenv, term = disambiguate_term context metasenv term in
+          metasenv, term :: to_what
        in
-       let to_what = List.fold_right f to_what [] in 
-       let metasenv,what = disambiguate_term context metasenv what in
-       metasenv,GrafiteAst.LApply (loc, depth, to_what, what, ident)
+       let metasenv, to_what = List.fold_right f to_what (metasenv, []) in 
+       let metasenv, what = disambiguate_term context metasenv what in
+       metasenv,GrafiteAst.LApply (loc, linear, depth, to_what, what, ident)
     | GrafiteAst.Left loc ->
        metasenv,GrafiteAst.Left loc
     | GrafiteAst.LetIn (loc, term, name) ->
@@ -235,10 +290,10 @@ let disambiguate_tactic
         let pattern = disambiguate_pattern pattern in
         let with_what = disambiguate_lazy_term with_what in
         metasenv,GrafiteAst.Replace (loc, pattern, with_what)
-    | GrafiteAst.Rewrite (loc, dir, t, pattern) ->
+    | GrafiteAst.Rewrite (loc, dir, t, pattern, names) ->
         let metasenv,term = disambiguate_term context metasenv t in
         let pattern = disambiguate_pattern pattern in
-        metasenv,GrafiteAst.Rewrite (loc, dir, term, pattern)
+        metasenv,GrafiteAst.Rewrite (loc, dir, term, pattern, names)
     | GrafiteAst.Right loc ->
         metasenv,GrafiteAst.Right loc
     | GrafiteAst.Ring loc ->
@@ -250,6 +305,106 @@ let disambiguate_tactic
     | GrafiteAst.Transitivity (loc, term) -> 
         let metasenv,cic = disambiguate_term context metasenv term in
         metasenv,GrafiteAst.Transitivity (loc, cic)
+      (* Nuovi casi *)
+    | GrafiteAst.Assume (loc, id, term) -> 
+        let metasenv,cic = disambiguate_term context metasenv term in
+        metasenv,GrafiteAst.Assume (loc, id, cic)
+    | GrafiteAst.Suppose (loc, term, id, term') ->
+        let metasenv,cic = disambiguate_term context metasenv term in
+       let metasenv,cic' =
+          match term' with
+             None -> metasenv,None
+           | Some t ->
+                 let metasenv,t = disambiguate_term context metasenv t in
+                 metasenv,Some t in
+       metasenv,GrafiteAst.Suppose (loc, cic, id, cic')
+    | GrafiteAst.Bydone (loc,term) ->
+        let metasenv,cic = 
+          match term with
+             None -> metasenv,None
+            |Some t ->
+                 let metasenv,t = disambiguate_term context metasenv t in
+                metasenv,Some t in
+                metasenv,GrafiteAst.Bydone (loc, cic)
+    | GrafiteAst.We_need_to_prove (loc,term,id,term') ->
+        let metasenv,cic = disambiguate_term context metasenv term in
+       let metasenv,cic' = 
+           match term' with
+             None -> metasenv,None
+           | Some t ->
+                 let metasenv,t = disambiguate_term context metasenv t in
+                 metasenv,Some t in
+       metasenv,GrafiteAst.We_need_to_prove (loc,cic,id,cic')
+    | GrafiteAst.By_term_we_proved (loc,term,term',id,term'') ->
+        let metasenv,cic =
+          match term with 
+            None -> metasenv,None
+          | Some t ->
+                let metasenv,t = disambiguate_term context metasenv t in
+                metasenv,Some t in
+        let metasenv,cic' = disambiguate_term context metasenv term' in
+       let metasenv,cic'' = 
+           match term'' with
+             None -> metasenv,None
+          |  Some t ->  
+                   let metasenv,t = disambiguate_term context metasenv t in
+                    metasenv,Some t in
+       metasenv,GrafiteAst.By_term_we_proved (loc,cic,cic',id,cic'')
+    | GrafiteAst.We_proceed_by_cases_on (loc, term, term') ->
+        let metasenv,cic = disambiguate_term context metasenv term in
+       let metasenv,cic' = disambiguate_term context metasenv term' in
+       metasenv,GrafiteAst.We_proceed_by_cases_on (loc, cic, cic')
+    | GrafiteAst.We_proceed_by_induction_on (loc, term, term') ->
+        let metasenv,cic = disambiguate_term context metasenv term in
+       let metasenv,cic' = disambiguate_term context metasenv term' in
+       metasenv,GrafiteAst.We_proceed_by_induction_on (loc, cic, cic')
+   | GrafiteAst.Byinduction (loc, term, id) ->
+        let metasenv,cic = disambiguate_term context metasenv term in
+       metasenv,GrafiteAst.Byinduction(loc, cic, id)
+   | GrafiteAst.Thesisbecomes (loc, term) ->
+        let metasenv,cic = disambiguate_term context metasenv term in
+       metasenv,GrafiteAst.Thesisbecomes (loc, cic)
+   | GrafiteAst.ExistsElim (loc, term, id1, term1, id2, term2) ->
+       let metasenv,cic =
+           match term with
+             None -> metasenv,None
+           | Some t ->
+                 let metasenv,t = disambiguate_term context metasenv t in
+                 metasenv,Some t in
+        let metasenv,cic' = disambiguate_term context metasenv term1 in
+       let cic''= disambiguate_lazy_term term2 in
+       metasenv,GrafiteAst.ExistsElim(loc, cic, id1, cic', id2, cic'')
+   | GrafiteAst.AndElim (loc, term, id, term1, id1, term2) ->
+       let metasenv,cic = disambiguate_term context metasenv term in
+       let metasenv,cic'= disambiguate_term context metasenv term1 in
+       let metasenv,cic''= disambiguate_term context metasenv term2 in
+       metasenv,GrafiteAst.AndElim(loc, cic, id, cic', id1, cic'')   
+   | GrafiteAst.Case (loc, id, params) ->
+        let metasenv,params' =
+        List.fold_right
+         (fun (id,term) (metasenv,params) ->
+            let metasenv,cic = disambiguate_term context metasenv term in
+            metasenv,(id,cic)::params
+         ) params (metasenv,[])
+       in
+       metasenv,GrafiteAst.Case(loc, id, params')   
+   | GrafiteAst.RewritingStep (loc, term1, term2, term3, cont) ->
+        let metasenv,cic =
+        match term1 with
+           None -> metasenv,None
+         | Some (start,t) -> 
+            let metasenv,t = disambiguate_term context metasenv t in
+             metasenv,Some (start,t) in
+       let metasenv,cic'= disambiguate_term context metasenv term2 in
+        let metasenv,cic'' =
+        match term3 with
+           `Auto _ as t -> metasenv,t
+         | `Term t -> 
+            let metasenv,t = disambiguate_term context metasenv t in
+             metasenv,`Term t
+          | `Proof as t -> metasenv,t in
+       metasenv,GrafiteAst.RewritingStep (loc, cic, cic', cic'', cont)   
+
 
 let disambiguate_obj lexicon_status ~baseuri metasenv (text,prefix_len,obj) =
   let uri =
@@ -272,18 +427,50 @@ let disambiguate_obj lexicon_status ~baseuri metasenv (text,prefix_len,obj) =
   lexicon_status, metasenv, cic
   
 let disambiguate_command lexicon_status ~baseuri metasenv (text,prefix_len,cmd)=
- match cmd with
-  | GrafiteAst.Coercion _
-  | GrafiteAst.Default _
-  | GrafiteAst.Drop _
-  | GrafiteAst.Include _
-  | GrafiteAst.Qed _
-  | GrafiteAst.Set _ as cmd ->
-      lexicon_status,metasenv,cmd
-  | GrafiteAst.Obj (loc,obj) ->
-      let lexicon_status,metasenv,obj =
-       disambiguate_obj lexicon_status ~baseuri metasenv (text,prefix_len,obj)in
-      lexicon_status, metasenv, GrafiteAst.Obj (loc,obj)
+  match cmd with
+   | GrafiteAst.Index(loc,key,uri) ->
+       let lexicon_status_ref = ref lexicon_status in 
+       let disambiguate_term =
+        disambiguate_term text prefix_len lexicon_status_ref [] in
+       let disambiguate_term_option metasenv =
+        function
+             None -> metasenv,None
+          | Some t ->
+               let metasenv,t = disambiguate_term metasenv t in
+                metasenv, Some t
+       in
+       let metasenv,key = disambiguate_term_option metasenv key in
+       !lexicon_status_ref, metasenv,GrafiteAst.Index(loc,key,uri)
+   | GrafiteAst.Coercion _
+   | GrafiteAst.Default _
+   | GrafiteAst.Drop _
+   | GrafiteAst.Include _
+   | GrafiteAst.Print _
+   | GrafiteAst.Qed _
+   | GrafiteAst.Set _ as cmd ->
+       lexicon_status,metasenv,cmd
+   | GrafiteAst.Obj (loc,obj) ->
+       let lexicon_status,metasenv,obj =
+        disambiguate_obj lexicon_status ~baseuri metasenv (text,prefix_len,obj)in
+       lexicon_status, metasenv, GrafiteAst.Obj (loc,obj)
+   | GrafiteAst.Relation (loc,id,a,aeq,refl,sym,trans) ->
+      let lexicon_status_ref = ref lexicon_status in 
+      let disambiguate_term =
+       disambiguate_term text prefix_len lexicon_status_ref [] in
+      let disambiguate_term_option metasenv =
+       function
+          None -> metasenv,None
+       | Some t ->
+          let metasenv,t = disambiguate_term metasenv t in
+           metasenv, Some t
+      in
+      let metasenv,a = disambiguate_term metasenv a in
+      let metasenv,aeq = disambiguate_term metasenv aeq in
+      let metasenv,refl = disambiguate_term_option metasenv refl in
+      let metasenv,sym = disambiguate_term_option metasenv sym in
+      let metasenv,trans = disambiguate_term_option metasenv trans in
+       !lexicon_status_ref, metasenv,
+        GrafiteAst.Relation (loc,id,a,aeq,refl,sym,trans)
 
 let disambiguate_macro 
   lexicon_status_ref metasenv context (text,prefix_len, macro) 
@@ -305,10 +492,8 @@ let disambiguate_macro
    | GrafiteAst.Check (loc,term) ->
       let metasenv,term = disambiguate_term context metasenv term in
        metasenv,GrafiteAst.Check (loc,term)
+   | GrafiteAst.AutoInteractive _
    | GrafiteAst.Hint _
-   | GrafiteAst.WLocate _ as macro ->
+   | GrafiteAst.WLocate _
+   | GrafiteAst.Inline _ as macro ->
       metasenv,macro
-   | GrafiteAst.Quit _
-   | GrafiteAst.Print _
-   | GrafiteAst.Search_pat _
-   | GrafiteAst.Search_term _ -> assert false