]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/grafite_engine/grafiteEngine.ml
lazy proof term to increase sharing and decrease memory consumption.
[helm.git] / helm / software / components / grafite_engine / grafiteEngine.ml
index 8813e498bed94ae6425757af2e4d88ed1c025794..888ad55ff0b773df640cca516314f6e69749c797 100644 (file)
@@ -82,6 +82,7 @@ let rec tactic_of_ast status ast =
   (* First order tactics *)
   | GrafiteAst.Absurd (_, term) -> Tactics.absurd term
   | GrafiteAst.Apply (_, term) -> Tactics.apply term
+  | GrafiteAst.ApplyP (_, term) -> Tactics.applyP term
   | GrafiteAst.ApplyS (_, term, params) ->
      Tactics.applyS ~term ~params ~dbd:(LibraryDb.instance ())
        ~universe:status.GrafiteTypes.universe
@@ -454,8 +455,9 @@ type 'a eval_executable =
 type 'a eval_from_moo =
  { efm_go: GrafiteTypes.status -> string -> GrafiteTypes.status }
       
-let coercion_moo_statement_of (uri,arity, saturations) =
-  GrafiteAst.Coercion (HExtlib.dummy_floc, uri, false, arity, saturations)
+let coercion_moo_statement_of (uri,arity, saturations,_) =
+  GrafiteAst.Coercion
+   (HExtlib.dummy_floc, CicUtil.term_of_uri uri, false, arity, saturations)
 
 let refinement_toolkit = {
   RefinementTool.type_of_aux' = 
@@ -481,16 +483,21 @@ let refinement_toolkit = {
  }
   
 let eval_coercion status ~add_composites uri arity saturations =
+ let uri = 
+   try CicUtil.uri_of_term uri 
+   with Invalid_argument _ -> 
+     raise (Invalid_argument "coercion can only be constants/constructors")
+ in
  let status,compounds =
   GrafiteSync.add_coercion ~add_composites refinement_toolkit status uri arity
    saturations (GrafiteTypes.get_baseuri status)
  in
  let moo_content = 
-   List.map coercion_moo_statement_of ((uri,arity,saturations)::compounds)
+   List.map coercion_moo_statement_of ((uri,arity,saturations,0)::compounds)
  in
  let status = GrafiteTypes.add_moo_content moo_content status in
   {status with GrafiteTypes.proof_status = GrafiteTypes.No_proof},
-   List.map (fun u,_,_ -> u) compounds
+   List.map (fun u,_,_,_ -> u) compounds
 
 module MatitaStatus =
  struct
@@ -601,9 +608,9 @@ let add_coercions_of_record_to_moo obj lemmas status =
               in
               let is_a_coercion, arity_coercion = is_a_coercion uri in
               if is_a_coercion then
-                Some (uri, coercion_moo_statement_of (uri,arity_coercion,0))
+                Some (uri, coercion_moo_statement_of (uri,arity_coercion,0,0))
               else if is_a_wanted_coercion then
-                Some (uri, coercion_moo_statement_of (uri,arity_wanted,0))
+                Some (uri, coercion_moo_statement_of (uri,arity_wanted,0,0))
               else
                 None)
             lemmas)
@@ -682,7 +689,7 @@ let rec eval_command = {ec_go = fun ~disambiguate_command opts status
      status,[]
   | GrafiteAst.Print (_,"proofterm") ->
       let _,_,_,p,_, _ = GrafiteTypes.get_current_proof status in
-      prerr_endline (Auto.pp_proofterm p);
+      prerr_endline (Auto.pp_proofterm (Lazy.force p));
       status,[]
   | GrafiteAst.Print (_,_) -> status,[]
   | GrafiteAst.Qed loc ->
@@ -703,7 +710,7 @@ let rec eval_command = {ec_go = fun ~disambiguate_command opts status
          (GrafiteTypes.Command_error
            "Proof not completed! metasenv is not empty!");
       let name = UriManager.name_of_uri uri in
-      let obj = Cic.Constant (name,Some bo,ty,[],attrs) in
+      let obj = Cic.Constant (name,Some (Lazy.force bo),ty,[],attrs) in
       let status, lemmas = add_obj uri obj status in
        {status with 
          GrafiteTypes.proof_status = GrafiteTypes.No_proof},
@@ -761,7 +768,7 @@ let rec eval_command = {ec_go = fun ~disambiguate_command opts status
                   "\nPlease use a variant."));
            end;
          let _subst = [] in
-         let initial_proof = (Some uri, metasenv', _subst, bo, ty, attrs) in
+         let initial_proof = (Some uri, metasenv', _subst, lazy bo, ty, attrs) in
          let initial_stack = Continuationals.Stack.of_metasenv metasenv' in
          { status with GrafiteTypes.proof_status =
             GrafiteTypes.Incomplete_proof
@@ -787,9 +794,19 @@ let rec eval_command = {ec_go = fun ~disambiguate_command opts status
 } and eval_executable = {ee_go = fun ~disambiguate_tactic ~disambiguate_command
 ~disambiguate_macro opts status (text,prefix_len,ex) ->
   match ex with
-  | GrafiteAst.Tactic (_, Some tac, punct) ->
+  | GrafiteAst.Tactic (_(*loc*), Some tac, punct) ->
      let tac = apply_tactic ~disambiguate_tactic (text,prefix_len,tac) in
      let status = eval_tactical status (tactic_of_ast' tac) in
+     (* CALL auto on every goal, easy way of testing it 
+     let auto = 
+       GrafiteAst.AutoBatch 
+         (loc, ([],["depth","2";"timeout","1";"type","1"])) in
+     (try
+       let auto = apply_tactic ~disambiguate_tactic ("",0,auto) in
+       let _ = eval_tactical status (tactic_of_ast' auto) in 
+       print_endline "GOOD"; ()
+     with ProofEngineTypes.Fail _ -> print_endline "BAD" | _ -> ());
+     *)
       eval_tactical status
        (punctuation_tactical_of_ast (text,prefix_len,punct)),[]
   | GrafiteAst.Tactic (_, None, punct) ->