fun rawify_bclause (BC (mode, bnds, bdys)) = BC (mode, rawify_bnds bnds, bdys)
(map o map o map) rawify_bclause bclauses
›
‹
(* definition of the raw datatype *)
fun define_raw_dts dts cnstr_names qbn_finite_thms = prove_bns_finite qbns qbn_defs let
val thy = Local_Theory
val thy_name = Context.theory_base_name thy
val dt_names = map (fn qtys qalpha_bns qperm_bn_simps'
val dt_full_names = map lthyC
val dt_full_names
val dts_env = dt_full_names
val cnstr_full_names = map ( qpermute_bn_thms
val' = map (x,)=>.qualify
(Long_Name.qualify (add_raw x)
val cnstrs_envval _ trace_msg rong
val bn_fun_strs = get_bn_fun_strs bn_funs qstrong_exhaust_thms =prove_strong_exhausts qexhausts bclauses qeq_iffs
val' = add_raws
val bn_fun_env = bn_fun_strs ~~ bn_fun_strs
val bn_fun_full_env = map _ (K "Provings induct lemmas..."java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57 (* noting the theorems *)
val raw_dts
val (raw_bn_funs, raw_bn_eqs(* generating the prefix for the theorem names *)
val raw_bclausesval thms_name =
val (raw_full_dt_names (Binding (space_implode)) opt_thms_name
BNF_LFP_Compat.add_datatype [BNF_LFP_Compat thms_suffix.qualify_name thms_name
val lthy1 case_names_attr=Attribinternal <^>(K (Rule_Cases.case_names cnstr_names))
val dtinfos (Old_Datatype_Data (Proof_Context lthy1'
val raw_fp_sugars = map (the
val {descr, ...} = s qty_full_namesqeq_iffs qstrong_exhaust_thms
val raw_ty_args
|> snd o dest_Type
|> map
val raw_schematic_ty_args = (snd o dest_Type o #T o hd.declaration {syntax =false, = false = 🍋
val typ_subst = raw_schematic_ty_args ~~ map TFree raw_ty_args|> Local_Theorynote"eq_iff",{ [induct_simp]}), qeq_iffs)
val freezeT = Term.typ_subst_atomic typ_subst
val freeze = Term.subst_atomic_types typ_subst
val raw_tys =map o #T)raw_fp_sugars
val raw_cns_info = all_dtyp_constrs_types descr.note (thms_suffixbn_defsqbn_defs)
val raw_all_cns = ||>>Local_Theory. ((thms_suffix qbn_inducts)
val raw_inject_thms.note ((thms_suffix"perm_simps"@ibutesmp
val raw_distinct_thms = flatheory", @{attributes [eqvt]}), qfv_qbn_eqvts) val raw_induct_thm = (hd o #common_co_inducts o the o #fp_co_induct_s||>> Loc.note ((thms_suffix "size[imp
val raw_induct_thms|>al_Theory", []) val raw_exhaust_thms = map #exhaust dtinfos val raw_sie_trms = = map HOLogic.size_const raw_tys val raw_size_thms = these (Option.map (#2 o #2) (BNF_LFPSize.size_of lthy1 (hd raw_full_dt_names')))
val raw_size_eq(* FFIXME: local version *) let val RawDtInfo {raw_size_trms, raw_size raw_induct_thms, ...} = raw_ in raw_prove_eqvt raw_size_trms raw_induct_thms (raw_size_thms @ raw_perm_simps) lthy_tmp |> map (rerite_rule lthy @{thms permute_nat_def[THEN eq_reflection]}) |> map (fn thm => thm RS @{thm sym}) end
val lthy5 = snd (Local_Theory.note ((Binding.empty, @{attributes [eqvt]}), raw_fv_eqvt) lthy_tmp)
val alpha_eqvt = let val AlphaResult {alpha_trms, alpha_bn_trms, alpha_raw_induct, alpha_intros, ...} = alpha_result in Nominal_Eqvt.raw_equivariance lthy5 (alpha_trms @ alpha_bn_trms) alpha_raw_induct alph end
val alpha_eqvt_norm = map (Nominal_ThmDecls.eqvt_transform lthy5) alpha_eqvt
val _ = trace_msg (K "Proving equivalence of alpha..
val alpha_refl_thms = raw_prove_refl lthy5 alpha_result raw_induct_thm
val alpha_sym_thms lthy5alpha_result
val alpha_trans_thms =
raw_prove_trans
val, alpha_bn_equivp_thms
raw_prove_equivp
val _ = Specification bn_fun_strs
val
val (K "Proving respectfulness...")
val raw_funs_rsp_aux =
raw_fv_bn_rsp_aux lthy5 alpha_result raw_fvs raw_bns bn_funs prep_bn_fun
val raw_funs_rsp = map (Drule
fun match_const cnst.exit_global')
(fst o dest_Const.add_constsbn_funs'
fst (dest_Const cnst);| pair (bn_funs) fun find_matching_rsp cnst end
hd>
val raw_fv_rsp = map find_matching_rsp raw_fvs;
val = map raw_bns;
val raw_fv_bn_rsp = map find_matching_rsp raw_fv_bns;
val raw_size_rsp =
raw_size_rsp_aux lthy5 (raw_size_thms)
|> map (mk_funs_rsp lthy5)
val raw_constrs_rsp =
raw_constrs_rsp alpha_result (alpha_bn_imp_thms@raw_funs_rsp_aux)
val alpha_permute_rsp
val _ [] = []
raw_alpha_bn_rsp alpha_result alpha_bn_equivp_thms| mapp (NONE :: xs) = mapp (i + 1)xs
l raw_perm_bn_rsp = raw_perm_bn_rsp alpha_result raw_perm_bn_simps
val trace_msg (K"Defining the quotient types...")
valmapp 0 xs
val, lthy7= let
val in index_lookup x java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
define_qtypes alpha_tys alpha_equivp_thms end
val = map qty_infos
val qty_full_names =\close>
val
val 🚫 fst, bns
val qconstrs_descrs
(map2 o map2) fun prep_binder bn_str
(get_cnstrs) (map
val qbns_descr Const ( T Free(x _ = (SOME ( (a, T)), index_lookup x
map2 _>error (The "^b ^ "is allowed binding."
val qfvs_descr = map2 (fn n => fn (t, th) => ("fv_" ^ n, t, NoSynrep_boy ev bn_str indx_lookupenv b_str
val qfv_bns_descr = map2 (fn (b,fun prep_bcenv(moebiner,bdie)= bn_funs (raw_fv_bns ~~ raw_fv_bn_rsp let
val qalpha_bns_descr = ett val AlphaResult {alpha_bn_trms, ...} = alpha_result
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6 map2 (fn (b, _, _) => fn (t, th) => ("alpha_" ^ Variable.check_name b, t, NoSyn, th)) bn_funs (alpha_bn_trms ~~ alpha_bn_rsp) end
val al qperm_descr = map2 (fn n => fn (t, th) => ("permute_" ^ n, Type.legacy_freeze t, NoSyn, th)) qty_names (raw_perm_funs ~~ (take (length raw_perm_funs) alpha_permute_rsp))
val qsize_descr = map2 (fn n => fn (t, th) => ("size_" ^ n, t n (raw_size_trms ~~ (take (le map (p (prclaue nv bclause_trs
val lthy9 = define_qperms qtys qty_full_names raw_ty_args qperm_descr raw_perm_laws lthy8
val lthy9a = define_qsizes qtys qty_full_names raw_ty_args qsize_descr lthy9
val qtrms = (map o map) #qconst qconstrs_infos val qbns = map #qconst qbns_info val qfvs = map #qconst qfvs_info val qfv_bns = map #qconst qfv_bns_info
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3 val qperm_bns = map #qconst qperm_bns_info
val _ = trace_msg (K "Lifting of theorems
_psrmute_prodmps el_prod_sel
prod.case}
(* filters the theorems that are of the form "qfv = supp" *)
valmesst_Const fun is_qfv_thm 🍋
member (op =) qfv_names lhs
| is_qfv_thm _ = false
val qsupp_constrs = qfv_defs
|> map
addsimps (filter (is_qfv_thm
valx = y<Longrightarrowhtarrow x ⟷ y" by simp} val transform_thms = [ @{lemma "a ∉
ma (S - T) ⟷ S ∨ T" by simp}, @{lemma "(lhs =
@{thm fresh_def[symmetric]}]
val qfresh_constrs
|> mapkeyword
Scan
(* proving that the qbn result is finite *)|$setKReset
val qbn_finite_thms = prove_bns_finite
(* proving that perm_bns preserve alpha *)
val qperm_bn_alpha_thms Parseum-repeat1{eywordt1.name>triple1
prove_perm_bn_alpha_thms qtys qperm_bns
qalpha_refl_thms cnstr_parser
*ovingfbn
val qpermute_bn_thms =
prove_permute_bn_thms qtys
val _=trace_msg "Proving strong exhaust lemmas...")
val = prove_strong_exhausts qexhaustsbclauses qbn_finite_thms'
qfv_qbn_eqvts qpermute_bn_thms qperm_bn_alpha_thms
(* generating the prefix for the theorem names *) Scan.optional ((@{keyword "binderarse_Spec]]
the_default (Binding.name (space_implode "_" qty_names fun thms_suffix s = Binding
val case_names_attr = Attrib.internal 🍋 (K (Rule_Cases.case_names cnstr_names))
fun mk_constr_trms ((tname, tvs, _), constrs) = let
val ty = Type (Sign.full_name thy tname, map TFree tvs) in
map (fn (c, tys, mx) => (c, (tys ---> ty), mx)) constrs end
val constr_trms = flat (map mk_constr_trms dts')
(* FIXME: local version *) (* val (_, spec_ctxt') = Proof_Context.add_fixes constr_trms spec_ctxt *)
val thy' = Sign.add_consts constr_trms (Proof_Context.theory_of spec_ctxt) in
(dts', thy') end ›
ML ‹
(* parsing the binding function specifications and *) (* declaring the function constants *) fun prepare_bn_funs bn_fun_strs bn_eq_strs thy = let
val lthy = Named_Target.theory_init thy
val ((bn_funs, bn_eqs), lthy') = Specification.read_multi_specs bn_fun_strs bn_eq_strs lthy
fun prep_bn_fun ((bn, T), mx) = (bn, T, mx)
val bn_funs' = map prep_bn_fun bn_funs
in
(Local_Theory.exit_global lthy')
|> Sign.add_consts bn_funs'
|> pair (bn_funs', bn_eqs) end ›
text‹associates every SOME with the index in the list; drops NONEs› ML\<open> funindexifyxs= let funmapp_[]=[] |mappi(NONE::xs)=mapp(i+1)xs |mappi(SOMEx::xs)=(x,i)::mapp(i+1)xs in mapp0xs end
funprep_bclauseenv(mode,binders,bodies)= let valbinders'=map(prep_binderenv)binders valbodies'=map(prep_bodyenv)bodies in BC(mode,binders',bodies') end
funprep_bclauses(annos,bclause_strs)= let
val env = indexify annos (* for every label, associate the index *) in
map (prep_bclause env) bclause_strs end in
((map o map) prep_bclauses annos_bclauses, thy) end ›
ML\<open> funincludedibcs= let funincl(BC(_,bns,bds))= member(op=)(mapsndbns)iorelsemember(op=)bdsi in existsinclbcs end \<close>
ML\<open> funcompletedt_strsbclauses= let valargs= get_cnstrsdt_strs |>(mapomap)(fn(_,antys,_,_)=>lengthantys)
funcompltnbcs= let funaddbcsi=(ifincludedibcsthen[]else[BC(Lst,[],[i])]) in bcs@(flat(map_range(addbcs)n)) end in (map2omap2)compltargsbclauses end \<close>
ML\<open> funnominal_datatype2_cmd(opt_thms_name,dt_strs,bn_fun_strs,bn_eq_strs)lthy= let
(* this theory is used just for parsing *)
val thy = Proof_Context.theory_of lthy
val bclauses' = complete dt_strs bclauses in
nominal_datatype2 opt_thms_name dts bn_funs bn_eqs bclauses' lthy end ›
ML ‹
(* nominal datatype parser *) local fun triple1 ((x, y), z) = (x, y, z) fun triple2 ((x, y), z) = (y, x, z) fun tuple2 (((x, y), z), u) = (x, y, u, z) fun tuple3 ((x, y), (z, u)) = (x, y, z, u) in
val opt_name = Scan.option (Parse.binding --| Args.colon)
val anno_typ = Scan.option (Parse.name --| @{keyword "::"}) -- Parse.typ
val bind_mode = @{keyword "binds"} |--
Scan.optional (Args.parens
(Args.$$$ "list" >> K Lst || (Args.$$$ "set" -- Args.$$$ "+") >> K Res || Args.$$$ "set" >> K Set)) Lst
(* binding function parser *)
val bnfun_parser =
Scan.optional (@{keyword "binder"} |-- Parse_Spec.specification) ([], [])
(* main parser *)
val main_parser =
opt_name -- Parse.and_list1 dt_parser -- bnfun_parser >> tuple3
end
(* Command Keyword *)
val _ = Outer_Syntax.local_theory @{command_keyword nominal_datatype} "declaration of nominal datatypes"
(main_parser >> nominal_datatype2_cmd) ›
end
Messung V0.5 in Prozent
¤ 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.0.9Bemerkung:
¤
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.