From 5b7eafd0f00a16d78f99a27f5c7d5a0de77dc7e6 Mon Sep 17 00:00:00 2001 From: Stephane Glondu Date: Wed, 21 Jul 2010 09:46:51 +0200 Subject: Imported Upstream snapshot 8.3~beta0+13298 --- contrib/interface/debug_tac.ml4 | 458 ---------------------------------------- 1 file changed, 458 deletions(-) delete mode 100644 contrib/interface/debug_tac.ml4 (limited to 'contrib/interface/debug_tac.ml4') diff --git a/contrib/interface/debug_tac.ml4 b/contrib/interface/debug_tac.ml4 deleted file mode 100644 index aad3a765..00000000 --- a/contrib/interface/debug_tac.ml4 +++ /dev/null @@ -1,458 +0,0 @@ -(*i camlp4deps: "parsing/grammar.cma" i*) - -open Tacmach;; -open Tacticals;; -open Proof_trees;; -open Pp;; -open Pptactic;; -open Util;; -open Proof_type;; -open Tacexpr;; -open Genarg;; - -let pr_glob_tactic = Pptactic.pr_glob_tactic (Global.env()) - -(* Compacting and uncompacting proof commands *) - -type report_tree = - Report_node of bool *int * report_tree list - | Mismatch of int * int - | Tree_fail of report_tree - | Failed of int;; - -type report_card = - Ngoals of int - | Goals_mismatch of int - | Recursive_fail of report_tree - | Fail;; - -type card_holder = report_card ref;; -type report_holder = report_tree list ref;; - -(* This tactical receives an integer and a tactic and checks that the - tactic produces that number of goals. It never fails but signals failure - by updating the boolean reference given as third argument to false. - It is especially suited for use in checked_thens below. *) - -let check_subgoals_count : card_holder -> int -> bool ref -> tactic -> tactic = - fun card_holder count flag t g -> - try - let (gls, v) as result = t g in - let len = List.length (sig_it gls) in - card_holder := - (if len = count then - (flag := true; - Ngoals count) - else - (flag := false; - Goals_mismatch len)); - result - with - e -> card_holder := Fail; - flag := false; - tclIDTAC g;; - -let no_failure = function - [Report_node(true,_,_)] -> true - | _ -> false;; - -let check_subgoals_count2 - : card_holder -> int -> bool ref -> (report_holder -> tactic) -> tactic = - fun card_holder count flag t g -> - let new_report_holder = ref ([] : report_tree list) in - let (gls, v) as result = t new_report_holder g in - let succeeded = no_failure !new_report_holder in - let len = List.length (sig_it gls) in - card_holder := - (if (len = count) & succeeded then - (flag := true; - Ngoals count) - else - (flag := false; - Recursive_fail (List.hd !new_report_holder))); - result;; - -let traceable = function - | TacThen _ | TacThens _ -> true - | _ -> false;; - -let rec collect_status = function - Report_node(true,_,_)::tl -> collect_status tl - | [] -> true - | _ -> false;; - -(* This tactical receives a tactic and executes it, reporting information - about success in the report holder and a boolean reference. *) - -let count_subgoals : card_holder -> bool ref -> tactic -> tactic = - fun card_holder flag t g -> - try - let (gls, _) as result = t g in - card_holder := (Ngoals(List.length (sig_it gls))); - flag := true; - result - with - e -> card_holder := Fail; - flag := false; - tclIDTAC g;; - -let count_subgoals2 - : card_holder -> bool ref -> (report_holder -> tactic) -> tactic = - fun card_holder flag t g -> - let new_report_holder = ref([] : report_tree list) in - let (gls, v) as result = t new_report_holder g in - let succeeded = no_failure !new_report_holder in - if succeeded then - (flag := true; - card_holder := Ngoals (List.length (sig_it gls))) - else - (flag := false; - card_holder := Recursive_fail(List.hd !new_report_holder)); - result;; - -let rec local_interp : glob_tactic_expr -> report_holder -> tactic = function - TacThens (a,l) -> - (fun report_holder -> checked_thens report_holder a l) - | TacThen (a,[||],b,[||]) -> - (fun report_holder -> checked_then report_holder a b) - | t -> - (fun report_holder g -> - try - let (gls, _) as result = Tacinterp.eval_tactic t g in - report_holder := (Report_node(true, List.length (sig_it gls), [])) - ::!report_holder; - result - with e -> (report_holder := (Failed 1)::!report_holder; - tclIDTAC g)) - - -(* This tactical receives a tactic and a list of tactics as argument. - It applies the first tactic and then maps the list of tactics to - various produced sub-goals. This tactic will never fail, but reports - are added in the report_holder in the following way: - - In case of partial success, a new report_tree is added to the report_holder - - In case of failure of the first tactic, with no more indications - then Failed 0 is added to the report_holder, - - In case of partial failure of the first tactic then (Failed n) is added to - the report holder. - - In case of success of the first tactic, but count mismatch, then - Mismatch n is added to the report holder. *) - -and checked_thens: report_holder -> glob_tactic_expr -> glob_tactic_expr list -> tactic = - (fun report_holder t1 l g -> - let flag = ref true in - let traceable_t1 = traceable t1 in - let card_holder = ref Fail in - let new_holder = ref ([]:report_tree list) in - let tac_t1 = - if traceable_t1 then - (check_subgoals_count2 card_holder (List.length l) - flag (local_interp t1)) - else - (check_subgoals_count card_holder (List.length l) - flag (Tacinterp.eval_tactic t1)) in - let (gls, _) as result = - tclTHEN_i tac_t1 - (fun i -> - if !flag then - (fun g -> - let tac_i = (List.nth l i) in - if traceable tac_i then - local_interp tac_i new_holder g - else - try - let (gls,_) as result = Tacinterp.eval_tactic tac_i g in - let len = List.length (sig_it gls) in - new_holder := - (Report_node(true, len, []))::!new_holder; - result - with - e -> (new_holder := (Failed 1)::!new_holder; - tclIDTAC g)) - else - tclIDTAC) g in - let new_goal_list = sig_it gls in - (if !flag then - report_holder := - (Report_node(collect_status !new_holder, - (List.length new_goal_list), - List.rev !new_holder))::!report_holder - else - report_holder := - (match !card_holder with - Goals_mismatch(n) -> Mismatch(n, List.length l) - | Recursive_fail tr -> Tree_fail tr - | Fail -> Failed 1 - | _ -> errorlabstrm "check_thens" - (str "this case should not happen in check_thens")):: - !report_holder); - result) - -(* This tactical receives two tactics as argument, it executes the - first tactic and applies the second one to all the produced goals, - reporting information about the success of all tactics in the report - holder. It never fails. *) - -and checked_then: report_holder -> glob_tactic_expr -> glob_tactic_expr -> tactic = - (fun report_holder t1 t2 g -> - let flag = ref true in - let card_holder = ref Fail in - let tac_t1 = - if traceable t1 then - (count_subgoals2 card_holder flag (local_interp t1)) - else - (count_subgoals card_holder flag (Tacinterp.eval_tactic t1)) in - let new_tree_holder = ref ([] : report_tree list) in - let (gls, _) as result = - tclTHEN tac_t1 - (fun (g:goal sigma) -> - if !flag then - if traceable t2 then - local_interp t2 new_tree_holder g - else - try - let (gls, _) as result = Tacinterp.eval_tactic t2 g in - new_tree_holder := - (Report_node(true, List.length (sig_it gls),[])):: - !new_tree_holder; - result - with - e -> - (new_tree_holder := ((Failed 1)::!new_tree_holder); - tclIDTAC g) - else - tclIDTAC g) g in - (if !flag then - report_holder := - (Report_node(collect_status !new_tree_holder, - List.length (sig_it gls), - List.rev !new_tree_holder))::!report_holder - else - report_holder := - (match !card_holder with - Recursive_fail tr -> Tree_fail tr - | Fail -> Failed 1 - | _ -> error "this case should not happen in check_then")::!report_holder); - result);; - -(* This tactic applies the given tactic only to those subgoals designated - by the list of integers given as extra arguments. - *) - -let rawwit_main_tactic = Pcoq.rawwit_tactic Pcoq.tactic_main_level -let globwit_main_tactic = Pcoq.globwit_tactic Pcoq.tactic_main_level -let wit_main_tactic = Pcoq.wit_tactic Pcoq.tactic_main_level - - -let on_then = function [t1;t2;l] -> - let t1 = out_gen wit_main_tactic t1 in - let t2 = out_gen wit_main_tactic t2 in - let l = out_gen (wit_list0 wit_int) l in - tclTHEN_i (Tacinterp.eval_tactic t1) - (fun i -> - if List.mem (i + 1) l then - (Tacinterp.eval_tactic t2) - else - tclIDTAC) - | _ -> anomaly "bad arguments for on_then";; - -let mkOnThen t1 t2 selected_indices = - let a = in_gen rawwit_main_tactic t1 in - let b = in_gen rawwit_main_tactic t2 in - let l = in_gen (wit_list0 rawwit_int) selected_indices in - TacAtom (dummy_loc, TacExtend (dummy_loc, "OnThen", [a;b;l]));; - -(* Analyzing error reports *) - -let rec select_success n = function - [] -> [] - | Report_node(true,_,_)::tl -> n::select_success (n+1) tl - | _::tl -> select_success (n+1) tl;; - -let rec reconstruct_success_tac (tac:glob_tactic_expr) = - match tac with - TacThens (a,l) -> - (function - Report_node(true, n, l) -> tac - | Report_node(false, n, rl) -> - TacThens (a,List.map2 reconstruct_success_tac l rl) - | Failed n -> TacId [] - | Tree_fail r -> reconstruct_success_tac a r - | Mismatch (n,p) -> a) - | TacThen (a,[||],b,[||]) -> - (function - Report_node(true, n, l) -> tac - | Report_node(false, n, rl) -> - let selected_indices = select_success 1 rl in - TacAtom (dummy_loc,TacExtend (dummy_loc,"OnThen", - [in_gen globwit_main_tactic a; - in_gen globwit_main_tactic b; - in_gen (wit_list0 globwit_int) selected_indices])) - | Failed n -> TacId [] - | Tree_fail r -> reconstruct_success_tac a r - | _ -> error "this error case should not happen in a THEN tactic") - | _ -> - (function - Report_node(true, n, l) -> tac - | Failed n -> TacId [] - | _ -> - errorlabstrm - "this error case should not happen on an unknown tactic" - (str "error in reconstruction with " ++ fnl () ++ - (pr_glob_tactic tac)));; - - -let rec path_to_first_error = function -| Report_node(true, _, l) -> - let rec find_first_error n = function - | (Report_node(true, _, _))::tl -> find_first_error (n + 1) tl - | it::tl -> n, it - | [] -> error "no error detected" in - let p, t = find_first_error 1 l in - p::(path_to_first_error t) -| _ -> [];; - -let debug_tac = function - [(Tacexp ast)] -> - (fun g -> - let report = ref ([] : report_tree list) in - let result = local_interp ast report g in - let clean_ast = (* expand_tactic *) ast in - let report_tree = - try List.hd !report with - Failure "hd" -> (msgnl (str "report is empty"); Failed 1) in - let success_tac = - reconstruct_success_tac clean_ast report_tree in - let compact_success_tac = (* flatten_then *) success_tac in - msgnl (fnl () ++ - str "========= Successful tactic =============" ++ - fnl () ++ - pr_glob_tactic compact_success_tac ++ fnl () ++ - str "========= End of successful tactic ============"); - result) - | _ -> error "wrong arguments for debug_tac";; - -(* TODO ... used ? -add_tactic "DebugTac" debug_tac;; -*) - -Tacinterp.add_tactic "OnThen" on_then;; - -let rec clean_path tac l = - match tac, l with - | TacThen (a,[||],b,[||]), fst::tl -> - fst::(clean_path (if fst = 1 then a else b) tl) - | TacThens (a,l), 1::tl -> - 1::(clean_path a tl) - | TacThens (a,tacs), 2::fst::tl -> - 2::fst::(clean_path (List.nth tacs (fst - 1)) tl) - | _, [] -> [] - | _, _ -> failwith "this case should not happen in clean_path";; - -let rec report_error - : glob_tactic_expr -> goal sigma option ref -> glob_tactic_expr ref -> int list ref -> - int list -> tactic = - fun tac the_goal the_ast returned_path path -> - match tac with - TacThens (a,l) -> - let the_card_holder = ref Fail in - let the_flag = ref false in - let the_exn = ref (Failure "") in - tclTHENS - (fun g -> - let result = - check_subgoals_count - the_card_holder - (List.length l) - the_flag - (fun g2 -> - try - (report_error a the_goal the_ast returned_path (1::path) g2) - with - e -> (the_exn := e; raise e)) - g in - if !the_flag then - result - else - (match !the_card_holder with - Fail -> - the_ast := TacThens (!the_ast, l); - raise !the_exn - | Goals_mismatch p -> - the_ast := tac; - returned_path := path; - error ("Wrong number of tactics: expected " ^ - (string_of_int (List.length l)) ^ " received " ^ - (string_of_int p)) - | _ -> error "this should not happen")) - (let rec fold_num n = function - [] -> [] - | t::tl -> (report_error t the_goal the_ast returned_path (n::2::path)):: - (fold_num (n + 1) tl) in - fold_num 1 l) - | TacThen (a,[||],b,[||]) -> - let the_count = ref 1 in - tclTHEN - (fun g -> - try - report_error a the_goal the_ast returned_path (1::path) g - with - e -> - (the_ast := TacThen (!the_ast,[||], b,[||]); - raise e)) - (fun g -> - try - let result = - report_error b the_goal the_ast returned_path (2::path) g in - the_count := !the_count + 1; - result - with - e -> - if !the_count > 1 then - msgnl - (str "in branch no " ++ int !the_count ++ - str " after tactic " ++ pr_glob_tactic a); - raise e) - | tac -> - (fun g -> - try - Tacinterp.eval_tactic tac g - with - e -> - (the_ast := tac; - the_goal := Some g; - returned_path := path; - raise e));; - -let strip_some = function - Some n -> n - | None -> failwith "No optional value";; - -let descr_first_error 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 - msgnl (str "no Error here"); - result - with - e -> - (msgnl (str "Execution of this tactic raised message " ++ fnl () ++ - fnl () ++ Cerrors.explain_exn e ++ fnl () ++ - fnl () ++ str "on goal" ++ fnl () ++ - Printer.pr_goal (sig_it (strip_some !the_goal)) ++ - fnl () ++ str "faulty tactic is" ++ fnl () ++ fnl () ++ - pr_glob_tactic ((*flatten_then*) !the_ast) ++ fnl ()); - tclIDTAC g)) - -(* TODO ... used ?? -add_tactic "DebugTac2" descr_first_error;; -*) - -(* -TACTIC EXTEND DebugTac2 - [ ??? ] -> [ descr_first_error tac ] -END -*) -- cgit v1.2.3