print_translation\<open> let fundest_LAM_(Const(\<^const_syntax>\<open>Rep_cfun\<close>,_)$Const(\<^const_syntax>\<open>unit_when\<close>,_)$t)= (Syntax.const\<^syntax_const>\<open>_noargs\<close>,t) |dest_LAMctxt(Const(\<^const_syntax>\<open>Rep_cfun\<close>,_)$Const(\<^const_syntax>\<open>csplit\<close>,_)$t)= let val(v1,t1)=dest_LAMctxtt; val(v2,t2)=dest_LAMctxtt1; in(Syntax.const\<^syntax_const>\<open>_args\<close>$v1$v2,t2)end |dest_LAMctxt(Const(\<^const_syntax>\<open>Abs_cfun\<close>,_)$t)= let valabs= casetofAbsabs=>abs |_=>("x",dummyT,incr_boundvars1t$Bound0); val(x,t')=Syntax_Trans.atomic_abs_tr'ctxtabs; in(Syntax.const\<^syntax_const>\<open>_variable\<close>$x,t')end
| dest_LAM _ _ = raise Match; (* too few vars: abort translation *)
fun Case1_tr' ctxt [Const(🍋‹branch›,_) $ p, r] = let val (v, t) = dest_LAM ctxt r in Syntax.const 🍋‹_Case1› $
(Syntax.const 🍋‹_match› $ p $ v) $ t end;
in [(🍋‹Rep_cfun›, Case1_tr')] end ›
translations "x" <= "_match (CONST succeed) (_variable x)"
subsection‹Pattern combinators for data constructors›
fundefine_consts (specs:(binding*term*mixfix)list) (thy:theory) :(termlist*thmlist)*theory= let funmk_decl(b,t,mx)=(b,fastype_oft,mx); valdecls=mapmk_declspecs; valthy=Cont_Consts.add_constsdeclsthy; funmk_const(b,T,mx)=Const(Sign.full_namethyb,T); valconsts=mapmk_constdecls; funmk_defc(b,t,mx)= (Thm.def_bindingb,Logic.mk_equals(c,t)); valdefs=map2mk_defconstsspecs; val(def_thms,thy)=fold_mapGlobal_Theory.add_defdefsthy; in ((consts,def_thms),thy) end;
funprove (thy:theory) (defs:thmlist) (goal:term) (tacs:{prems:thmlist,context:Proof.context}->tacticlist) :thm= let funtac{prems,context}= rewrite_goals_taccontextdefsTHEN EVERY(tacs{prems=map(rewrite_rulecontextdefs)prems,context=context}) in Goal.prove_globalthy[][]goaltac end;
funget_vars_avoiding (taken:stringlist) (args:(bool*typ)list) :(termlist*termlist)= let valTs=mapsndargs; valns=Name.variant_listtaken(Case_Translation.make_tnamesTs); valvs=mapFree(ns~~Ts); valnonlazy=mapsnd(filter_out(fstofst)(args~~vs)); in (vs,nonlazy) end;
(******************************************************************************) (************** definitions and theorems for pattern combinators **************) (******************************************************************************)
(* utility functions *) fun mk_pair_pat (p1, p2) = let
val T1 = fastype_of p1;
val T2 = fastype_of p2;
val (U1, V1) = apsnd dest_matchT (dest_cfunT T1);
val (U2, V2) = apsnd dest_matchT (dest_cfunT T2);
val pat_typ = [T1, T2] --->
(mk_prodT (U1, U2) ->> mk_matchT (mk_prodT (V1, V2)));
val pat_const = Const (🍋‹cpair_pat›, pat_typ); in
pat_const $ p1 $ p2 end; fun mk_tuple_pat [] = succeed_const 🍋‹unit›
| mk_tuple_pat ps = foldr1 mk_pair_pat ps;
(* define pattern combinators *) local
val tns = map (fst o dest_TFree) (dest_Type_args lhsT);
fun pat_eqn (i, (bind, (con, args))) : binding * term * mixfix = let
val pat_bind = Binding.suffix_name "_pat" bind;
val Ts = map snd args;
val Vs =
(map (K "'t") args)
|> Case_Translation.indexify_names
|> Name.variant_list tns
|> map (fn t => TFree (t, 🍋‹pcpo›));
val patNs = Case_Translation.indexify_names (map (K "pat") args);
val patTs = map2 (fn T => fn V => T ->> mk_matchT V) Ts Vs;
val pats = map Free (patNs ~~ patTs);
val fail = mk_fail (mk_tupleT Vs);
val (vs, nonlazy) = get_vars_avoiding patNs args;
val rhs = big_lambdas vs (mk_tuple_pat pats ` mk_tuple vs); fun one_fun (j, (_, args')) = let
val (vs', nonlazy) = get_vars_avoiding patNs args'; inif i = j then rhs else big_lambdas vs' fail end;
val funs = map_index one_fun spec;
val body = list_ccomb (case_const (mk_matchT (mk_tupleT Vs)), funs); in
(pat_bind, lambdas pats body, NoSyn) end; in
val ((pat_consts, pat_defs), thy) =
define_consts (map_index pat_eqn (bindings ~~ spec)) thy end;
(* syntax translations for pattern combinators *) local funsyntax c = Lexicon.mark_const (dest_Const_name c); fun app s (l, r) = Ast.mk_appl (Ast.Constant s) [l, r];
val capp = app 🍋‹Rep_cfun›;
val capps = Library.foldl capp
fun app_var x = Ast.mk_appl (Ast.Constant "_variable") [x, Ast.Variable "rhs"]; fun app_pat x = Ast.mk_appl (Ast.Constant "_pat") [x]; fun args_list [] = Ast.Constant "_noargs"
| args_list xs = foldr1 (app "_args") xs; fun one_case_trans (pat, (con, args)) = let
val cname = Ast.Constant (syntax con);
val pname = Ast.Constant (syntax pat);
val ns = 1 upto length args;
val xs = map (fn n => Ast.Variable ("x"^(string_of_int n))) ns;
val ps = map (fn n => Ast.Variable ("p"^(string_of_int n))) ns;
val vs = map (fn n => Ast.Variable ("v"^(string_of_int n))) ns; in
[Syntax.Parse_Rule (app_pat (capps (cname, xs)),
Ast.mk_appl pname (map app_pat xs)), Syntax.Parse_Rule (app_var (capps (cname, xs)),
app_var (args_list xs)), Syntax.Print_Rule (capps (cname, ListPair.map (app "_match") (ps,vs)),
app "_match" (Ast.mk_appl pname ps, args_list vs))] end;
val trans_rules : Ast.ast Syntax.trrule list =
maps one_case_trans (pat_consts ~~ spec); in
val thy = Sign.translations_global true trans_rules thy; end;
(* prove strictness and reduction rules of pattern combinators *) local
val tns = map (fst o dest_TFree) (dest_Type_args lhsT);
val rn = singleton (Name.variant_list tns) "'r";
val R = TFree (rn, 🍋‹pcpo›); fun pat_lhs (pat, args) = let
val Ts = map snd args;
val Vs =
(map (K "'t") args)
|> Case_Translation.indexify_names
|> Name.variant_list (rn::tns)
|> map (fn t => TFree (t, 🍋‹pcpo›));
val patNs = Case_Translation.indexify_names (map (K "pat") args);
val patTs = map2 (fn T => fn V => T ->> mk_matchT V) Ts Vs;
val pats = map Free (patNs ~~ patTs);
val k = Free ("rhs", mk_tupleT Vs ->> R);
val branch1 = 🍋‹branch lhsT ‹mk_tupleT Vs› R›;
val fun1 = (branch1 $ list_comb (pat, pats)) ` k;
val branch2 = 🍋‹branch ‹mk_tupleT Ts›‹mk_tupleT Vs› R›;
val fun2 = (branch2 $ mk_tuple_pat pats) ` k;
val taken = "rhs" :: patNs; in (fun1, fun2, taken) end; fun pat_strict (pat, (con, args)) = let
val (fun1, fun2, taken) = pat_lhs (pat, args);
val defs = @{thm branch_def} :: pat_defs;
val goal = mk_trp (mk_strict fun1);
val rules = @{thms match_bind_simps} @ case_rews; fun tacs ctxt = [simp_tac (put_simpset beta_ss ctxt addsimps rules) 1]; in prove thy defs goal (tacs o #context) end; fun pat_apps (i, (pat, (con, args))) = let
val (fun1, fun2, taken) = pat_lhs (pat, args); fun pat_app (j, (con', args')) = let
val (vs, nonlazy) = get_vars_avoiding taken args';
val con_app = list_ccomb (con', vs);
val assms = map (mk_trp o mk_defined) nonlazy;
val rhs = if i = j then fun2 ` mk_tuple vs else mk_fail R;
val concl = mk_trp (mk_eq (fun1 ` con_app, rhs));
val goal = Logic.list_implies (assms, concl);
val defs = @{thm branch_def} :: pat_defs;
val rules = @{thms match_bind_simps} @ case_rews; fun tacs ctxt = [asm_simp_tac (put_simpset beta_ss ctxt addsimps rules) 1]; in prove thy defs goal (tacs o #context) end; in map_index pat_app spec end; in
val pat_stricts = map pat_strict (pat_consts ~~ spec);
val pat_apps = flat (map_index pat_apps (pat_consts ~~ spec)); end;
(*defineandprovetheoremsforpatterncombinators*) val(pat_thms:thmlist,thy:theory)= let valbindings=map#1spec; funprep_arg(lazy,sel,T)=(lazy,T); funprep_conc(b,args,mx)=(c,mapprep_argargs); valpat_spec=map2prep_concon_constsspec; in add_pattern_combinatorsbindingspat_speclhsT exhaustcase_constcasesthy end
*)
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.23 Sekunden
(vorverarbeitet am 2026-06-10)
¤
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.