]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/acic_procedural/acic2Procedural.ml
- Procedural: new flag "level=n" to control the reconstruction level (defaults to...
[helm.git] / helm / software / components / acic_procedural / acic2Procedural.ml
index c8168aa4795860700e75ac5d2b376214dd535abb..4ce01707cd9d32431f160c1bd28a1f67b6ca05d6 100644 (file)
  * http://cs.unibo.it/helm/.
  *)
 
-module L    = Librarian
+module C  = Cic
+module L  = Librarian
+module G  = GrafiteAst
 
+module H  = ProceduralHelpers
 module T  = ProceduralTypes
+module P1 = Procedural1
 module P2 = Procedural2
 module X  = ProceduralTeX
 
 let tex_formatter = ref None
 
+(* object costruction *******************************************************)
+
+let th_flavours = [`Theorem; `Lemma; `Remark; `Fact]
+
+let def_flavours = [`Definition; `Variant]
+
+let get_flavour sorts params context v attrs =
+   let rec aux = function
+      | []               -> 
+         if H.is_acic_proof sorts context v then List.hd th_flavours
+        else List.hd def_flavours
+      | `Flavour fl :: _ -> fl
+      | _ :: tl          -> aux tl
+   in
+   let flavour_map x y = match x, y with
+      | None, G.IPAs flavour -> Some flavour
+      | _                    -> x
+   in   
+   match List.fold_left flavour_map None params with
+      | Some fl -> fl
+      | None    -> aux attrs
+
+let proc_obj ?(info="") proc_proof sorts params context = function
+   | C.AConstant (_, _, s, Some v, t, [], attrs)         ->
+      begin match get_flavour sorts params context v attrs with
+         | flavour when List.mem flavour th_flavours  ->
+            let ast = proc_proof v in
+            let steps, nodes = T.count_steps 0 ast, T.count_nodes 0 ast in
+            let text = Printf.sprintf "%s\n%s%s: %u\n%s: %u\n%s"
+              "COMMENTS" info "Tactics" steps "Final nodes" nodes "END"
+           in
+            T.Statement (flavour, Some s, t, None, "") :: ast @ [T.Qed text]
+         | flavour when List.mem flavour def_flavours ->
+            [T.Statement (flavour, Some s, t, Some v, "")]
+        | _                                  ->
+            failwith "not a theorem, definition, axiom or inductive type"
+      end
+   | C.AConstant (_, _, s, None, t, [], attrs)           ->
+      [T.Statement (`Axiom, Some s, t, None, "")]
+   | C.AInductiveDefinition (_, types, [], lpsno, attrs) ->
+      [T.Inductive (types, lpsno, "")] 
+   | _                                          ->
+      failwith "not a theorem, definition, axiom or inductive type"
+
 (* interface functions ******************************************************)
 
+let get_proc_proof ~ids_to_inner_sorts ~ids_to_inner_types params context =
+   let level_map x y = match x, y with
+      | None, G.IPLevel level -> Some level
+      | _                     -> x
+   in   
+   match List.fold_left level_map None params with
+      | None
+      | Some 2 ->   
+         P2.proc_proof 
+            (P2.init ~ids_to_inner_sorts ~ids_to_inner_types params context)
+      | Some 1 ->
+         P1.proc_proof 
+            (P1.init ~ids_to_inner_sorts ~ids_to_inner_types params context)
+      | Some n ->
+         failwith (
+           "Procedural reconstruction level not supported: " ^ 
+           string_of_int n
+        )
+
 let procedural_of_acic_object ~ids_to_inner_sorts ~ids_to_inner_types 
    ?info params anobj = 
-   let st = P2.init ~ids_to_inner_sorts ~ids_to_inner_types params [] in
+   let proc_proof = 
+      get_proc_proof ~ids_to_inner_sorts ~ids_to_inner_types params []
+   in 
    L.time_stamp "P : LEVEL 2  ";
    HLog.debug "Procedural: level 2 transformation";
-   let steps = P2.proc_obj st ?info anobj in
+   let steps = proc_obj ?info proc_proof ids_to_inner_sorts params [] anobj in
    let _ = match !tex_formatter with
       | None     -> ()
       | Some frm -> X.tex_of_steps frm ids_to_inner_sorts steps
@@ -50,9 +119,11 @@ let procedural_of_acic_object ~ids_to_inner_sorts ~ids_to_inner_types
 
 let procedural_of_acic_term ~ids_to_inner_sorts ~ids_to_inner_types params
    context annterm = 
-   let st = P2.init ~ids_to_inner_sorts ~ids_to_inner_types params context in
+   let proc_proof =
+      get_proc_proof ~ids_to_inner_sorts ~ids_to_inner_types params context
+   in
    HLog.debug "Procedural: level 2 transformation";
-   let steps = P2.proc_proof st annterm in
+   let steps = proc_proof annterm in
    let _ = match !tex_formatter with
       | None     -> ()
       | Some frm -> X.tex_of_steps frm ids_to_inner_sorts steps