diff options
Diffstat (limited to 'contrib/interface/centaur.ml4')
-rw-r--r-- | contrib/interface/centaur.ml4 | 885 |
1 files changed, 0 insertions, 885 deletions
diff --git a/contrib/interface/centaur.ml4 b/contrib/interface/centaur.ml4 deleted file mode 100644 index 51dce4f7..00000000 --- a/contrib/interface/centaur.ml4 +++ /dev/null @@ -1,885 +0,0 @@ -(*i camlp4deps: "parsing/grammar.cma" i*) - -(* - * This file has been modified by Lionel Elie Mamane <lionel@mamane.lu> - * to implement the following features - * - Terms (optionally) as pretty-printed string and not trees - * - (Optionally) give most commands their usual Coq semantics - * - Add the backtracking information to the status message. - * in the following time period - * - May-November 2006 - * and - * - Make use of new Command.save_hook to generate dependencies at - * save-time. - * in - * - June 2007 - *) - -(*Toplevel loop for the communication between Coq and Centaur *) -open Names;; -open Nameops;; -open Util;; -open Term;; -open Pp;; -open Ppconstr;; -open Prettyp;; -open Libnames;; -open Libobject;; -open Library;; -open Vernacinterp;; -open Evd;; -open Proof_trees;; -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 Line_oriented_parser;; -open Xlate;; -open Vtp;; -open Ascent;; -open Translate;; -open Name_to_ast;; -open Pbp;; -open Blast;; -(* open Dad;; *) -open Debug_tac;; -open Search;; -open Constrintern;; -open Nametab;; -open Showproof;; -open Showproof_ct;; -open Tacexpr;; -open Vernacexpr;; -open Printer;; - -let pcoq_started = ref None;; - -let if_pcoq f a = - if !pcoq_started <> None then f a else error "Pcoq is not started";; - -let text_proof_flag = ref "en";; - -let pcoq_history = ref true;; - -let assert_pcoq_history f a = - if !pcoq_history then f a else error "Pcoq-style history tracking deactivated";; - -let current_proof_name () = - try - string_of_id (get_current_proof_name ()) - with - UserError("Pfedit.get_proof", _) -> "";; - -let current_goal_index = ref 0;; - -let guarded_force_eval_stream (s : std_ppcmds) = - let l = ref [] in - let f elt = l:= elt :: !l in - (try Stream.iter f s with - | _ -> f (Stream.next (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());; - - -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_text of ct_TEXT - | 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_text x -> fTEXT x - | P_ids x -> fID_LIST x) - ++ (str "e\nblabla\n");; - - -(*Message functions, the text of these messages is recognized by the protocols *) -(*of CtCoq *) -let ctf_header message_name request_id = - 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, !current_goal_index - else - (0, 0) - and statnum = Lib.current_command_label () - and dpth = let d = Pfedit.current_proof_depth() in if d >= 0 then d else 0 - and pending = CT_id_list (List.map xlate_ident (Pfedit.get_all_proof_names())) in - (ctf_header "acknowledge" request_id ++ - int command_count ++ fnl() ++ - int goal_count ++ fnl () ++ - int goal_index ++ fnl () ++ - str (current_proof_name()) ++ fnl() ++ - int statnum ++ fnl() ++ - print_tree (P_ids pending) ++ - int dpth ++ fnl() ++ - (match opt_exn with - Some e -> Cerrors.explain_exn e - | None -> mt ()) ++ 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_GoalsReqIdMessage = ctf_header "goals_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 = - ctf_header "aborted_proof" request_id ++ 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 - ctf_header "user_error" request_id ++ 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 s = - ctf_header "reset_ident" request_id ++ str s ++ fnl () ++ - str "E-n-d---M-e-s-s-a-g-e" ++ fnl();; - - -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 -> mt()));; - -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 -> - ((try traverse_to [] with _ -> ()); - error "No focused proof (No proof-editing in progress)") - | e -> (try traverse_to [] with _ -> ()); raise e -;; - -let show_nth n = - try - output_results (ctf_GoalReqIdMessage !global_request_id - ++ pr_nth_open_subgoal n) - None - with - | Invalid_argument s -> - error "No focused proof (No proof-editing in progress)";; - -let show_subgoals () = - try - output_results (ctf_GoalReqIdMessage !global_request_id - ++ pr_open_subgoals ()) - None - 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 = - let dir_list, b = Vernacentries.interp_search_restriction l in - Search.filter_by_module_from_list (dir_list, b);; -*) - -let add_search (global_reference:global_reference) assumptions cstr = - try - let id_string = - string_of_qualid (Nametab.shortest_qualid_of_global Idset.empty - global_reference) in - let ast = - try - CT_premise (CT_ident id_string, translate_constr false 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 env judg = - ((ctf_SearchResults !global_request_id) ++ - print_judgment env judg, - None);; - -let ct_print_eval red_fun env evmap ast judg = - (if refining() then traverse_to []); - let {uj_val=value; uj_type=typ} = judg in - let nvalue = (red_fun env evmap) value - (* // Attention , ici il faut peut être utiliser des environnemenst locaux *) - and ntyp = nf_betaiota typ in - print_tree - (P_pl - (CT_premises_list - [CT_eval_result - (xlate_formula ast, - translate_constr false env nvalue, - translate_constr false env ntyp)]));; - -let pbp_tac_pcoq = - pbp_tac (function (x:raw_tactic_expr) -> - output_results - (ctf_header "pbp_results" !global_request_id) - (Some (P_t(xlate_tactic x))));; - -let blast_tac_pcoq = - blast_tac (function (x:raw_tactic_expr) -> - output_results - (ctf_header "pbp_results" !global_request_id) - (Some (P_t(xlate_tactic x))));; - -(* <\cpa> -let dad_tac_pcoq = - dad_tac(function x -> - output_results - (ctf_header "pbp_results" !global_request_id) - (Some (P_t(xlate_tactic x))));; -</cpa> *) - -let search_output_results () = - (* LEM: See comments for pcoq_search *) - output_results - (ctf_SearchResults !global_request_id) - (Some (P_pl (CT_premises_list - (List.rev !ctv_SEARCH_LIST))));; - - -let debug_tac2_pcoq tac = - (fun g -> - let the_goal = ref (None : goal sigma option) in - let the_ast = ref tac in - let the_path = ref ([] : int list) in - try - let _result = report_error tac the_goal the_ast the_path [] g in - (errorlabstrm "DEBUG TACTIC" - (str "no error here " ++ fnl () ++ Printer.pr_goal (sig_it g) ++ - fnl () ++ str "the tactic is" ++ fnl () ++ - Pptactic.pr_glob_tactic (Global.env()) tac) (* -Caution, this is in the middle of what looks like dead code. ; - 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 tac - (List.rev !the_path))))))); - (output_results - (ctf_OtherGoal !global_request_id) - (Some (P_r (translate_goal (sig_it g))))); - raise e);; - -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 - oname, Lib.Leaf lobj -> - (match oname, object_tag lobj with - (sp,_), "VARIABLE" -> - let (_, _, v) = Global.lookup_named (basename sp) in - add_search2 (Nametab.locate (qualid_of_sp sp)) v - | (sp,kn), "CONSTANT" -> - let typ = Typeops.type_of_constant (Global.env()) (constant_of_kn kn) in - add_search2 (Nametab.locate (qualid_of_sp sp)) typ - | (sp,kn), "MUTUALINDUCTIVE" -> - add_search2 (Nametab.locate (qualid_of_sp sp)) - (Pretyping.Default.understand Evd.empty (Global.env()) - (RRef(dummy_loc, IndRef(kn,0)))) - | _ -> failwith ("unexpected value 1 for "^ - (string_of_id (basename (fst oname))))) - | _ -> 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_FORMULA_OR_INT_to_TARG - (CT_coerce_ID_OR_INT_to_FORMULA_OR_INT - (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));; - -(* Annule toutes les commandes qui s'appliquent sur les sous-buts du - but auquel a été appliquée la n-ième tactique *) -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 simulate_solve n tac = - let path = History.get_nth_open_path (current_proof_name()) n in - solve_nth n (Tacinterp.hide_interp tac (get_end_tac())); - traverse_to path; - Pfedit.mutate weak_undo_pftreestate; - traverse_to [] - -let kill_node_verbose n = - let ngoals = kill_proof_node n in - output_results_nl (ctf_KilledMessage !global_request_id ngoals) - -let set_text_mode s = text_proof_flag := s - -let pcoq_reset_initial() = - output_results(ctf_AbortedAllMessage()) None; - Vernacentries.abort_refine Lib.reset_initial (); - output_results(ctf_ResetInitialMessage()) None;; - -let pcoq_reset x = - if refining() then - output_results (ctf_AbortedAllMessage ()) None; - Vernacentries.abort_refine Lib.reset_name (dummy_loc,x); - output_results - (ctf_ResetIdentMessage !global_request_id (string_of_id x)) None;; - - -VERNAC ARGUMENT EXTEND text_mode -| [ "fr" ] -> [ "fr" ] -| [ "en" ] -> [ "en" ] -| [ "Off" ] -> [ "off" ] -END - -VERNAC COMMAND EXTEND TextMode -| [ "Text" "Mode" text_mode(s) ] -> [ set_text_mode s ] -END - -VERNAC COMMAND EXTEND OutputGoal - [ "Goal" ] -> [ output_results_nl(ctf_EmptyGoalMessage "") ] -END - -VERNAC COMMAND EXTEND OutputGoal - [ "Goal" "Cmd" natural(n) "with" tactic(tac) ] -> [ assert_pcoq_history (simulate_solve n) tac ] -END - -VERNAC COMMAND EXTEND KillProofAfter -| [ "Kill" "Proof" "after" natural(n) ] -> [ assert_pcoq_history kill_node_verbose n ] -END - -VERNAC COMMAND EXTEND KillProofAt -| [ "Kill" "Proof" "at" natural(n) ] -> [ assert_pcoq_history kill_node_verbose n ] -END - -VERNAC COMMAND EXTEND KillSubProof - [ "Kill" "SubProof" natural(n) ] -> [ assert_pcoq_history logical_kill n ] -END - -VERNAC COMMAND EXTEND PcoqReset - [ "Pcoq" "Reset" ident(x) ] -> [ pcoq_reset x ] -END - -VERNAC COMMAND EXTEND PcoqResetInitial - [ "Pcoq" "ResetInitial" ] -> [ pcoq_reset_initial() ] -END - -let start_proof_hook () = - if !pcoq_history then History.start_proof (current_proof_name()); - current_goal_index := 1 - -let solve_hook n = - current_goal_index := n; - if !pcoq_history then - let name = current_proof_name () in - let old_n_count = History.border_length name in - let pf = proof_of_pftreestate (get_pftreestate ()) in - let n_goals = (List.length (fst (frontier pf))) + 1 - old_n_count in - History.push_command name n n_goals - -let abort_hook s = output_results_nl (ctf_AbortedMessage !global_request_id s) - -let interp_search_about_item = function - | SearchSubPattern pat -> - let _,pat = Constrintern.intern_constr_pattern Evd.empty (Global.env()) pat in - GlobSearchSubPattern pat - | SearchString (s,_) -> - warning "Notation case not taken into account"; - GlobSearchString s - -let pcoq_search s l = - (* LEM: I don't understand why this is done in this way (redoing the - * match on s here) instead of making the code in - * parsing/search.ml call the right function instead of - * "plain_display". Investigates this later. - * TODO - *) - ctv_SEARCH_LIST:=[]; - begin match s with - | SearchAbout sl -> - raw_search_about (filter_by_module_from_list l) add_search - (List.map (on_snd interp_search_about_item) sl) - | SearchPattern c -> - let _,pat = intern_constr_pattern Evd.empty (Global.env()) c in - raw_pattern_search (filter_by_module_from_list l) add_search pat - | SearchRewrite c -> - let _,pat = intern_constr_pattern Evd.empty (Global.env()) c in - raw_search_rewrite (filter_by_module_from_list l) add_search pat; - | SearchHead locqid -> - filtered_search - (filter_by_module_from_list l) add_search (Nametab.global locqid) - end; - search_output_results() - -(* Check sequentially whether the pattern is one of the premises *) -let rec hyp_pattern_filter pat name a c = - let _c1 = strip_outer_cast c in - match kind_of_term c with - | Prod(_, hyp, c2) -> - (try -(* let _ = msgnl ((str "WHOLE ") ++ (Printer.pr_lconstr c)) in - let _ = msgnl ((str "PAT ") ++ (Printer.pr_constr_pattern pat)) in *) - if Matching.is_matching pat hyp then - (msgnl (str "ok"); true) - else - false - with UserError _ -> false) or - hyp_pattern_filter pat name a c2 - | _ -> false;; - -let hyp_search_pattern c l = - let _, pat = intern_constr_pattern Evd.empty (Global.env()) c in - ctv_SEARCH_LIST := []; - gen_filtered_search - (fun s a c -> (filter_by_module_from_list l s a c && - (if hyp_pattern_filter pat s a c then - (msgnl (str "ok2"); true) else false))) - (fun s a c -> (msgnl (str "ok3"); add_search s a c)); - output_results - (ctf_SearchResults !global_request_id) - (Some - (P_pl (CT_premises_list (List.rev !ctv_SEARCH_LIST))));; -let pcoq_print_name ref = - output_results - (fnl () ++ str "message" ++ fnl () ++ str "PRINT_VALUE" ++ fnl () ++ print_name ref ) - None - -let pcoq_print_check env j = - let a,b = print_check env j in output_results a b - -let pcoq_print_eval redfun env evmap c j = - output_results - (ctf_SearchResults !global_request_id - ++ Prettyp.print_eval redfun env evmap c j) - None;; - -open Vernacentries - -let pcoq_show_goal = function - | Some n -> show_nth n - | None -> show_subgoals () -;; - -let pcoq_hook = { - start_proof = start_proof_hook; - solve = solve_hook; - abort = abort_hook; - search = pcoq_search; - print_name = pcoq_print_name; - print_check = pcoq_print_check; - print_eval = pcoq_print_eval; - show_goal = pcoq_show_goal -} - -let pcoq_term_pr = { - pr_constr_expr = (fun c -> str "pcoq_constr_expr\n" ++ (default_term_pr.pr_constr_expr c)); - (* In future translate_constr false (Global.env()) - * Except with right bool/env which I'll get :) - *) - pr_lconstr_expr = (fun c -> fFORMULA (xlate_formula c) ++ str "(pcoq_lconstr_expr of " ++ (default_term_pr.pr_lconstr_expr c) ++ str ")"); - pr_constr_pattern_expr = (fun c -> str "pcoq_pattern_expr\n" ++ (default_term_pr.pr_constr_pattern_expr c)); - pr_lconstr_pattern_expr = (fun c -> str "pcoq_constr_expr\n" ++ (default_term_pr.pr_lconstr_pattern_expr c)) -} - -let start_pcoq_trees () = - set_term_pr pcoq_term_pr - -(* BEGIN functions for object_pr *) - -(* These functions in general mirror what name_to_ast does in a subcase, - and then print the corresponding object as a PCoq tree. *) - -let object_to_ast_template object_to_ast_list sp = - let l = object_to_ast_list sp in - VernacList (List.map (fun x -> (dummy_loc, x)) l) - -let pcoq_print_object_template object_to_ast_list sp = - let results = xlate_vernac_list (object_to_ast_template object_to_ast_list sp) in - print_tree (P_cl results) - -(* This function mirror what print_check does *) - -let pcoq_print_typed_value_in_env env (value, typ) = - let value_ct_ast = - (try translate_constr false (Global.env()) value - with UserError(f,str) -> - raise(UserError(f,Printer.pr_lconstr value ++ - fnl () ++ str ))) in - let type_ct_ast = - (try translate_constr false (Global.env()) typ - with UserError(f,str) -> - raise(UserError(f, Printer.pr_lconstr value ++ fnl() ++ str))) in - print_tree - (P_pl - (CT_premises_list - [CT_coerce_TYPED_FORMULA_to_PREMISE - (CT_typed_formula(value_ct_ast,type_ct_ast) - )])) -;; - -(* This function mirrors what show_nth does *) - -let pcoq_pr_subgoal n gl = - try - print_tree - (if (!text_proof_flag<>"off") then - (* This is a horrendeous hack; it ignores the "gl" argument - and just takes the currently focused proof. This will bite - us back one day. - TODO: Fix this. - *) - ( - if not !pcoq_history then error "Text mode requires Pcoq history tracking."; - if n=0 - then (P_text (show_proof !text_proof_flag [])) - else - let path = History.get_nth_open_path (current_proof_name()) n in - (P_text (show_proof !text_proof_flag path))) - else - (let goal = List.nth gl (n - 1) in - (P_r (translate_goal goal)))) - with - | Invalid_argument _ - | Failure "nth" - | Not_found -> error "No such goal";; - -let pcoq_pr_subgoals close_cmd evar gl = - (*LEM: TODO: we should check for evar emptiness or not, and do something *) - try - print_tree - (if (!text_proof_flag<>"off") then - raise (Anomaly ("centaur.ml4:pcoq_pr_subgoals", str "Text mode show all subgoals not implemented")) - else - (P_rl (translate_goals gl))) - with - | Invalid_argument _ - | Failure "nth" - | Not_found -> error "No such goal";; - - -(* END functions for object_pr *) - -let pcoq_object_pr = { - print_inductive = pcoq_print_object_template inductive_to_ast_list; - (* TODO: Check what that with_infos means, and adapt accordingly *) - print_constant_with_infos = pcoq_print_object_template constant_to_ast_list; - print_section_variable = pcoq_print_object_template variable_to_ast_list; - print_syntactic_def = pcoq_print_object_template (fun x -> errorlabstrm "print" - (str "printing of syntax definitions not implemented in PCoq syntax")); - (* TODO: These are placeholders only; write them *) - print_module = (fun x y -> str "pcoq_print_module not implemented"); - print_modtype = (fun x -> str "pcoq_print_modtype not implemented"); - print_named_decl = (fun x -> str "pcoq_print_named_decl not implemented"); - (* TODO: Find out what the first argument x (a bool) is about and react accordingly *) - print_leaf_entry = (fun x -> pcoq_print_object_template leaf_entry_to_ast_list); - print_library_entry = (fun x y -> Some (str "pcoq_print_library_entry not implemented")); - print_context = (fun x y z -> str "pcoq_print_context not implemented"); - print_typed_value_in_env = pcoq_print_typed_value_in_env; - Prettyp.print_eval = ct_print_eval; -};; - -let pcoq_printer_pr = { - pr_subgoals = pcoq_pr_subgoals; - pr_subgoal = pcoq_pr_subgoal; - pr_goal = (fun x -> str "pcoq_pr_goal not implemented"); -};; - - -let start_pcoq_objects () = - set_object_pr pcoq_object_pr; - set_printer_pr pcoq_printer_pr - -let start_default_objects () = - set_object_pr default_object_pr; - set_printer_pr default_printer_pr - -let full_name_of_ref r = - (match r with - | VarRef _ -> str "VAR" - | ConstRef _ -> str "CST" - | IndRef _ -> str "IND" - | ConstructRef _ -> str "CSR") - ++ str " " ++ (pr_sp (Nametab.sp_of_global r)) - (* LEM TODO: Cleanly separate path from id (see Libnames.string_of_path) *) - -let string_of_ref = - (*LEM TODO: Will I need the Var/Const/Ind/Construct info?*) - Depends.o Libnames.string_of_path Nametab.sp_of_global - -let print_depends compute_depends ptree = - output_results (List.fold_left (fun x y -> x ++ (full_name_of_ref y) ++ fnl()) - (str "This object depends on:" ++ fnl()) - (compute_depends ptree)) - None - -let output_depends compute_depends ptree = - (* Using an ident list for that is arguably stretching it, but less effort than touching the vtp types *) - output_results (ctf_header "depends" !global_request_id ++ - print_tree (P_ids (CT_id_list (List.map - (fun x -> CT_ident (string_of_ref x)) - (compute_depends ptree))))) - None - -let gen_start_depends_dumps print_depends print_depends' print_depends'' print_depends''' = - Command.set_declare_definition_hook (print_depends' (Depends.depends_of_definition_entry ~acc:[])); - Command.set_declare_assumption_hook (print_depends (fun (c:types) -> Depends.depends_of_constr c [])); - Command.set_start_hook (print_depends (fun c -> Depends.depends_of_constr c [])); - Command.set_save_hook (print_depends'' (Depends.depends_of_pftreestate Depends.depends_of_pftree)); - Refiner.set_solve_hook (print_depends''' (fun pt -> Depends.depends_of_pftree_head pt [])) - -let start_depends_dumps () = gen_start_depends_dumps output_depends output_depends output_depends output_depends - -let start_depends_dumps_debug () = gen_start_depends_dumps print_depends print_depends print_depends print_depends - -TACTIC EXTEND pbp -| [ "pbp" ident_opt(idopt) natural_list(nl) ] -> - [ if_pcoq pbp_tac_pcoq idopt nl ] -END - -TACTIC EXTEND ct_debugtac -| [ "debugtac" tactic(t) ] -> [ if_pcoq debug_tac2_pcoq (fst t) ] -END - -TACTIC EXTEND ct_debugtac2 -| [ "debugtac2" tactic(t) ] -> [ if_pcoq debug_tac2_pcoq (fst t) ] -END - - -let start_pcoq_mode debug = - begin - pcoq_started := Some debug; -(* <\cpa> - start_dad(); -</cpa> *) -(* The following ones are added to enable rich comments in pcoq *) -(* TODO ... - add_tactic "Image" (fun _ -> tclIDTAC); -*) -(* "Comments" moved to Vernacentries, other obsolete ? - List.iter (fun (a,b) -> vinterp_add a b) command_creations; -*) -(* Now hooks in Vernacentries - 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; -*) - set_pcoq_hook pcoq_hook; - start_pcoq_objects(); - Flags.print_emacs := false; Pp.make_pp_nonemacs(); - end;; - - -let start_pcoq () = - 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 Vernacexpr.ProtectedLoop;; - -let start_pcoq_debug () = - start_pcoq_mode true; - set_acknowledge_command ctf_acknowledge_command; - set_start_marker "--->"; - set_end_marker "<---"; - raise Vernacexpr.ProtectedLoop;; - -VERNAC COMMAND EXTEND HypSearchPattern - [ "HypSearchPattern" constr(pat) ] -> [ hyp_search_pattern pat ([], false) ] -END - -VERNAC COMMAND EXTEND StartPcoq - [ "Start" "Pcoq" "Mode" ] -> [ start_pcoq () ] -END - -VERNAC COMMAND EXTEND Pcoq_inspect - [ "Pcoq_inspect" ] -> [ inspect 15 ] -END - -VERNAC COMMAND EXTEND StartPcoqDebug -| [ "Start" "Pcoq" "Debug" "Mode" ] -> [ start_pcoq_debug () ] -END - -VERNAC COMMAND EXTEND StartPcoqTerms -| [ "Start" "Pcoq" "Trees" ] -> [ start_pcoq_trees () ] -END - -VERNAC COMMAND EXTEND StartPcoqObjects -| [ "Start" "Pcoq" "Objects" ] -> [ start_pcoq_objects () ] -END - -VERNAC COMMAND EXTEND StartDefaultObjects -| [ "Start" "Default" "Objects" ] -> [ start_default_objects () ] -END - -VERNAC COMMAND EXTEND StartDependencyDumps -| [ "Start" "Dependency" "Dumps" ] -> [ start_depends_dumps () ] -END - -VERNAC COMMAND EXTEND StopPcoqHistory -| [ "Stop" "Pcoq" "History" ] -> [ pcoq_history := false ] -END |