]> matita.cs.unibo.it Git - helm.git/commitdiff
new command eval added
authorEnrico Tassi <enrico.tassi@inria.fr>
Fri, 17 Oct 2008 12:12:52 +0000 (12:12 +0000)
committerEnrico Tassi <enrico.tassi@inria.fr>
Fri, 17 Oct 2008 12:12:52 +0000 (12:12 +0000)
14 files changed:
helm/software/components/grafite/grafiteAst.ml
helm/software/components/grafite/grafiteAstPp.ml
helm/software/components/grafite/grafiteAstPp.mli
helm/software/components/grafite_engine/grafiteEngine.ml
helm/software/components/grafite_engine/grafiteEngine.mli
helm/software/components/grafite_parser/grafiteDisambiguate.ml
helm/software/components/grafite_parser/grafiteDisambiguate.mli
helm/software/components/grafite_parser/grafiteParser.ml
helm/software/matita/applyTransformation.ml
helm/software/matita/applyTransformation.mli
helm/software/matita/dist/ChangeLog
helm/software/matita/help/C/sec_commands.xml
helm/software/matita/matita.lang
helm/software/matita/matitaScript.ml

index 180d687c9282d314814e579e1a1ad6b14d18461b..560e680b46718f9794cb34a3ce4f971c0f97b098 100644 (file)
@@ -132,7 +132,7 @@ type print_kind = [ `Env | `Coer ]
 type presentation_style = Declarative
                         | Procedural of int option
 
-type 'term macro = 
+type ('term,'lazy_term) macro = 
   (* Whelp's stuff *)
   | WHint of loc * 'term
   | WMatch of loc * 'term 
@@ -140,6 +140,7 @@ type 'term macro =
   | WLocate of loc * string
   | WElim of loc * 'term
   (* real macros *)
+  | Eval of loc * 'lazy_term reduction * 'term
   | Check of loc * 'term 
   | Hint of loc * bool
   | AutoInteractive of loc * 'term auto_params
@@ -180,7 +181,7 @@ type ('term,'lazy_term,'reduction,'ident) non_punctuation_tactical =
 
 type ('term, 'lazy_term, 'reduction, 'obj, 'ident) code =
   | Command of loc * ('term, 'obj) command
-  | Macro of loc * 'term macro 
+  | Macro of loc * ('term,'lazy_term) macro 
   | Tactic of loc * ('term, 'lazy_term, 'reduction, 'ident) tactic option
       * ('term, 'lazy_term, 'reduction, 'ident) punctuation_tactical
   | NonPunctuationTactical of loc
index 189d172f88e2ed327c516c96710d6da68ec29ba6..8e23e56b5357b6e2664e5548e95d5f3660d022d6 100644 (file)
@@ -248,7 +248,7 @@ let pp_arg ~term_pp arg =
    else
      "(" ^ s ^ ")"
   
-let pp_macro ~term_pp = 
+let pp_macro ~term_pp ~lazy_term_pp 
   let term_pp = pp_arg ~term_pp in
   let style_pp = function
      | Declarative         -> ""
@@ -269,6 +269,7 @@ let pp_macro ~term_pp =
      | Some `Variant          -> " as variant"
      | Some `Axiom            -> " as axiom"
   in
+  let pp_reduction_kind = pp_reduction_kind ~term_pp:lazy_term_pp in
   function 
   (* Whelp *)
   | WInstance (_, term) -> "whelp instance " ^ term_pp term
@@ -277,6 +278,8 @@ let pp_macro ~term_pp =
   | WElim (_, t) -> "whelp elim " ^ term_pp t
   | WMatch (_, term) -> "whelp match " ^ term_pp term
   (* real macros *)
+  | Eval (_, kind, term) -> 
+      Printf.sprintf "eval %s on %s" (pp_reduction_kind kind) (term_pp term) 
   | Check (_, term) -> Printf.sprintf "check %s" (term_pp term)
   | Hint (_, true) -> "hint rewrite"
   | Hint (_, false) -> "hint"
@@ -347,7 +350,7 @@ let pp_non_punctuation_tactical ~term_pp ~lazy_term_pp =
 
 let pp_executable ~map_unicode_to_tex ~term_pp ~lazy_term_pp ~obj_pp =
   function
-  | Macro (_, macro) -> pp_macro ~term_pp macro ^ "."
+  | Macro (_, macro) -> pp_macro ~term_pp ~lazy_term_pp macro ^ "."
   | Tactic (_, Some tac, punct) ->
       pp_tactic ~map_unicode_to_tex ~lazy_term_pp ~term_pp tac
       ^ pp_punctuation_tactical ~lazy_term_pp ~term_pp punct
index 647d38bbe22a35cb93f1f60ac8f134876e7c4186..8f6904545d70e7c709f2a52d4be2ce68036efccc 100644 (file)
@@ -47,7 +47,10 @@ val pp_command:
  term_pp:('term -> string) ->
   obj_pp:('obj -> string) ->
    ('term,'obj) GrafiteAst.command -> string
-val pp_macro: term_pp:('term -> string) -> 'term GrafiteAst.macro -> string
+val pp_macro: 
+  term_pp:('term -> string) -> 
+  lazy_term_pp:('lazy_term -> string) ->
+    ('term,'lazy_term) GrafiteAst.macro -> string
 val pp_comment:
   map_unicode_to_tex:bool ->
   term_pp:('term -> string) ->
index 887e767e6d55a2b894a942463151ca77f66472ef..2efbc68115c35cc7ba4a74626ffcab92dae938de 100644 (file)
@@ -32,7 +32,7 @@ exception Drop
 exception IncludedFileNotCompiled of string * string 
 exception Macro of
  GrafiteAst.loc *
-  (Cic.context -> GrafiteTypes.status * Cic.term GrafiteAst.macro)
+  (Cic.context -> GrafiteTypes.status * (Cic.term,Cic.lazy_term) GrafiteAst.macro)
 
 type 'a disambiguator_input = string * int * 'a
 
@@ -406,8 +406,8 @@ type eval_ast =
 
   disambiguate_macro:
    (GrafiteTypes.status ->
-    ('term GrafiteAst.macro) disambiguator_input ->
-    Cic.context -> GrafiteTypes.status * Cic.term GrafiteAst.macro) ->
+    (('term,'lazy_term) GrafiteAst.macro) disambiguator_input ->
+    Cic.context -> GrafiteTypes.status * (Cic.term,Cic.lazy_term) GrafiteAst.macro) ->
 
   ?do_heavy_checks:bool ->
   GrafiteTypes.status ->
@@ -443,8 +443,8 @@ type 'a eval_executable =
 
   disambiguate_macro:
    (GrafiteTypes.status ->
-    ('term GrafiteAst.macro) disambiguator_input ->
-    Cic.context -> GrafiteTypes.status * Cic.term GrafiteAst.macro) ->
+    (('term,'lazy_term) GrafiteAst.macro) disambiguator_input ->
+    Cic.context -> GrafiteTypes.status * (Cic.term,Cic.lazy_term) GrafiteAst.macro) ->
 
   options ->
   GrafiteTypes.status ->
index c868bc61546c15db95af35b56e9a5f1ff2d63680..1dabfaaa1bfd51b5cadce55eb948471ae9409c69 100644 (file)
@@ -27,7 +27,7 @@ exception Drop
 exception IncludedFileNotCompiled of string * string
 exception Macro of
  GrafiteAst.loc *
-  (Cic.context -> GrafiteTypes.status * Cic.term GrafiteAst.macro)
+  (Cic.context -> GrafiteTypes.status * (Cic.term,Cic.lazy_term) GrafiteAst.macro)
 
 type 'a disambiguator_input = string * int * 'a
   
@@ -47,8 +47,8 @@ val eval_ast :
 
   disambiguate_macro:
    (GrafiteTypes.status ->
-    ('term GrafiteAst.macro) disambiguator_input ->
-    Cic.context -> GrafiteTypes.status * Cic.term GrafiteAst.macro) ->
+    (('term,'lazy_term) GrafiteAst.macro) disambiguator_input ->
+    Cic.context -> GrafiteTypes.status * (Cic.term,Cic.lazy_term) GrafiteAst.macro) ->
 
   ?do_heavy_checks:bool ->
   GrafiteTypes.status ->
index 219ed6cd850949ed2d72c9f85fcd250693990466..47e7a86276ad3fe2af11f54c35bb14421ac15065 100644 (file)
@@ -513,6 +513,8 @@ let disambiguate_macro
   lexicon_status_ref metasenv context (text,prefix_len, macro) 
 =
  let disambiguate_term = disambiguate_term text prefix_len lexicon_status_ref in
+  let disambiguate_reduction_kind = 
+    disambiguate_reduction_kind text prefix_len lexicon_status_ref in
   match macro with
    | GrafiteAst.WMatch (loc,term) ->
       let metasenv,term = disambiguate_term context metasenv term in
@@ -529,6 +531,10 @@ let disambiguate_macro
    | GrafiteAst.Check (loc,term) ->
       let metasenv,term = disambiguate_term context metasenv term in
        metasenv,GrafiteAst.Check (loc,term)
+   | GrafiteAst.Eval (loc,kind,term) ->
+      let metasenv, term = disambiguate_term context metasenv term in
+      let kind = disambiguate_reduction_kind kind in
+       metasenv,GrafiteAst.Eval (loc,kind,term)
    | GrafiteAst.AutoInteractive (loc, params) -> 
       let metasenv, params = 
         disambiguate_auto_params disambiguate_term metasenv context params in
index 798fa75f528ed734f5e85db3ae9330156582ca29..f482741f34ca4ddc93f28dfb24fb53160e1111ff 100644 (file)
@@ -52,5 +52,5 @@ val disambiguate_macro:
  LexiconEngine.status ref ->
  Cic.metasenv ->
  Cic.context ->
- (CicNotationPt.term GrafiteAst.macro) Disambiguate.disambiguator_input ->
-  Cic.metasenv * Cic.term GrafiteAst.macro
+ ((CicNotationPt.term,CicNotationPt.term) GrafiteAst.macro) Disambiguate.disambiguator_input ->
+  Cic.metasenv * (Cic.term,Cic.lazy_term) GrafiteAst.macro
index 976bea700353fc2c002df3e7796ef734b4195ee8..558eed081fbd845aa235c488b2bb176a4611cdd2 100644 (file)
@@ -524,6 +524,8 @@ EXTEND
   macro: [
     [ [ IDENT "check"   ]; t = term ->
         GrafiteAst.Check (loc, t)
+    | [ IDENT "eval" ]; kind = reduction_kind; "on"; t = tactic_term ->
+        GrafiteAst.Eval (loc, kind, t)
     | [ IDENT "inline"]; 
         style = OPT [ IDENT "procedural"; depth = OPT int -> depth ];
         suri = QSTRING; prefix = OPT QSTRING;
index d585cfbee7fc15ab4e1aa9bea41333f71ee072a6..e1821ed88a2861147c0e4ffe7b544017dccdd280 100644 (file)
@@ -325,3 +325,15 @@ let procedural_txt_of_cic_term ~map_unicode_to_tex n ?depth context term =
         ~ids_to_inner_sorts ~ids_to_inner_types ?depth "" context annterm 
   in
   String.concat "" (List.map aux script)
+;;
+
+let txt_of_macro ~map_unicode_to_tex metasenv context m =
+   GrafiteAstPp.pp_macro
+     ~term_pp:(txt_of_cic_term ~map_unicode_to_tex 80 metasenv context) 
+     ~lazy_term_pp:(fun (f : Cic.lazy_term) ->
+        let t,metasenv,_ = f context metasenv CicUniv.empty_ugraph in
+        txt_of_cic_term ~map_unicode_to_tex 80 metasenv context t)
+     m
+;;
+
+
index 06bea6cc6b187719667c3ba5e63df5cbca096e96..95712f78eb269b6ed85aa4fe308c0745d8901b1d 100644 (file)
@@ -78,6 +78,12 @@ val txt_of_inline_macro:
   ?flavour:Cic.object_flavour -> string -> string ->
     string
 
+val txt_of_macro:
+  map_unicode_to_tex:bool ->
+    Cic.metasenv ->
+    Cic.context ->
+    (Cic.term, Cic.lazy_term) GrafiteAst.macro -> string
+
 (* columns, rendering depth, context, term *)
 val procedural_txt_of_cic_term: 
   map_unicode_to_tex:bool -> int -> ?depth:int -> 
index 66d728fa3b638bf0b4987659b365251d8dc43e75..3fe53afa60cdc71b6f855126738a04ed8532d67d 100644 (file)
@@ -1,4 +1,5 @@
 0.5.v  - dd/mm/yyy - bugfix release
+       * New macro eval
        * More code in the direction of a fully functional matita status, that
          improved undo reliability in the parser/notation modules
        * matitac was seldom compiling up-to-date files, fixed
index 4d788f39aa3feb8ed01961dd48a782b9ec2a6436..102e375adb5658efcfb116293b9b62c0145526c2 100644 (file)
      </variablelist>
    </para>
  </sect1>
+ <sect1 id="command_eval">
+   <title>eval</title>
+   <para><userinput>eval red on t</userinput></para>
+   <para>
+     <variablelist>
+       <varlistentry>
+         <term>Synopsis:</term>
+         <listitem>
+           <para><emphasis role="bold">eval</emphasis> 
+            &reduction-kind; 
+             <emphasis role="bold">on</emphasis>
+             &term;</para>
+         </listitem>
+       </varlistentry>
+       <varlistentry>
+         <term>Action:</term>
+         <listitem>
+           <para>Opens a CIC browser window that shows 
+             the reduct of 
+             <command>t</command>
+             together with its type.</para>
+         </listitem>
+       </varlistentry>
+     </variablelist>
+   </para>
+ </sect1>
  <sect1 id="command_coercion">
    <title>coercion</title>
    <para><userinput>coercion u with ariety saturation nocomposites</userinput></para>
index 3c9b1fa792d3547c070c7e11a7aab2395a4654cb..6c0f4c8dcdaa69aeadee1e79cc3619afefcf4fea 100644 (file)
     <keyword>inline</keyword>
     <keyword>procedural</keyword>
     <keyword>check</keyword>
+    <keyword>eval</keyword>
     <keyword>hint</keyword>
     <keyword>set</keyword>
     <keyword>auto</keyword>
index cbaa08721cca870b1643e5005cbf7a62ae4a6825..65d7be828f0e0ebeb4199fd3f4dbb46e8d25180c 100644 (file)
@@ -378,33 +378,22 @@ let rec eval_macro include_paths (buffer : GText.buffer) guistuff lexicon_status
   (* no idea why ocaml wants this *)
   let parsed_text_length = String.length parsed_text in
   let dbd = LibraryDb.instance () in
-  let pp_macro = 
-    let f t = ProofEngineReduction.replace 
-      ~equality:(fun _ t -> match t with Cic.Meta _ -> true | _ -> false)
-      ~what:[()] ~with_what:[Cic.Implicit None] ~where:t
-    in
-    let metasenv = GrafiteTypes.get_proof_metasenv grafite_status in
-    TAPp.pp_macro 
-      ~term_pp:(fun x -> 
-        ApplyTransformation.txt_of_cic_term max_int metasenv [] (f x)
-         ~map_unicode_to_tex:(Helm_registry.get_bool
-           "matita.paste_unicode_as_tex"))
-  in
+  let pp_macro = ApplyTransformation.txt_of_macro ~map_unicode_to_tex:true in
   match mac with
   (* WHELP's stuff *)
   | TA.WMatch (loc, term) -> 
      let l =  Whelp.match_term ~dbd term in
-     let entry = `Whelp (pp_macro mac, l) in
+     let entry = `Whelp (pp_macro [] [] mac, l) in
      guistuff.mathviewer#show_uri_list ~reuse:true ~entry l;
      [], "", parsed_text_length
   | TA.WInstance (loc, term) ->
      let l = Whelp.instance ~dbd term in
-     let entry = `Whelp (pp_macro mac, l) in
+     let entry = `Whelp (pp_macro [] [] mac, l) in
      guistuff.mathviewer#show_uri_list ~reuse:true ~entry l;
      [], "", parsed_text_length
   | TA.WLocate (loc, s) -> 
      let l = Whelp.locate ~dbd s in
-     let entry = `Whelp (pp_macro mac, l) in
+     let entry = `Whelp (pp_macro [] [] mac, l) in
      guistuff.mathviewer#show_uri_list ~reuse:true ~entry l;
      [], "", parsed_text_length
   | TA.WElim (loc, term) ->
@@ -414,14 +403,14 @@ let rec eval_macro include_paths (buffer : GText.buffer) guistuff lexicon_status
        | _ -> failwith "Not a MutInd"
      in
      let l = Whelp.elim ~dbd uri in
-     let entry = `Whelp (pp_macro mac, l) in
+     let entry = `Whelp (pp_macro [] [] mac, l) in
      guistuff.mathviewer#show_uri_list ~reuse:true ~entry l;
      [], "", parsed_text_length
   | TA.WHint (loc, term) ->
      let _subst = [] in
      let s = ((None,[0,[],term], _subst, lazy (Cic.Meta (0,[])) ,term, []),0) in
      let l = List.map fst (MQ.experimental_hint ~dbd s) in
-     let entry = `Whelp (pp_macro mac, l) in
+     let entry = `Whelp (pp_macro [] [] mac, l) in
      guistuff.mathviewer#show_uri_list ~reuse:true ~entry l;
      [], "", parsed_text_length
   (* REAL macro *)
@@ -436,7 +425,8 @@ let rec eval_macro include_paths (buffer : GText.buffer) guistuff lexicon_status
       if rewrite then
         let l = MQ.equations_for_goal ~dbd proof_status in
         let l = List.filter (fun u -> not (LibraryObjects.in_eq_URIs u)) l in
-        let entry = `Whelp (pp_macro (TA.WHint(loc, Cic.Implicit None)), l) in
+        let entry = 
+          `Whelp (pp_macro [] [] (TA.WHint(loc, Cic.Implicit None)), l) in
         guistuff.mathviewer#show_uri_list ~reuse:true ~entry l;
         [], "", parsed_text_length
       else
@@ -472,6 +462,32 @@ let rec eval_macro include_paths (buffer : GText.buffer) guistuff lexicon_status
               fun u -> HLog.error (UriManager.string_of_uri u ^ "\n")
             ) selected;
             assert false)
+  | TA.Eval (_, kind, term) -> 
+      let metasenv = GrafiteTypes.get_proof_metasenv grafite_status in
+      let context =
+       match user_goal with
+          None -> []
+        | Some n -> GrafiteTypes.get_proof_context grafite_status n in
+      let ty,_ = CTC.type_of_aux' metasenv context term CicUniv.empty_ugraph in
+      let term = 
+        match kind with
+        | `Normalize ->
+             CicReduction.normalize ~delta:true ~subst:[] context term
+        | `Simpl -> 
+            ProofEngineReduction.simpl context term
+        | `Unfold None ->
+            ProofEngineReduction.unfold ?what:None context term
+        | `Unfold (Some lazy_term) ->
+             let what, _, _ = 
+               lazy_term context metasenv CicUniv.empty_ugraph in
+             ProofEngineReduction.unfold ~what context term
+        | `Whd ->
+            CicReduction.whd ~delta:true ~subst:[] context term
+      in
+      let t_and_ty = Cic.Cast (term,ty) in
+      guistuff.mathviewer#show_entry (`Cic (t_and_ty,metasenv));
+      [({grafite_status with proof_status = No_proof},lexicon_status), parsed_text ],"", 
+        parsed_text_length 
   | TA.Check (_,term) ->
       let metasenv = GrafiteTypes.get_proof_metasenv grafite_status in
       let context =