aboutsummaryrefslogtreecommitdiff
path: root/printing/tactic_printer.ml
diff options
context:
space:
mode:
authorletouzey2012-05-29 11:09:32 +0000
committerletouzey2012-05-29 11:09:32 +0000
commit929d25a05585dd702739b6979e3822bfa6cdbadb (patch)
tree54bca1fb70021de0fe7eb0478150069a5c04b708 /printing/tactic_printer.ml
parentccac2bd2f351088a5cd5966dba331817f51ac19e (diff)
place all pretty-printing files in new dir printing/
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@15391 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'printing/tactic_printer.ml')
-rw-r--r--printing/tactic_printer.ml170
1 files changed, 170 insertions, 0 deletions
diff --git a/printing/tactic_printer.ml b/printing/tactic_printer.ml
new file mode 100644
index 0000000000..2c51abcd01
--- /dev/null
+++ b/printing/tactic_printer.ml
@@ -0,0 +1,170 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * INRIA - CNRS - LIX - LRI - PPS - Copyright 1999-2010 *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+
+open Pp
+open Errors
+open Util
+open Sign
+open Evd
+open Tacexpr
+open Proof_type
+open Printer
+
+let pr_tactic = function
+ | TacArg (_,Tacexp t) ->
+ (*top tactic from tacinterp*)
+ Pptactic.pr_glob_tactic (Global.env()) t
+ | t ->
+ Pptactic.pr_tactic (Global.env()) t
+
+let pr_rule = function
+ | Prim r -> hov 0 (pr_prim_rule r)
+ | Nested(cmpd,_) ->
+ begin
+ match cmpd with
+ | Tactic (texp,_) -> hov 0 (pr_tactic texp)
+ end
+ | Daimon -> str "<Daimon>"
+ | Decl_proof _ -> str "proof"
+
+let uses_default_tac = function
+ | Nested(Tactic(_,dflt),_) -> dflt
+ | _ -> false
+
+(* Does not print change of evars *)
+let pr_rule_dot = function
+ | Prim Change_evars ->str "PC: ch_evars" ++ mt ()
+ (* PC: this might be redundant *)
+ | r ->
+ pr_rule r ++ if uses_default_tac r then str "..." else str"."
+
+let pr_rule_dot_fnl = function
+ | Nested (Tactic (TacAtom (_,(TacMutualFix (true,_,_,_)
+ | TacMutualCofix (true,_,_))),_),_) ->
+ (* Very big hack to not display hidden tactics in "Theorem with" *)
+ (* (would not scale!) *)
+ mt ()
+ | Prim Change_evars -> mt ()
+ | r -> pr_rule_dot r ++ fnl ()
+
+exception Different
+
+let rec print_proof sigma osign pf =
+ (* spiwack: [osign] is currently ignored, not sure if this function is even used. *)
+ let hyps = Environ.named_context_of_val (Goal.V82.hyps sigma pf.goal) in
+ match pf.ref with
+ | None ->
+ hov 0 (pr_goal {sigma = sigma; it=pf.goal })
+ | Some(r,spfl) ->
+ hov 0
+ (hov 0 (pr_goal {sigma = sigma; it=pf.goal }) ++
+ spc () ++ str" BY " ++
+ hov 0 (pr_rule r) ++ fnl () ++
+ str" " ++
+ hov 0 (prlist_with_sep fnl (print_proof sigma hyps) spfl))
+
+let pr_change sigma gl =
+ str"change " ++
+ pr_lconstr_env (Goal.V82.env sigma gl) (Goal.V82.concl sigma gl) ++ str"."
+
+let print_decl_script tac_printer ?(nochange=true) sigma pf =
+ let rec print_prf pf =
+ match pf.ref with
+ | None ->
+ (if nochange then
+ (str"<Your Proof Text here>")
+ else
+ pr_change sigma pf.goal)
+ ++ fnl ()
+ | Some (Daimon,[]) -> str "(* Some proof has been skipped here *)"
+ | Some (Prim Change_evars,[subpf]) -> print_prf subpf
+ | _ -> anomaly "Not Applicable" in
+ print_prf pf
+
+let print_script ?(nochange=true) sigma pf =
+ let rec print_prf pf =
+ match pf.ref with
+ | None ->
+ (if nochange then
+ (str"<Your Tactic Text here>")
+ else
+ pr_change sigma pf.goal)
+ ++ fnl ()
+ | Some(Decl_proof opened,script) ->
+ assert (List.length script = 1);
+ begin
+ if nochange then (mt ()) else (pr_change sigma pf.goal ++ fnl ())
+ end ++
+ begin
+ hov 0 (str "proof." ++ fnl () ++
+ print_decl_script print_prf
+ ~nochange sigma (List.hd script))
+ end ++ fnl () ++
+ begin
+ if opened then mt () else (str "end proof." ++ fnl ())
+ end
+ | Some(Daimon,spfl) ->
+ ((if nochange then (mt ()) else (pr_change sigma pf.goal ++ fnl ())) ++
+ prlist_with_sep fnl print_prf spfl )
+ | Some(rule,spfl) ->
+ ((if nochange then (mt ()) else (pr_change sigma pf.goal ++ fnl ())) ++
+ pr_rule_dot_fnl rule ++
+ prlist_with_sep fnl print_prf spfl ) in
+ print_prf pf
+
+(* printed by Show Script command *)
+
+let print_treescript ?(nochange=true) sigma pf =
+ let rec print_prf pf =
+ match pf.ref with
+ | None ->
+ if nochange then
+ str"<Your Proof Text here>"
+ else pr_change sigma pf.goal
+ | Some(Decl_proof opened,script) ->
+ assert (List.length script = 1);
+ begin
+ if nochange then mt () else pr_change sigma pf.goal ++ fnl ()
+ end ++
+ hov 0
+ begin str "proof." ++ fnl () ++
+ print_decl_script print_prf ~nochange sigma (List.hd script)
+ end ++ fnl () ++
+ begin
+ if opened then mt () else (str "end proof." ++ fnl ())
+ end
+ | Some(Daimon,spfl) ->
+ (if nochange then mt () else pr_change sigma pf.goal ++ fnl ()) ++
+ prlist_with_sep fnl (print_script ~nochange sigma) spfl
+ | Some(r,spfl) ->
+ let indent = if List.length spfl >= 2 then 1 else 0 in
+ (if nochange then mt () else pr_change sigma pf.goal ++ fnl ()) ++
+ hv indent (pr_rule_dot_fnl r ++ prlist_with_sep fnl print_prf spfl)
+ in hov 0 (print_prf pf)
+
+let rec print_info_script sigma osign pf =
+ let sign = Goal.V82.hyps sigma pf.goal in
+ match pf.ref with
+ | None -> (mt ())
+ | Some(r,spfl) ->
+ (pr_rule r ++
+ match spfl with
+ | [pf1] ->
+ if pf1.ref = None then
+ (str "." ++ fnl ())
+ else
+ (str";" ++ brk(1,3) ++
+ print_info_script sigma
+ (Environ.named_context_of_val sign) pf1)
+ | _ -> (str"." ++ fnl () ++
+ prlist_with_sep fnl
+ (print_info_script sigma
+ (Environ.named_context_of_val sign)) spfl))
+
+let format_print_info_script sigma osign pf =
+ hov 0 (print_info_script sigma osign pf)