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