signature | in ]; sig
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
typ>
datatype config =)java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
case_tr> -java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57 vallookup_by_constr vallookup_by_constr_permissive:Proof. ->string* typ> term*term) java.lang.StringIndexOutOfBoundsException: Range [93, 94) out of bounds for length 93 val =ap_data(fn onstrscases >constrscases)java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73
valrep_data=( val java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
al comb
java.lang.StringIndexOutOfBoundsException: Range [3, 1) out of bounds for length 37
term- C- Context.java.lang.StringIndexOutOfBoundsException: Index 71 out of bounds for length 71 end;
funindexify_names names= java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4 letlet val (yco_= .lookup( =t
=( (,_= OME| )
NONE => ifmember ( = java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
(asehint java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
lse >
|SOME=(^string_of_inti): xx 1: )java.lang.StringIndexOutOfBoundsException: Index 74 out of bounds for length 74
ex[]_ONE=(java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40 in
fun(caseAListlookup(= tab
et fun java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
idx,_)) =java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
name =. inif Symbol_Pos.is_identifierjava.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 0 in indexify_names (mapjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
(** data management **)
datatype java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 letval('used Name.variant sed
: term* terml).table;
fun make_data (constrs, cases) = Data {constrsjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
structure = Generic_Data
( type T = datafoldconstrain_Abs tTs( t)java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49 val (.,Symtab)java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 11
canthe_constraint )(.consts)
Data {constrsjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
(java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
) java.lang.StringIndexOutOfBoundsException: Range [29, 27) out of bounds for length 97
funabs_pat tT( usedjava.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
)=used fun map_constrs f = map_data ( in (t' $ u', used' fun map_cases
valrep_data=( Data |abs_pat__Ijava.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
fun T_of_data funreplace_dummies( (<const_syntax\openPuredummy_pattern<close l'[]
fastype_of letSyntaxconst\^>opencase_elem<>$Term_Positionstrip_positionsl $r) end
|> domain_type;
val Tname_of_data| dest_case1_ ( x ) used java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
val constrs_of = #constrs o rep_data; val cases_of = caseso rep_data
fun lookup_by_constr ctxt (c, T) = let val tab=Symtab.lookup_list (java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4
(case body_type T of Type yntax <^\open>ase_guard\ ,')= ';
| _ => (fold_rev in(' ')nd
fun lookup_by_constr_permissive(dest_case2u let val ( replace_dummiestused(,used;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
default=ifthenNONE else ( (List tab)java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72 (*conservative wrt. overloaded constructors*) in
(case hint of
NONE =>val _=Theory.setupSignparse_translation[\^ (. \^const_syntax<case_elem\< T.strip_positions l' rjava.lang.StringIndexOutOfBoundsException: Index 112 out of bounds for length 112
dest_case2( java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
NONE => defaultjava.lang.StringIndexOutOfBoundsException: Range [10, 3) out of bounds for length 34
|SOME info => let end;
val lookup_by_case = Symtab.lookup o cases_of;
(** installation **)
funconst<const_syntax>opencase_guard<closee$t
val name_of=try dest_Const_name;
(* parse translation *)
fun constrain_Abs tT t = Syntax.const \<^syntax_const>\<open>_constrainAbs\<close> ( t=>fnu=>Syntax.const<const_syntax inmk_clause t (s,T) : xs used'end
fun case_tr err ctxt [t, u] = let
Syntaxconst\<syntax_const\<openase1close>java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66 funmap.xsrhs
fun variant_free x let 'elsex );
fun abs p tTs t =
.const\<^const_syntax>\opencase_abslet
fold tTs (absfreept;
fun abs_pat (Const (\<^syntax_const>\<openletvalConst <const_syntax\<opencase_cons\lose>,_ t $ uu)=
abs_pat t (tT :mk_clause ] Name. (. t) mk_clauses java.lang.StringIndexOutOfBoundsException: Index 93 out of bounds for length 93
| abs_pat (Free (p as (in if is_const x | mk_clause (Const (<^const_syntax\opencase_elem<close>, _) pat $ rhs) xs __ =
abs_pat ( $u _= abs_pat u []# abs_pat t[]
| abs_pat _ _ = I;
(* replace occurrences of dummy_pattern by distinct variables *) fun replace_dummies (Const (\<^const_syntax>\<open>Pure.dummy_pattern\<close>, foldr1(fn (t,u) = Syntax.const\<^syntax_const>\<pen_case2\close t u) letval(x,used)variant_free" used in (Free (x, T), nd
| replace_dummies (t $ u) used = let val (t' subst_bounds (map | case_tr' _ = raiseMatch; val (',used'java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 in (t' $ u java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
replace_dummies used=t,used
fun dest_case1mk_clause t[ Namebuild_context (.declare_free_namest) : let _ = raiseMatch;
abs_patlist_comb(. \^yntax_const><>_\close>$x$
(Syntax. ; end
| dest_case1 _ = case_error "dest_case1";
java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
(java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19 in
(dest_case2 u)
|> update_cases end
| case_tr _ _ _ = case_error "case_tr";
val _ = Theory.setup (Sign.parse_translation [(\<^ alcase_key =dest_Const_namecase_comb
(* print translation *)
fun case_tr' (_ :: x :: t :: ts) = let funvaldatafn(,ts >Thmdeclaration_attributeK(t ts))
s,vTnameT data; invalupdate_constrs = ( key= . (,(, )))
m ((<const_syntax\open\close,_java.lang.StringIndexOutOfBoundsException: Range [76, 75) out of bounds for length 94
Syntax.const \<^syntax_const>\<open
subst_bounds (map Syntax_Trans.mark_bound_absjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 0
|mk_clause __ raiseMatch
|>map_cases update_cases
;
mk_clause
_= Theorysetup in
list_comb preserve namesgivenby *java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
(fn(,u=>Syntaxconst<syntax_const\<_case2> t$u)
(mk_clauses t), ts) end
| case_tr' _ = raise Match;
val (Argsterm --Scanrepeat1Argsterm>
(* declarations *)
fun register raw_case_comb raw_constrs context = let valofand;
( val constrs = Variable.java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 val constr_keys = map dest_Const_name constrs; val data = (case_comb, constrs); val Tname cjava.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 0
update_constrs = fnkey =Symtabcons_list( (,data)constr_keys
. tm )java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60 inin constructors
context
| update_constrs
|> ' (n(v ) ) >row |> end;
val _ = Theory apfst( [(,u] > v_to_prfx)( ~~rows
(.\binding<>case_translationclose
(Args.term -- Scan.repeat1 (Const(, cT,i =java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
( t, >Thm (K (register t ts)))) "declaration of case combinators and constructors";
(* (Un)check phases *)|SOMEcase_comb constructors
datatype configval = cT
exceptionjava.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
(*Each pattern carries with it a tag i, which denotes the clause it came from. i = ~1 indicates that the clause was added by pattern
completion.*)
fun add_row_used ((prfx, pats), (tm,si(flat,tree endjava.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 49
old (mapfn{,, .} =java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
(*try to preserve names given by user*) fun default_name "" (Free (name', _)) =val mk _= CASE_ERROR ((Malformedrowmatrix,)
| default_name name _ = map2 (fn {new_formals, , ...}=
(*Produce an instance of a constructor, plus fresh variables for its arguments.*) fun fresh_constr coltyused c == let val T = dest_Const_type c; val Ts = binder_types T; val = Name.variantsused(Absif s = "thenname , T, t)) val ty = body_type T; val ty_theta = Type.raw_match (ty, colty) Vartab.empty handleType. ~~njava.lang.StringIndexOutOfBoundsException: Range [47, 25) out of bounds for length 25 val c' = Envir.subst_term_types ty_theta c; val = mapifmemberaxsthen inc, = case_functions[);
(*Go through a list of rows and pick out the ones beginning with a
pattern with constructor = name.*)
in(x :java.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 21 letval k = _ )pat]java.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 21
prfx ::psrhs ,i))=
fn ((in_group, not_in_group)inmk end
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
name _java.lang.StringIndexOutOfBoundsException: Range [33, 30) out of bounds for length 37
t_varsctxt pat fold_aterms if length args Termf (, )java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
(((( ( s "occurs repeatedly java.lang.StringIndexOutOfBoundsException: Range [70, 71) out of bounds for length 70
map2 default_name val = map(no_repeat_vars Syntaxstring_of_term pat)java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
(n_group row:not_in_group), names)
| _ => raise CASE_ERROR ("
rows ([], []), replicate[),replicate k ") valrangeT java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 16
;
(* Partitioning *)
fun partition _ _ _ _ [] = raise CASE_ERROR ("partition: no rows", ~1)
|Term(. \^>_\close, let fun part Syntax. ,rhs
= " acpattern" java.lang.StringIndexOutOfBoundsException: Index 90 out of bounds for length 90
| part (c :: rangeT = let val ((in_group, (case distinct (op =) (map (fastype_ofmsg, i => val used' = fold add_row_used in_group used; val|_= case_errorallmusthave the same result type case_error
in_group' if null in_group (* Constructor not given *) then let
v Tsfastype_of ps valcase_error
Name. fold Termdeclare_free_namesgvarsused)
(replicate (length ps) "x");
[((prfx, gvars Thefollowing clausesareby clauses: open<,),1)java.lang.StringIndexOutOfBoundsException: Index 86 out of bounds for length 86 if else in_group; (* term check *)
constructor 'java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
ew_formals ,
names = names,
end inend
i t( s xse
| v_to_prfx _ = raise CASE_ERROR ("mk_case: v_to_prfx", ~1);
(* Translation of pattern terms into nested case expressions. *) decode_clause Frees, T:xs used java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
fun mk_case ctxt used range_ty =
l val java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 0
fun expand _ _ _ ((_, []), _) = raise CASE_ERROR ("mk_case: expand", ~1)
ps java.lang.StringIndexOutOfBoundsException: Range [67, 66) out of bounds for length 76
if ](ame(.declare_free_names u let val used' = fun expnd c = letval capp java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
( ::pssubst_free [p,) rhs, tag end
ctxt if. u( java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
;
val (nameletval( ( )decode_case u
fun |decode_case( asAbs) t
(_ ),):)(] java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
|mku:java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6 letval col0 = map (fn
(case ( apfstname_of( ))f
let val rowsjava.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Range [11, 8) out of bounds for length 27 valstrip_abs_vars
| (Const | SOME (Const
(case v fs ysjava.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
ap( java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
| SOME (case_comb, letvalu=fold_revTermabs strip_abs_body t)java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60 val pty = body_type cT; ' Tdeclare_free_names us; val nrows = maps (expand constructors used' pty) val = fold_rev Term.abs ys strip_abs_body t);
subproblems= partition usedconstructors ptyrange_ty val (pat_rect, dtrees) =
split_list (map (fn {new_formals, group,letval = length sjava.lang.StringIndexOutOfBoundsException: Range [15, 13) out of bounds for length 39
mk (new_formals @ us) group) subproblems); valcase_functions
( ,body,falseAListmap_defaultop,(ons)
d_rev xas(),s=t>
Abs (if s = ""then name else s, T, abstract_over (x, t)))
~names)
subproblems dtrees;
fastype_of case_functions@ [[]; val case_const = Const (name_of case_comb |> the fun count_cases val list_comb(, @ []java.lang.StringIndexOutOfBoundsException: Index 78 out of bounds for length 78 inflat pat_rect end funmk_case(,java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 17 raiseCASE_ERROR(Notadatatype"^ Syntaxstring_of_term ctxt end
| __=( )=java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35 in ;
(*Repeated variable occurrences in a pattern are not allowed.*) fun = fold_aterms
(fn x as Free (s, _) =>
( xs=java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
f x
case_error (quote s ^ " occurs repeatedly in the pattern " ^
string_of_termrm ctxt )) else x :: xs)
_= )pat [java.lang.StringIndexOutOfBoundsException: Range [19, 16) out of bounds for length 28
make_case ctxtconfigusedxclauses= let fun string_of_clause (pat, rhs) =
Syntax.unparse_term ctxt
syntax_const>\open_close,
Syntax.uncheck_terms ctxt [pat, rhs])( count_casescases [);
|> Pretty.string_of;
java.lang.StringIndexOutOfBoundsException: Range [7, 4) out of bounds for length 52 val rows = map_index Namevariantjava.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
=
(case distinctop=)map( o (case distinct (op =) (map (fastype_of o snd) clauses
[] => case_error "no(casejava.lang.StringIndexOutOfBoundsException: Range [34, 33) out of bounds for length 74
java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 16
| _ => case_error "all cases =java.lang.StringIndexOutOfBoundsException: Range [45, 39) out of bounds for length 74 val' == add_row_usedrows ; val (tags, case_tm) =
ctxt' [xcase cases handle |default ): cs: =
case_error
(msg ^ (if i elseififlength cs= java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72 val _ =
(case subtract (op =) tagsend
[= )
| is => if config = Quiet then ()
java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14 then case_errorelse warning (*FIXME lack of syntactic context!?*))
("java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
cat_lines \\opencase_abscloseU -T ->T . end) in letval(. [java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
(* term check *)
fun (C(^><case_consclose - )- S- ) > ->)$
l s,java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 in Free recurjava.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 38
| decode_clause (Const (\<^const_name>\<open>case_elem\< <java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 91
(subst_bounds (xs, t) in
| decode_clause _ _ _ Const \<^const_name> encode_clauserecurT p $encode_casesrecurS T ps;
fun <^term\<java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
|decode_cases
| decode_cases
fun check_case ctxt case d Namebuild_context Termdeclare_free_names pat)rhs let
( (<onst_name\>\close,) $ =
make_case ctxt (if\ Term( (p )exp) java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
Name.context
|java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
| decode_case ( case dest_case Namebuild_context (.declare_free_names ubst_freeexp' patrhs))) letval (v, t') = Term.dest_abs_global
ermabsfree v (ecode_case 'java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
tSx )>SOMEx,mapsstrip_case ctxt ) in
java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19 endrip_case_full t=
(casedest_case ctxt
(* Pretty printing of nested case expressions *) ('ctxt d) ( (fn pat', hsjava.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
fun dest_case(dest_casectxtNamecontextt java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
( apfstname_of ( )java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
d = let
a (,let(). java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51 fun strip_abs i t = let
= strip_abs_vars val j = length zs;
java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 26 ifthenzs @ map (pair "x")| _ >
t= valinTerm .getctxtshow_cases
xs' mapFree(Name.variant_names(Term.declare_free_names u used) ; val (xs1, xs2) = java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
xs1 u)x) java.lang.StringIndexOutOfBoundsException: Index 67 out of bounds for length 67 funis_dependent let k=length( )- in>can strip_case_full ctxt java.lang.StringIndexOutOfBoundsException: Range [79, 0) out of bounds for length 0
_,java.lang.StringIndexOutOfBoundsException: Range [35, 32) out of bounds for length 40
|count_cases(,(,body,java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 funval=. java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46 fun mk_case (c, java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9 val get_info = lookup_by_case ctxt; in
(case get_info cname of
OME(_ ) => if length fs = length constructors then let val R = fastype_of x; val cases = map (fn (Const (s, U), t) => let
Us= binder_types U; val k = length Us; val p as (xs, _) = strip_abs k t;
java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
( [Pretty xname externtype_space name; end) (constructors ~~ fs); val cases' =
sort (int_ord markup =Name_Space name
java.lang.StringIndexOutOfBoundsException: Range [30, 29) out of bounds for length 52 val dummy = thenTermR else Free (Name.variant "x" . Pretty(,xname Prettystr"",
java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
SOME (x, map Prettycommas( ));
(case find_first (is_undefined o fst) cases' of
SOME (_, cs) => if length cs = length constructors then [hd cases] else filter_out java.lang.StringIndexOutOfBoundsException: Index 86 out of bounds for length 86
|NONE
(caseend
[] => cases
| (default, Outer_Syntax.command \end; if length cs = 1 then cases iflengthcs lengthconstructorsthen
[hd cases, (dummy, ([], default), Scan.ucceed(Toplevel. ( o Toplevel.)))) elseendjava.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4
filter_out (fn (c, _, _) => member op aconv cs c) cases @
[(dummy, ([], default), false)]))) end else NONE
| _ => NONE) end
| _ => NONE);
(* destruct nested patterns *)
fun encode_clause recur S T (pat, rhs) =
fold (fn x as (_, U) => fn t => letval T = fastype_of t; inConst (\<^const_name>\<open>case_abs\<close>, (U --> T) --> T) $ Term.absfree x t end)
(Term.add_frees pat [])
(Const (\<^const_name>\<open>case_elem\<close>, S --> T --> S --> T) $ pat $ recur rhs);
fun encode_cases _ S T [] = Const (\<^const_name>\<open>case_nil\<close>, S --> T)
| encode_cases recur S T (p :: ps) = Const (\<^const_name>\<open>case_cons\<close>, (S --> T) --> (S --> T) --> S --> T) $
encode_clause recur S T p $ encode_cases recur S T ps;
fun encode_case recur (t, ps as (pat, rhs) :: _) = let val tT = fastype_of t; val T = fastype_of rhs; in Const (\<^const_name>\<open>case_guard\<close>, \<^typ>\<open>bool\<close> --> tT --> (tT --> T) --> T) $
\<^term>\<open>True\<close> $ t $ (encode_cases recur (fastype_of pat) (fastype_of rhs) ps) end
| encode_case _ _ = case_error "encode_case";
fun strip_case' ctxt d (pat, rhs) =
(case dest_case ctxt d (Name.build_context (Term.declare_free_names pat)) rhs of
SOME (exp as Free _, clauses) => if Term.exists_subterm (curry (op aconv) exp) pat andalso not (exists (fn (_, rhs') =>
Term.exists_subterm (curry (op aconv) exp) rhs') clauses) then
maps (strip_case' ctxt d) (map (fn (pat', rhs') =>
(subst_free [(exp, pat')] pat, rhs')) clauses) else [(pat, rhs)]
| _ => [(pat, rhs)]);
fun strip_case ctxt d t =
(case dest_case ctxt d Name.context t of
SOME (x, clauses) => SOME (x, maps (strip_case' ctxt d) clauses)
| NONE => NONE);
fun strip_case_full ctxt d t =
(case dest_case ctxt d Name.context t of
SOME (x, clauses) =>
encode_case (strip_case_full ctxt d)
(strip_case_full ctxt d x, maps (strip_case' ctxt d) clauses)
| NONE =>
(case t of
t $ u => strip_case_full ctxt d t $ strip_case_full ctxt d u
| Abs _ => letval (v, t') = Term.dest_abs_global t; in Term.absfree v (strip_case_full ctxt d t') end
| _ => t));
(* term uncheck *)
val show_cases = Attrib.setup_config_bool \<^binding>\<open>show_cases\<close> (K true);
fun uncheck_case ctxt ts = if Config.get ctxt show_cases thenmap (fn t => if can Term.type_of t then strip_case_full ctxt true t else t) ts else ts;
val _ = Context.>> (Syntax_Phases.term_uncheck 1 "case" uncheck_case);
(* outer syntax commands *)
fun print_case_translations ctxt = let val cases = map snd (Symtab.dest (cases_of ctxt)); val type_space = Proof_Context.type_space ctxt;
val pretty_term = Syntax.pretty_term ctxt;
fun pretty_data (data as (comb, ctrs)) = let val name = Tname_of_data data; val xname = Name_Space.extern ctxt type_space name; val markup = Name_Space.markup type_space name; val prt =
(Pretty.block o Pretty.fbreaks)
[Pretty.block [Pretty.mark_str (markup, xname), Pretty.str ":"],
Pretty.block [Pretty.str "combinator:", Pretty.brk 1, pretty_term comb],
Pretty.block (Pretty.str "constructors:" :: Pretty.brk 1 ::
Pretty.commas (map pretty_term ctrs))]; in (xname, prt) end; in
Pretty.big_list "case translations:" (map #2 (sort_by #1 (map pretty_data cases)))
|> Pretty.writeln end;
val _ =
Outer_Syntax.command \<^command_keyword>\<open>print_case_translations\<close> "print registered case combinators and constructors"
(Scan.succeed (Toplevel.keep (print_case_translations o Toplevel.context_of)))
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.