| author | wenzelm | 
| Wed, 14 Nov 2001 23:14:59 +0100 | |
| changeset 12184 | f4aaa2647fd2 | 
| parent 12081 | f9735aad76dc | 
| child 12418 | 753054ec8e88 | 
| permissions | -rw-r--r-- | 
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 1 | (* Title: Pure/display.ML | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 2 | ID: $Id$ | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 3 | Author: Lawrence C Paulson, Cambridge University Computer Laboratory | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 4 | Copyright 1993 University of Cambridge | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 5 | |
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 6 | Printing of theories, theorems, etc. | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 7 | *) | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 8 | |
| 11883 | 9 | signature BASIC_DISPLAY = | 
| 10 | sig | |
| 12081 | 11 | val goals_limit: int ref | 
| 11883 | 12 | val show_hyps: bool ref | 
| 13 | val show_tags: bool ref | |
| 14 | val string_of_thm: thm -> string | |
| 15 | val print_thm: thm -> unit | |
| 16 | val print_thms: thm list -> unit | |
| 17 | val prth: thm -> thm | |
| 18 | val prthq: thm Seq.seq -> thm Seq.seq | |
| 19 | val prths: thm list -> thm list | |
| 20 | val string_of_ctyp: ctyp -> string | |
| 21 | val print_ctyp: ctyp -> unit | |
| 22 | val string_of_cterm: cterm -> string | |
| 23 | val print_cterm: cterm -> unit | |
| 24 | val print_syntax: theory -> unit | |
| 25 | val show_consts: bool ref | |
| 26 | end; | |
| 27 | ||
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 28 | signature DISPLAY = | 
| 4950 | 29 | sig | 
| 11883 | 30 | include BASIC_DISPLAY | 
| 12081 | 31 | val pretty_thm_aux: (sort -> Pretty.T) * (term -> Pretty.T) -> bool -> thm -> Pretty.T | 
| 6976 | 32 | val pretty_thm_no_quote: thm -> Pretty.T | 
| 11883 | 33 | val pretty_thm: thm -> Pretty.T | 
| 34 | val pretty_thms: thm list -> Pretty.T | |
| 35 | val pretty_thm_sg: Sign.sg -> thm -> Pretty.T | |
| 36 | val pretty_thms_sg: Sign.sg -> thm list -> Pretty.T | |
| 37 | val pprint_thm: thm -> pprint_args -> unit | |
| 38 | val pretty_ctyp: ctyp -> Pretty.T | |
| 39 | val pprint_ctyp: ctyp -> pprint_args -> unit | |
| 40 | val pretty_cterm: cterm -> Pretty.T | |
| 41 | val pprint_cterm: cterm -> pprint_args -> unit | |
| 42 | val pretty_theory: theory -> Pretty.T | |
| 43 | val pprint_theory: theory -> pprint_args -> unit | |
| 8720 | 44 | val pretty_full_theory: theory -> Pretty.T list | 
| 11883 | 45 | val pretty_name_space: string * NameSpace.T -> Pretty.T | 
| 12081 | 46 | val pretty_goals_aux: (sort -> Pretty.T) * (typ -> Pretty.T) * (term -> Pretty.T) | 
| 47 | -> string -> bool * bool -> int -> thm -> Pretty.T list | |
| 11883 | 48 | val pretty_goals: int -> thm -> Pretty.T list | 
| 49 | val print_goals: int -> thm -> unit | |
| 50 | val current_goals_markers: (string * string * string) ref | |
| 51 | val print_current_goals_default: (int -> int -> thm -> unit) | |
| 52 | val print_current_goals_fn : (int -> int -> thm -> unit) ref | |
| 4950 | 53 | end; | 
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 54 | |
| 4950 | 55 | structure Display: DISPLAY = | 
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 56 | struct | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 57 | |
| 11883 | 58 | |
| 6087 | 59 | (** print thm **) | 
| 60 | ||
| 12081 | 61 | val goals_limit = ref 10; (*max number of goals to print -- set by user*) | 
| 11883 | 62 | val show_hyps = ref true; (*false: print meta-hypotheses as dots*) | 
| 63 | val show_tags = ref false; (*false: suppress tags*) | |
| 6087 | 64 | |
| 8402 | 65 | fun pretty_tag (name, args) = Pretty.strs (name :: map quote args); | 
| 6087 | 66 | val pretty_tags = Pretty.list "[" "]" o map pretty_tag; | 
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 67 | |
| 12081 | 68 | fun pretty_thm_aux (pretty_sort, pretty_term) quote th = | 
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 69 | let | 
| 12067 | 70 |     val {hyps, prop, der = (ora, _), ...} = rep_thm th;
 | 
| 6087 | 71 | val xshyps = Thm.extra_shyps th; | 
| 72 | val (_, tags) = Thm.get_name_tags th; | |
| 73 | ||
| 12067 | 74 | val prt_term = (if quote then Pretty.quote else I) o pretty_term; | 
| 6279 | 75 | |
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 76 | val hlen = length xshyps + length hyps; | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 77 | val hsymbs = | 
| 9500 | 78 | if hlen = 0 andalso not ora then [] | 
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 79 | else if ! show_hyps then | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 80 | [Pretty.brk 2, Pretty.list "[" "]" | 
| 12067 | 81 | (map prt_term hyps @ map pretty_sort xshyps @ | 
| 9500 | 82 | (if ora then [Pretty.str "!"] else []))] | 
| 6889 | 83 |       else [Pretty.brk 2, Pretty.str ("[" ^ implode (replicate hlen ".") ^
 | 
| 9500 | 84 | (if ora then "!" else "") ^ "]")]; | 
| 6087 | 85 | val tsymbs = | 
| 86 | if null tags orelse not (! show_tags) then [] | |
| 87 | else [Pretty.brk 1, pretty_tags tags]; | |
| 6279 | 88 | in Pretty.block (prt_term prop :: (hsymbs @ tsymbs)) end; | 
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 89 | |
| 12067 | 90 | fun gen_pretty_thm quote th = | 
| 91 | let val sg = Thm.sign_of_thm th | |
| 12081 | 92 | in pretty_thm_aux (Sign.pretty_sort sg, Sign.pretty_term sg) quote th end; | 
| 6889 | 93 | |
| 12067 | 94 | val pretty_thm = gen_pretty_thm true; | 
| 95 | val pretty_thm_no_quote = gen_pretty_thm false; | |
| 6889 | 96 | |
| 97 | ||
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 98 | val string_of_thm = Pretty.string_of o pretty_thm; | 
| 6279 | 99 | val pprint_thm = Pretty.pprint o pretty_thm; | 
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 100 | |
| 6087 | 101 | fun pretty_thms [th] = pretty_thm th | 
| 102 | | pretty_thms ths = Pretty.block (Pretty.fbreaks (map pretty_thm ths)); | |
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 103 | |
| 10010 | 104 | val pretty_thm_sg = pretty_thm oo Thm.transfer_sg; | 
| 105 | val pretty_thms_sg = pretty_thms oo (map o Thm.transfer_sg); | |
| 106 | ||
| 6087 | 107 | |
| 108 | (* top-level commands for printing theorems *) | |
| 109 | ||
| 110 | val print_thm = Pretty.writeln o pretty_thm; | |
| 111 | val print_thms = Pretty.writeln o pretty_thms; | |
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 112 | |
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 113 | fun prth th = (print_thm th; th); | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 114 | |
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 115 | (*Print and return a sequence of theorems, separated by blank lines. *) | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 116 | fun prthq thseq = | 
| 4270 | 117 | (Seq.print (fn _ => print_thm) 100000 thseq; thseq); | 
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 118 | |
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 119 | (*Print and return a list of theorems, separated by blank lines. *) | 
| 4210 | 120 | fun prths ths = (seq (fn th => (print_thm th; writeln "")) ths; ths); | 
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 121 | |
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 122 | |
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 123 | (* other printing commands *) | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 124 | |
| 4126 | 125 | fun pretty_ctyp cT = | 
| 126 |   let val {sign, T} = rep_ctyp cT in Sign.pretty_typ sign T end;
 | |
| 127 | ||
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 128 | fun pprint_ctyp cT = | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 129 |   let val {sign, T} = rep_ctyp cT in Sign.pprint_typ sign T end;
 | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 130 | |
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 131 | fun string_of_ctyp cT = | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 132 |   let val {sign, T} = rep_ctyp cT in Sign.string_of_typ sign T end;
 | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 133 | |
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 134 | val print_ctyp = writeln o string_of_ctyp; | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 135 | |
| 3547 | 136 | fun pretty_cterm ct = | 
| 137 |   let val {sign, t, ...} = rep_cterm ct in Sign.pretty_term sign t end;
 | |
| 138 | ||
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 139 | fun pprint_cterm ct = | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 140 |   let val {sign, t, ...} = rep_cterm ct in Sign.pprint_term sign t end;
 | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 141 | |
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 142 | fun string_of_cterm ct = | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 143 |   let val {sign, t, ...} = rep_cterm ct in Sign.string_of_term sign t end;
 | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 144 | |
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 145 | val print_cterm = writeln o string_of_cterm; | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 146 | |
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 147 | |
| 4250 | 148 | |
| 149 | (** print theory **) | |
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 150 | |
| 6390 | 151 | val pretty_theory = Sign.pretty_sg o Theory.sign_of; | 
| 152 | val pprint_theory = Sign.pprint_sg o Theory.sign_of; | |
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 153 | |
| 6390 | 154 | val print_syntax = Syntax.print_syntax o Theory.syn_of; | 
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 155 | |
| 4250 | 156 | |
| 4498 | 157 | (* pretty_name_space *) | 
| 158 | ||
| 159 | fun pretty_name_space (kind, space) = | |
| 160 | let | |
| 161 | fun prt_entry (name, accs) = Pretty.block | |
| 162 | (Pretty.str (quote name ^ " =") :: Pretty.brk 1 :: | |
| 163 | Pretty.commas (map (Pretty.str o quote) accs)); | |
| 164 | in | |
| 165 | Pretty.fbreaks (Pretty.str (kind ^ ":") :: map prt_entry (NameSpace.dest space)) | |
| 166 | |> Pretty.block | |
| 167 | end; | |
| 168 | ||
| 169 | ||
| 11883 | 170 | (* pretty_full_theory *) | 
| 4250 | 171 | |
| 8720 | 172 | fun pretty_full_theory thy = | 
| 4250 | 173 | let | 
| 8720 | 174 | val sg = Theory.sign_of thy; | 
| 175 | ||
| 4250 | 176 | fun prt_cls c = Sign.pretty_sort sg [c]; | 
| 177 | fun prt_sort S = Sign.pretty_sort sg S; | |
| 178 | fun prt_arity t (c, Ss) = Sign.pretty_arity sg (t, Ss, [c]); | |
| 10737 | 179 | fun prt_typ_no_tvars ty = Pretty.quote (Sign.pretty_typ sg (#1 (Type.freeze_thaw_type ty))); | 
| 8720 | 180 | fun prt_term t = Pretty.quote (Sign.pretty_term sg t); | 
| 4250 | 181 | |
| 182 | fun pretty_classes cs = Pretty.block | |
| 183 | (Pretty.breaks (Pretty.str "classes:" :: map prt_cls cs)); | |
| 184 | ||
| 185 | fun pretty_classrel (c, cs) = Pretty.block | |
| 186 | (prt_cls c :: Pretty.str " <" :: Pretty.brk 1 :: | |
| 187 | Pretty.commas (map prt_cls cs)); | |
| 188 | ||
| 189 | fun pretty_default S = Pretty.block | |
| 190 | [Pretty.str "default:", Pretty.brk 1, prt_sort S]; | |
| 191 | ||
| 192 | fun pretty_ty (t, n) = Pretty.block | |
| 8458 | 193 | [Pretty.str t, Pretty.brk 1, Pretty.str (string_of_int n)]; | 
| 4250 | 194 | |
| 7635 | 195 | fun pretty_log_types ts = Pretty.block | 
| 196 | (Pretty.breaks (Pretty.str "logical types:" :: map Pretty.str ts)); | |
| 197 | ||
| 198 | fun pretty_witness None = Pretty.str "universal non-emptiness witness: --" | |
| 199 | | pretty_witness (Some (T, S)) = Pretty.block | |
| 10737 | 200 | [Pretty.str "universal non-emptiness witness:", Pretty.brk 1, prt_typ_no_tvars T, | 
| 8402 | 201 | Pretty.brk 1, prt_sort S]; | 
| 7635 | 202 | |
| 4250 | 203 | fun pretty_abbr (t, (vs, rhs)) = Pretty.block | 
| 10737 | 204 | [prt_typ_no_tvars (Type (t, map (fn v => TVar ((v, 0), [])) vs)), | 
| 205 | Pretty.str " =", Pretty.brk 1, prt_typ_no_tvars rhs]; | |
| 4250 | 206 | |
| 207 | fun pretty_arities (t, ars) = map (prt_arity t) ars; | |
| 208 | ||
| 209 | fun pretty_const (c, ty) = Pretty.block | |
| 10737 | 210 | [Pretty.str c, Pretty.str " ::", Pretty.brk 1, prt_typ_no_tvars ty]; | 
| 4250 | 211 | |
| 8720 | 212 | fun prt_axm (a, t) = Pretty.block [Pretty.str (a ^ ":"), Pretty.brk 1, prt_term t]; | 
| 213 | ||
| 214 | ||
| 4250 | 215 |     val {self = _, tsig, const_tab, syn = _, path, spaces, data} = Sign.rep_sg sg;
 | 
| 8720 | 216 |     val {axioms, oracles, ...} = Theory.rep_theory thy;
 | 
| 6846 | 217 | val spaces' = Library.sort_wrt fst spaces; | 
| 7635 | 218 |     val {classes, classrel, default, tycons = type_tab, log_types, univ_witness, abbrs, arities} =
 | 
| 4250 | 219 | Type.rep_tsig tsig; | 
| 7067 | 220 | val tycons = Sign.cond_extern_table sg Sign.typeK type_tab; | 
| 6846 | 221 | val consts = Sign.cond_extern_table sg Sign.constK const_tab; | 
| 8720 | 222 | val axms = Sign.cond_extern_table sg Theory.axiomK axioms; | 
| 223 | val oras = Sign.cond_extern_table sg Theory.oracleK oracles; | |
| 4250 | 224 | in | 
| 8720 | 225 |     [Pretty.strs ("stamps:" :: Sign.stamp_names_of sg),
 | 
| 226 |       Pretty.strs ("data:" :: Sign.data_kinds data),
 | |
| 11501 | 227 | Pretty.strs ["name prefix:", NameSpace.pack (if_none path ["-"])], | 
| 8720 | 228 | Pretty.big_list "name spaces:" (map pretty_name_space spaces'), | 
| 229 | pretty_classes classes, | |
| 230 | Pretty.big_list "class relation:" (map pretty_classrel (Symtab.dest classrel)), | |
| 231 | pretty_default default, | |
| 232 | pretty_log_types log_types, | |
| 233 | pretty_witness univ_witness, | |
| 234 | Pretty.big_list "type constructors:" (map pretty_ty tycons), | |
| 235 | Pretty.big_list "type abbreviations:" (map pretty_abbr (Symtab.dest abbrs)), | |
| 236 | Pretty.big_list "type arities:" (flat (map pretty_arities (Symtab.dest arities))), | |
| 237 | Pretty.big_list "consts:" (map pretty_const consts), | |
| 238 | Pretty.big_list "axioms:" (map prt_axm axms), | |
| 239 |       Pretty.strs ("oracles:" :: (map #1 oras))]
 | |
| 4250 | 240 | end; | 
| 241 | ||
| 242 | ||
| 11883 | 243 | |
| 244 | (** print_goals **) | |
| 245 | ||
| 246 | (* print_goals etc. *) | |
| 247 | ||
| 8908 | 248 | (*show consts with types in proof state output?*) | 
| 3851 
fe9932a7cd46
print_goals: optional output of const types (set show_consts);
 wenzelm parents: 
3811diff
changeset | 249 | val show_consts = ref false; | 
| 
fe9932a7cd46
print_goals: optional output of const types (set show_consts);
 wenzelm parents: 
3811diff
changeset | 250 | |
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 251 | |
| 11883 | 252 | (*print thm A1,...,An/B in "goal style" -- premises as numbered subgoals*) | 
| 253 | ||
| 254 | local | |
| 255 | ||
| 12081 | 256 | fun ins_entry (x, y) [] = [(x, [y])] | 
| 257 | | ins_entry (x, y) ((pair as (x', ys')) :: pairs) = | |
| 258 | if x = x' then (x', y ins ys') :: pairs | |
| 259 | else pair :: ins_entry (x, y) pairs; | |
| 260 | ||
| 261 | fun add_consts (Const (c, T), env) = ins_entry (T, (c, T)) env | |
| 262 | | add_consts (t $ u, env) = add_consts (u, add_consts (t, env)) | |
| 263 | | add_consts (Abs (_, _, t), env) = add_consts (t, env) | |
| 264 | | add_consts (_, env) = env; | |
| 11883 | 265 | |
| 12081 | 266 | fun add_vars (Free (x, T), env) = ins_entry (T, (x, ~1)) env | 
| 267 | | add_vars (Var (xi, T), env) = ins_entry (T, xi) env | |
| 268 | | add_vars (Abs (_, _, t), env) = add_vars (t, env) | |
| 269 | | add_vars (t $ u, env) = add_vars (u, add_vars (t, env)) | |
| 270 | | add_vars (_, env) = env; | |
| 11883 | 271 | |
| 12081 | 272 | fun add_varsT (Type (_, Ts), env) = foldr add_varsT (Ts, env) | 
| 273 | | add_varsT (TFree (x, S), env) = ins_entry (S, (x, ~1)) env | |
| 274 | | add_varsT (TVar (xi, S), env) = ins_entry (S, xi) env; | |
| 11883 | 275 | |
| 12081 | 276 | fun sort_idxs vs = map (apsnd (sort (prod_ord string_ord int_ord))) vs; | 
| 277 | fun sort_cnsts cs = map (apsnd (sort_wrt fst)) cs; | |
| 278 | ||
| 279 | fun consts_of t = sort_cnsts (add_consts (t, [])); | |
| 280 | fun vars_of t = sort_idxs (add_vars (t, [])); | |
| 281 | fun varsT_of t = rev (sort_idxs (it_term_types add_varsT (t, []))); | |
| 282 | ||
| 283 | in | |
| 11883 | 284 | |
| 12081 | 285 | fun pretty_goals_aux (prt_sort, prt_typ, prt_term) begin_goal (msg, main) maxgoals state = | 
| 286 | let | |
| 287 | fun prt_atoms prt prtT (X, xs) = Pretty.block | |
| 288 | [Pretty.block (Pretty.commas (map prt xs)), Pretty.str " ::", | |
| 289 | Pretty.brk 1, prtT X]; | |
| 11883 | 290 | |
| 12081 | 291 | fun prt_var (x, ~1) = prt_term (Syntax.free x) | 
| 292 | | prt_var xi = prt_term (Syntax.var xi); | |
| 293 | ||
| 294 | fun prt_varT (x, ~1) = prt_typ (TFree (x, [])) | |
| 295 | | prt_varT xi = prt_typ (TVar (xi, [])); | |
| 296 | ||
| 297 | val prt_consts = prt_atoms (prt_term o Const) prt_typ; | |
| 298 | val prt_vars = prt_atoms prt_var prt_typ; | |
| 299 | val prt_varsT = prt_atoms prt_varT prt_sort; | |
| 11883 | 300 | |
| 301 | ||
| 12081 | 302 | fun pretty_list _ _ [] = [] | 
| 303 | | pretty_list name prt lst = [Pretty.big_list name (map prt lst)]; | |
| 11883 | 304 | |
| 12081 | 305 | fun pretty_subgoal (n, A) = | 
| 306 | Pretty.blk (0, [Pretty.str (begin_goal ^ " " ^ string_of_int n ^ ". "), prt_term A]); | |
| 307 | fun pretty_subgoals As = map pretty_subgoal (1 upto length As ~~ As); | |
| 11883 | 308 | |
| 12081 | 309 | val pretty_ffpairs = pretty_list "flex-flex pairs:" (prt_term o Logic.mk_flexpair); | 
| 11883 | 310 | |
| 12081 | 311 | val pretty_consts = pretty_list "constants:" prt_consts o consts_of; | 
| 312 | val pretty_vars = pretty_list "variables:" prt_vars o vars_of; | |
| 313 | val pretty_varsT = pretty_list "type variables:" prt_varsT o varsT_of; | |
| 11883 | 314 | |
| 315 | ||
| 12081 | 316 |     val {prop, ...} = rep_thm state;
 | 
| 317 | val (tpairs, As, B) = Logic.strip_horn prop; | |
| 318 | val ngoals = length As; | |
| 11883 | 319 | |
| 12081 | 320 | fun pretty_gs (types, sorts) = | 
| 321 | (if main then [prt_term B] else []) @ | |
| 322 | (if ngoals = 0 then [Pretty.str "No subgoals!"] | |
| 323 | else if ngoals > maxgoals then | |
| 324 | pretty_subgoals (take (maxgoals, As)) @ | |
| 325 |           (if msg then [Pretty.str ("A total of " ^ string_of_int ngoals ^ " subgoals...")]
 | |
| 326 | else []) | |
| 327 | else pretty_subgoals As) @ | |
| 328 | pretty_ffpairs tpairs @ | |
| 329 | (if ! show_consts then pretty_consts prop else []) @ | |
| 330 | (if types then pretty_vars prop else []) @ | |
| 331 | (if sorts then pretty_varsT prop else []); | |
| 332 | in | |
| 333 | setmp show_no_free_types true | |
| 334 | (setmp show_types (! show_types orelse ! show_sorts) | |
| 335 | (setmp show_sorts false pretty_gs)) | |
| 336 | (! show_types orelse ! show_sorts, ! show_sorts) | |
| 11883 | 337 | end; | 
| 338 | ||
| 12081 | 339 | fun pretty_goals_marker bg n th = | 
| 340 | let val sg = Thm.sign_of_thm th in | |
| 341 | pretty_goals_aux (Sign.pretty_sort sg, Sign.pretty_typ sg, Sign.pretty_term sg) | |
| 342 | bg (true, true) n th | |
| 343 | end; | |
| 344 | ||
| 345 | val pretty_goals = pretty_goals_marker ""; | |
| 346 | val print_goals_marker = (Pretty.writeln o Pretty.chunks) ooo pretty_goals_marker; | |
| 347 | val print_goals = print_goals_marker ""; | |
| 348 | ||
| 1591 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 349 | end; | 
| 
7fa0265dcd13
New module for display/printing operations, taken from drule.ML
 paulson parents: diff
changeset | 350 | |
| 11883 | 351 | |
| 352 | (* print_current_goals *) | |
| 353 | ||
| 354 | val current_goals_markers = ref ("", "", "");
 | |
| 355 | ||
| 356 | fun print_current_goals_default n max th = | |
| 357 | let | |
| 358 | val ref (begin_state, end_state, begin_goal) = current_goals_markers; | |
| 359 | val ngoals = nprems_of th; | |
| 360 | in | |
| 361 | if begin_state = "" then () else writeln begin_state; | |
| 362 |     writeln ("Level " ^ string_of_int n ^
 | |
| 363 |       (if ngoals > 0 then " (" ^ string_of_int ngoals ^ " subgoal" ^
 | |
| 364 | (if ngoals <> 1 then "s" else "") ^ ")" | |
| 365 | else "")); | |
| 366 | print_goals_marker begin_goal max th; | |
| 367 | if end_state = "" then () else writeln end_state | |
| 368 | end; | |
| 369 | ||
| 370 | val print_current_goals_fn = ref print_current_goals_default; | |
| 371 | ||
| 372 | end; | |
| 373 | ||
| 374 | structure BasicDisplay: BASIC_DISPLAY = Display; | |
| 375 | open BasicDisplay; |