diff options
| author | bertot | 2001-04-04 12:44:55 +0000 |
|---|---|---|
| committer | bertot | 2001-04-04 12:44:55 +0000 |
| commit | e16efa883ae0cf5c82a2ee60bf05304fb9c69b51 (patch) | |
| tree | c34994a4b24950cde4af71d65baa4ac29fb51d00 /contrib/interface/centaur.ml | |
| parent | e1d0e117652115b05faec1c276b9f14c5bf70d1f (diff) | |
Files that handle the dialogue with the graphical user-interface pcoq.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@1531 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'contrib/interface/centaur.ml')
| -rw-r--r-- | contrib/interface/centaur.ml | 810 |
1 files changed, 810 insertions, 0 deletions
diff --git a/contrib/interface/centaur.ml b/contrib/interface/centaur.ml new file mode 100644 index 0000000000..24e3db2b0e --- /dev/null +++ b/contrib/interface/centaur.ml @@ -0,0 +1,810 @@ + +(*Toplevel loop for the communication between Coq and Centaur *) +open Names;; +open Util;; +open Ast;; +open Term;; +open Pp;; +open Libobject;; +open Library;; +open Vernacinterp;; +open Evd;; +open Proof_trees;; +open Termast;; +open Tacmach;; +open Pfedit;; +open Proof_type;; +open Parsing;; +open Environ;; +open Declare;; +open Declarations;; +open Rawterm;; +open Reduction;; +open Classops;; +open Vernacinterp;; +open Vernac;; +open Command;; +open Protectedtoplevel;; +open Coqast;; +open Line_oriented_parser;; +open Xlate;; +open Vtp;; +open Ascent;; +open Translate;; +open Name_to_ast;; +open Pbp;; +open Dad;; +open Debug_tac;; +open Search;; +open Astterm;; +open Nametab;; + + +let text_proof_flag = ref false;; + +let current_proof_name = ref "";; + +let current_goal_index = ref 0;; + +set_flags := (function () -> + if List.mem "G_natsyntax" (Mltop.get_loaded_modules()) then + (g_nat_syntax_flag := true; ()) + else ());; + +let guarded_force_eval_stream s = + let l = ref [] in + let f elt = l:= elt :: !l in + (try Stream.iter f s with + | _ -> f (sTR "error guarded_force_eval_stream")); + Stream.of_list (List.rev !l);; + + +let rec string_of_path p = + match p with [] -> "\n" + | i::p -> (string_of_int i)^" "^ (string_of_path p) +;; +let print_path p = + output_results_nl [< 'sTR "Path:"; 'sTR (string_of_path p)>] +;; + +let kill_proof_node index = + let paths = History.historical_undo !current_proof_name index in + let _ = List.iter + (fun path -> (traverse_to path; + Pfedit.mutate weak_undo_pftreestate; + traverse_to [])) + paths in + History.border_length !current_proof_name;; + + +(*Message functions, the text of these messages is recognized by the protocols *) +(*of CtCoq *) +let ctf_header message_name request_id = + [< 'fNL; 'sTR "message"; 'fNL; 'sTR message_name; 'fNL; 'iNT request_id; 'fNL >];; + +let ctf_acknowledge_command request_id command_count opt_exn = + let goal_count, goal_index = + if refining() then + let g_count = + List.length + (fst (frontier (proof_of_pftreestate (get_pftreestate ())))) in + g_count, (min g_count !current_goal_index) + else + (0, 0) in + [< ctf_header "acknowledge" request_id; + 'iNT command_count; 'fNL; + 'iNT goal_count; 'fNL; + 'iNT goal_index; 'fNL; + 'sTR !current_proof_name; 'fNL; + (match opt_exn with + Some e -> Errors.explain_exn e + | None -> [< >]); 'fNL; 'sTR "E-n-d---M-e-s-s-a-g-e"; 'fNL >];; + +let ctf_undoResults = ctf_header "undo_results";; + +let ctf_TextMessage = ctf_header "text_proof";; + +let ctf_SearchResults = ctf_header "search_results";; + +let ctf_OtherGoal = ctf_header "other_goal";; + +let ctf_Location = ctf_header "location";; + +let ctf_StateMessage = ctf_header "state";; + +let ctf_PathGoalMessage () = + [< 'fNL; 'sTR "message"; 'fNL; 'sTR "single_goal"; 'fNL >];; + +let ctf_GoalReqIdMessage = ctf_header "single_goal_state";; + +let ctf_NewStateMessage = ctf_header "fresh_state";; + +let ctf_SavedMessage () = [< 'fNL; 'sTR "message"; 'fNL; 'sTR "saved"; 'fNL >];; + +let ctf_KilledMessage req_id ngoals = + [< ctf_header "killed" req_id; 'iNT ngoals; 'fNL >];; + +let ctf_AbortedAllMessage () = + [< 'fNL; 'sTR "message"; 'fNL; 'sTR "aborted_all"; 'fNL >];; + +let ctf_AbortedMessage request_id na = + [< 'fNL; 'sTR "message"; 'fNL; 'sTR "aborted_proof"; 'fNL; 'iNT request_id; 'fNL; + 'sTR na; 'fNL; 'sTR "E-n-d---M-e-s-s-a-g-e"; 'fNL >];; + +let ctf_UserErrorMessage request_id stream = + let stream = guarded_force_eval_stream stream in + [< 'fNL; 'sTR "message"; 'fNL; 'sTR "user_error"; 'fNL; 'iNT request_id; 'fNL; + stream; 'fNL; 'sTR "E-n-d---M-e-s-s-a-g-e"; 'fNL >];; + +let ctf_ResetInitialMessage () = + [< 'fNL; 'sTR "message"; 'fNL; 'sTR "reset_initial"; 'fNL >];; + +let ctf_ResetIdentMessage request_id str = + [< 'fNL; 'sTR "message"; 'fNL; 'sTR "reset_ident"; 'fNL; 'iNT request_id; 'fNL; + 'sTR str; 'fNL; 'sTR "E-n-d---M-e-s-s-a-g-e"; 'fNL >];; + +type vtp_tree = + | P_rl of ct_RULE_LIST + | P_r of ct_RULE + | P_s_int of ct_SIGNED_INT_LIST + | P_pl of ct_PREMISES_LIST + | P_cl of ct_COMMAND_LIST + | P_t of ct_TACTIC_COM + | P_ids of ct_ID_LIST;; + +let print_tree t = + (match t with + | P_rl x -> fRULE_LIST x + | P_r x -> fRULE x + | P_s_int x -> fSIGNED_INT_LIST x + | P_pl x -> fPREMISES_LIST x + | P_cl x -> fCOMMAND_LIST x + | P_t x -> fTACTIC_COM x + | P_ids x -> fID_LIST x); + print_string "e\nblabla\n";; + + + +let break_happened = ref false;; + +let output_results stream vtp_tree = + let _ = Sys.signal Sys.sigint + (Sys.Signal_handle(fun i -> (break_happened := true;()))) in + mSG stream; + match vtp_tree with + Some t -> print_tree t + | None -> ();; + +let output_results_nl stream = + let _ = Sys.signal Sys.sigint + (Sys.Signal_handle(fun i -> break_happened := true;())) + in + mSGNL stream;; + + +let rearm_break () = + let _ = Sys.signal Sys.sigint (Sys.Signal_handle(fun i -> raise Sys.Break)) + in ();; + +let check_break () = + if (!break_happened) then + begin + break_happened := false; + raise Sys.Break + end + else ();; + +let print_past_goal index = + let path = History.get_path_for_rank !current_proof_name index in + try traverse_to path; + let pf = proof_of_pftreestate (get_pftreestate ()) in + output_results (ctf_PathGoalMessage ()) + (Some (P_r (translate_goal pf.goal))) + with + | Invalid_argument s -> error "No focused proof (No proof-editing in progress)" +;; + +let show_nth n = + try + let pf = proof_of_pftreestate (get_pftreestate()) in + if (!text_proof_flag) then + errorlabstrm "debug" [< 'sTR "text printing unplugged" >] +(* + (if n=0 + then output_results (ctf_TextMessage !global_request_id) + (Some (P_t (show_proof []))) + else + let path = History.get_nth_open_path !current_proof_name n in + output_results (ctf_TextMessage !global_request_id) + (Some (P_t (show_proof path)))) +*) + else + output_results (ctf_GoalReqIdMessage !global_request_id) + (let goal = List.nth (fst (frontier pf)) + (n - 1) in + (Some (P_r (translate_goal goal)))) + with + | Invalid_argument s -> + error "No focused proof (No proof-editing in progress)";; + +(* The rest of the file contains commands that are changed from the plain + Coq distribution *) + +let ctv_SEARCH_LIST = ref ([] : ct_PREMISE list);; + +let filter_by_module_from_varg_list (l:vernac_arg list) = + let dir_list, b = Vernacentries.inside_outside l in + Search.filter_by_module_from_list (dir_list, b);; + +let add_search (global_reference:global_reference) assumptions cstr = + mSGNL [< 'sTR "DEBUG: entering add_search" >]; + try + let id_string = string_of_qualid (Global.qualid_of_global global_reference) in + let _ = mSGNL [< 'sTR "DEBUG: " ; 'sTR id_string >] in + let ast = + try + CT_premise (CT_ident id_string, translate_constr assumptions cstr) + with Not_found -> + CT_premise (CT_ident id_string, + CT_coerce_ID_to_FORMULA( + CT_ident ("Error printing" ^ id_string))) in + ctv_SEARCH_LIST:= ast::!ctv_SEARCH_LIST + with e -> mSGNL [< 'sTR "add_search raised an exception" >]; raise e;; + +let make_error_stream node_string = + [< 'sTR "The syntax of "; 'sTR node_string; + 'sTR " is inconsistent with the vernac interpreter entry" >];; + +let ctf_EmptyGoalMessage id = + [< 'fNL; 'sTR "Empty Goal is a no-op. Fun oh fun."; 'fNL >];; + + +let print_check (ast, judg) = + let {uj_val=value; uj_type=typ} = judg in + let value_ct_ast = + (try translate_constr (Global.env()) value + with UserError(f,str) -> + raise(UserError(f, + [< Ast.print_ast + (ast_of_constr true (Global.env()) value); + 'fNL; str >]))) in + let type_ct_ast = + (try translate_constr (Global.env()) typ + with UserError(f,str) -> + raise(UserError(f, [< Ast.print_ast (ast_of_constr true (Global.env()) + value); + 'fNL; str >]))) in + ((ctf_SearchResults !global_request_id), + (Some (P_pl + (CT_premises_list + [CT_coerce_TYPED_FORMULA_to_PREMISE + (CT_typed_formula(value_ct_ast,type_ct_ast) + )]))));; + +let ct_print_eval ast red_fun env evd judg = +((if refining() then traverse_to []); +let {uj_val=value; uj_type=typ} = judg in +let nvalue = red_fun value +(* // Attention , ici il faut peut être utiliser des environnemenst locaux *) +and ntyp = nf_betaiota env evd typ in +(ctf_SearchResults !global_request_id, + Some (P_pl + (CT_premises_list + [CT_eval_result + (xlate_formula ast, + translate_constr env nvalue, + translate_constr env ntyp)]))));; + + + +(* The following function is copied from globpr in env/printer.ml *) +let globcv = function + | Node(_,"MUTIND", (Path(_,sl,s))::(Num(_,tyi))::_) -> + convert_qualid + (Global.qualid_of_global (IndRef(section_path sl s,tyi))) + | Node(_,"MUTCONSTRUCT",(Path(_,sl,s))::(Num(_,tyi))::(Num(_,i))::_) -> + convert_qualid + (Global.qualid_of_global (ConstructRef ((section_path sl s, tyi), i))) + | _ -> failwith "globcv : unexpected value";; + +let pbp_tac_pcoq = + pbp_tac (function x -> + output_results + [< 'fNL; 'sTR "message"; 'fNL; 'sTR "pbp_results"; 'fNL; + 'iNT !global_request_id; 'fNL>] + (Some (P_t(xlate_tactic x))));; + + +let dad_tac_pcoq = + dad_tac(function x -> + output_results + [< 'fNL; 'sTR "message"; 'fNL; 'sTR "pbp_results"; 'fNL; + 'iNT !global_request_id; 'fNL >] + (Some (P_t(xlate_tactic x))));; + +let search_output_results () = + output_results + (ctf_SearchResults !global_request_id) + (Some (P_pl (CT_premises_list + (List.rev !ctv_SEARCH_LIST))));; + + +let debug_tac2_pcoq = function + [Tacexp ast] -> + (fun g -> + let the_goal = ref (None : goal sigma option) in + let the_ast = ref ast in + let the_path = ref ([] : int list) in + try + let result = report_error ast the_goal the_ast the_path [] g in + (errorlabstrm "DEBUG TACTIC" + [< 'sTR "no error here "; 'fNL; pr_goal (sig_it g); + 'fNL; 'sTR "the tactic is"; 'fNL ; Printer.gentacpr ast >]; + result) + with + e -> + match !the_goal with + None -> raise e + | Some g -> + (output_results + (ctf_Location !global_request_id) + (Some (P_s_int + (CT_signed_int_list + (List.map + (fun n -> CT_coerce_INT_to_SIGNED_INT + (CT_int n)) + (clean_path 0 ast + (List.rev !the_path))))))); + (output_results + (ctf_OtherGoal !global_request_id) + (Some (P_r (translate_goal (sig_it g))))); + raise e) + | _ -> error "wrong arguments for debug_tac2_pcoq";; + +let rec selectinspect n env = + match env with + [] -> [] + | a::tl -> + if n = 0 then + [] + else + match a with + (sp, Lib.Leaf lobj) -> a::(selectinspect (n -1 ) tl) + | _ -> (selectinspect n tl);; + +open Term;; + +let inspect n = + let env = Global.env() in + let add_search2 x y = add_search x env y in + let l = selectinspect n (Lib.contents_after None) in + ctv_SEARCH_LIST := []; + List.iter + (fun a -> + try + (match a with + sp, Lib.Leaf lobj -> + (match sp, object_tag lobj with + _, "VARIABLE" -> + let ((_, _, v), _, _) = get_variable sp in + add_search2 (Nametab.locate (qualid_of_sp sp)) v + | sp, ("CONSTANT"|"PARAMETER") -> + let {const_type=typ} = Global.lookup_constant sp in + add_search2 (Nametab.locate (qualid_of_sp sp)) typ + | sp, "MUTUALINDUCTIVE" -> + add_search2 (Nametab.locate (qualid_of_sp sp)) + (Pretyping.understand Evd.empty (Global.env()) + (RRef(dummy_loc, IndRef(sp,0)))) + | _ -> failwith ("unexpected value 1 for "^ + (string_of_id (basename sp)))) + | _ -> failwith "unexpected value") + with e -> ()) + l; + output_results + (ctf_SearchResults !global_request_id) + (Some + (P_pl (CT_premises_list (List.rev !ctv_SEARCH_LIST))));; + +let ct_int_to_TARG n = + CT_coerce_ID_OR_INT_to_TARG + (CT_coerce_INT_to_ID_OR_INT (CT_int n));; + +let pair_list_to_ct l = + CT_user_tac(CT_ident "pair_int_list", + CT_targ_list + (List.map (fun (a,b) -> + CT_coerce_TACTIC_COM_to_TARG + (CT_user_tac + (CT_ident "pair_int", + CT_targ_list + [ct_int_to_TARG a; ct_int_to_TARG b]))) + l));; + +let logical_kill n = + let path = History.get_path_for_rank !current_proof_name n in + begin + traverse_to path; + Pfedit.mutate weak_undo_pftreestate; + (let kept_cmds, undone_cmds, remaining_goals, current_goal = + History.logical_undo !current_proof_name n in + output_results (ctf_undoResults !global_request_id) + (Some + (P_t + (CT_user_tac + (CT_ident "log_undo_result", + CT_targ_list + [CT_coerce_TACTIC_COM_to_TARG (pair_list_to_ct kept_cmds); + CT_coerce_TACTIC_COM_to_TARG(pair_list_to_ct undone_cmds); + ct_int_to_TARG remaining_goals; + ct_int_to_TARG current_goal]))))); + traverse_to [] + end;; + +let command_changes = [ + ("TEXT_MODE", + (function + | [VARG_AST (Id(_,x))] -> + (match x with + "on" -> (function () -> text_proof_flag := true) + | "off" -> (function () -> text_proof_flag := false) + | s -> errorlabstrm "TEXT_MODE" (make_error_stream + ("Unexpected flag " ^ s))) + | _ -> errorlabstrm "TEXT_MODE" + (make_error_stream "Unexpected argument"))); + + ("StartProof", + (function + | (VARG_STRING kind) :: + ((VARG_IDENTIFIER s) :: + ((VARG_CONSTR c) :: [])) -> + let stre = + match kind with + | "THEOREM" -> NeverDischarge + | "LEMMA" -> NeverDischarge + | "FACT" -> make_strength_1 () + | "REMARK" -> make_strength_0 () + | "DEFINITION" -> NeverDischarge + | "LET" -> make_strength_2 () + | "LETTOP" -> NotDeclare + | "LOCAL" -> make_strength_0 () + | _ -> errorlabstrm "StartProof" (make_error_stream "StartProof") in + fun () -> + begin + if kind = "LETTOP" && not(refining ()) then + errorlabstrm "StartProof" + [< 'sTR + "Let declarations can only be used in proof editing mode" + >]; + let str = (string_of_id s) in + start_proof_com (Some s) stre c; + History.start_proof str; + current_proof_name := str; + current_goal_index := 1 + end + | _ -> errorlabstrm "StartProof" (make_error_stream "StartProof"))); + + ("GOAL", + (function + | (VARG_CONSTR c) :: [] -> + (fun () -> + if not (refining ()) then + begin + start_proof_com None NeverDischarge c; + History.start_proof "Unnamed_thm"; + current_proof_name := "Unnamed_thm"; + current_goal_index := 1 + end) + | [] -> + (function () -> output_results_nl(ctf_EmptyGoalMessage "")) + | _ -> errorlabstrm "Goal" (make_error_stream "Goal"))); + + ("SOLVE", + (function + | [VARG_NUMBER n; VARG_TACTIC tcom] -> + (fun () -> + if not (refining ()) then + error "Unknown command of the non proof-editing mode"; + solve_nth n (Tacinterp.hide_interp tcom); + let old_n_count = History.border_length !current_proof_name in + let pf = proof_of_pftreestate (get_pftreestate ()) in + let n_goals = (List.length (fst (frontier pf))) + 1 - old_n_count in + begin + current_goal_index := n; + History.push_command !current_proof_name n n_goals + end) + | _ -> errorlabstrm "SOLVE" (make_error_stream "SOLVE"))); + + ("GOAL_CMD", + (function + | (VARG_NUMBER n) :: + ((VARG_TACTIC tac) :: []) -> + (function () -> + let path = History.get_nth_open_path !current_proof_name n in + solve_nth n (Tacinterp.hide_interp tac); + traverse_to path; + Pfedit.mutate weak_undo_pftreestate; + traverse_to []) + | _ -> errorlabstrm "GOAL_CMD" (make_error_stream "GOAL_CMD"))); + + ("KILL_NODE", + (function + | (VARG_NUMBER n) :: [] -> + (function () -> + let ngoals = kill_proof_node n in + output_results_nl + (ctf_KilledMessage !global_request_id ngoals)) + | _ -> errorlabstrm "KILL_NODE" (make_error_stream "KILL_NODE"))); + ("KILL_SUB_PROOF", + (function + | [VARG_NUMBER n] -> + (function () -> logical_kill n) + | _ -> errorlabstrm "KILL_SUB_PROOF" (make_error_stream "KILL_SUB_PROOF"))); + + ("RESUME", + (function [VARG_IDENTIFIER id] -> + (fun () -> + let str = (string_of_id id) in + resume_proof id; + current_proof_name := str) + | _ -> errorlabstrm "RESUME" (make_error_stream "RESUME"))); + + ("BeginSilent", + (function + | [] -> + (function + () -> + errorlabstrm "Begin Silent" + [< 'sTR "not available in Centaur mode" >]) + | _ -> errorlabstrm "BeginSilent" (make_error_stream "BeginSilent"))); + + ("EndSilent", + (function + | [] -> + (function + () -> + errorlabstrm "End Silent" + [< 'sTR "not available in Centaur mode" >]) + | _ -> errorlabstrm "EndSilent" (make_error_stream "EndSilent"))); + + ("SaveNamed", + (function + | [] -> + (function () -> traverse_to []; save_named false) + | _ -> errorlabstrm "SaveNamed" (make_error_stream "SaveNamed"))); + + ("DefinedNamed", + (function + | [] -> + (function () -> traverse_to []; save_named false) + | _ -> errorlabstrm "DefinedNamed" (make_error_stream "DefinedNamed"))); + + ("DefinedAnonymous", + (function + | (VARG_IDENTIFIER id) :: [] -> + (function () -> + traverse_to []; + save_anonymous_thm true (string_of_id id)) + | _ -> + errorlabstrm "DefinedAnonymous" + (make_error_stream "DefinedAnonymous"))); + + ("SaveAnonymous", + (function + | (VARG_IDENTIFIER id) :: [] -> + (function () -> + traverse_to []; + save_anonymous_thm true (string_of_id id)) + | _ -> + errorlabstrm "SaveAnonymous" + (make_error_stream "SaveAnonymous"))); + + ("SaveAnonymousThm", + (function + | (VARG_IDENTIFIER id) :: [] -> + (function () -> + traverse_to []; + save_anonymous_thm true (string_of_id id)) + | _ -> + errorlabstrm "SaveAnonymousThm" + (make_error_stream "SaveAnonymousThm"))); + + ("SaveAnonymousRmk", + (function + | (VARG_IDENTIFIER id) :: [] -> + (function + () -> traverse_to []; + save_anonymous_remark true (string_of_id id)) + | _ -> + errorlabstrm "SaveAnonymousRmk" + (make_error_stream "SaveAnonymousRmk"))); + + ("ABORT", + (function + | (VARG_IDENTIFIER id) :: [] -> + (function + () -> + delete_proof id; + current_proof_name := ""; + output_results_nl + (ctf_AbortedMessage !global_request_id (string_of_id id))) + | [] -> + (function + () -> delete_current_proof (); + current_proof_name := ""; + output_results_nl + (ctf_AbortedMessage !global_request_id "")) + | _ -> errorlabstrm "ABORT" (make_error_stream "ABORT"))); + ("SEARCH", + function + (VARG_QUALID qid)::l -> + (fun () -> + ctv_SEARCH_LIST:=[]; + let global_ref = Vernacentries.global dummy_loc qid in + filtered_search + (filter_by_module_from_varg_list l) + add_search (Nametab.locate qid); + search_output_results()) + | _ -> failwith "bad form of arguments"); + + ("SearchRewrite", + function + (VARG_CONSTR c)::l -> + (fun () -> + ctv_SEARCH_LIST:=[]; + let _,pat = interp_constrpattern Evd.empty (Global.env()) c in + raw_search_rewrite + (filter_by_module_from_varg_list l) + add_search pat; + search_output_results()) + | _ -> failwith "bad form of arguments"); + + ("SearchPattern", + function + (VARG_CONSTR c)::l -> + (fun () -> + ctv_SEARCH_LIST := []; + let _,pat = interp_constrpattern Evd.empty (Global.env()) c in + raw_pattern_search + (filter_by_module_from_varg_list l) + add_search pat; + search_output_results()) + | _ -> failwith "bad form of arguments"); + + ("PrintId", + (function + | [VARG_QUALID qid] -> + (function () -> + let results = xlate_vernac_list (name_to_ast qid) in + output_results + [<'fNL; 'sTR "message"; 'fNL; 'sTR "PRINT_VALUE"; 'fNL >] + (Some (P_cl results))) + | _ -> errorlabstrm "PrintId" (make_error_stream "PrintId"))); + + ("Check", + (function + | (VARG_STRING kind) :: ((VARG_CONSTR c) :: g) -> + let evmap, env = + Vernacentries.get_current_context_of_args g in + let f = + match kind with + | "CHECK" -> print_check + | "PRINTTYPE" -> + errorlabstrm "PrintType" [< 'sTR "Not yet supported in CtCoq" >] + | _ -> errorlabstrm "CHECK" (make_error_stream "CHECK") in + (function () -> + let a,b = f (c, judgment_of_rawconstr evmap env c) in + output_results a b) + | _ -> errorlabstrm "CHECK" (make_error_stream "CHECK"))); + + ("Eval", + (function + | VARG_TACTIC_ARG(Redexp redexp):: VARG_CONSTR c :: g -> + let evmap, env = Vernacentries.get_current_context_of_args g in + let redfun = + ct_print_eval c (Tacred.reduction_of_redexp redexp env evmap) env in + fun () -> + let strm, vtp = redfun evmap (judgment_of_rawconstr evmap env c) in + output_results strm vtp + | _ -> errorlabstrm "Eval" (make_error_stream "Eval"))); + + ("Centaur_Reset", + (function + | (VARG_IDENTIFIER c) :: [] -> + if refining () then + output_results (ctf_AbortedAllMessage ()) None; + current_proof_name := ""; + (match string_of_id c with + | "CtCoqInitialState" -> + (function + () -> + current_proof_name := ""; + Vernacentries.abort_refine Lib.reset_initial (); + output_results (ctf_ResetInitialMessage ()) None) + | _ -> + (function + () -> + current_proof_name := ""; + Vernacentries.abort_refine Lib.reset_name c; + output_results + (ctf_ResetIdentMessage + !global_request_id (string_of_id c)) None)) + | _ -> errorlabstrm "Centaur_Reset" (make_error_stream "Centaur_Reset"))); + ("Show_dad_rules", + (function + | [] -> + (fun () -> + let results = dad_rule_names() in + output_results + [< 'fNL; 'sTR "message"; 'fNL; 'sTR "dad_rule_names"; 'fNL; + 'iNT !global_request_id; 'fNL >] + (Some (P_ids + (CT_id_list + (List.map (fun s -> CT_ident s) results))))) + | _ -> + errorlabstrm + "Show_dad_rules" (make_error_stream "Show_dad_rules"))); + ("INSPECT", + (function + | [VARG_NUMBER n] -> + (function () -> inspect n) + | _ -> errorlabstrm "INSPECT" (make_error_stream "INSPECT"))) + +];; + +let non_debug_changes = [ + ("SHOW", + (function + | [VARG_NUMBER n] -> (function () -> show_nth n) + | _ -> errorlabstrm "SHOW" (make_error_stream "SHOW")))];; + +let command_creations = [ + ("Comments", + function l -> (fun () -> message ("Comments ok\n"))); + ("CommentsBold", + function l -> (fun () -> message ("CommentsBold ok\n"))); + ("Title", + function l -> (fun () -> message ("Title ok\n"))); + ("Author", + function l -> (fun () -> message ("Author ok\n"))); + ("Note", + function l -> (fun () -> message ("Note ok\n"))); + ("NL", + function l -> (fun () -> message ("Newline ok\n")))];; + + + +let start_pcoq_mode debug = + begin + start_dad(); + set_xlate_mut_stuff globcv; + declare_in_coq(); + add_tactic "PcoqPbp" pbp_tac_pcoq; + add_tactic "Dad" dad_tac_pcoq; + add_tactic "CtDebugTac" debug_tac2_pcoq; + add_tactic "CtDebugTac2" debug_tac2_pcoq; +(* The following ones are added to enable rich comments in pcoq *) + add_tactic "Image" (fun _ -> tclIDTAC); + List.iter (fun (a,b) -> vinterp_add a b) command_creations; + List.iter (fun (a,b) -> overwriting_vinterp_add a b) command_changes; + if not debug then + List.iter (fun (a,b) -> overwriting_vinterp_add a b) non_debug_changes; + end;; + +vinterp_add "START_PCOQ" + (function _ -> + (function () -> + start_pcoq_mode false; + set_acknowledge_command ctf_acknowledge_command; + set_start_marker "CENTAUR_RESERVED_TOKEN_start_command"; + set_end_marker "CENTAUR_RESERVED_TOKEN_end_command"; + raise Vernacinterp.ProtectedLoop));; + +vinterp_add "START_PCOQ_DEBUG" + (function _ -> + (function () -> + start_pcoq_mode true; + set_acknowledge_command ctf_acknowledge_command; + set_start_marker "--->"; + set_end_marker "<---"; + raise Vernacinterp.ProtectedLoop));; + |
