198 end |
198 end |
199 |
199 |
200 *} |
200 *} |
201 |
201 |
202 ML {* |
202 ML {* |
203 fun define_raw_dts dts bn_funs bn_eqs binds lthy = |
203 fun define_raw_dts dts bn_funs bn_eqs bclauses lthy = |
204 let |
204 let |
205 val thy = Local_Theory.exit_global lthy |
205 val thy = Local_Theory.exit_global lthy |
206 val thy_name = Context.theory_name thy |
206 val thy_name = Context.theory_name thy |
207 |
207 |
208 val dt_names = map (fn (_, s, _, _) => Binding.name_of s) dts |
208 val dt_names = map (fn (_, s, _, _) => Binding.name_of s) dts |
223 val bn_fun_full_env = map (pairself (Long_Name.qualify thy_name)) |
223 val bn_fun_full_env = map (pairself (Long_Name.qualify thy_name)) |
224 (bn_fun_strs ~~ bn_fun_strs') |
224 (bn_fun_strs ~~ bn_fun_strs') |
225 |
225 |
226 val (raw_dt_names, raw_dts) = rawify_dts dt_names dts dts_env |
226 val (raw_dt_names, raw_dts) = rawify_dts dt_names dts dts_env |
227 val (raw_bn_funs, raw_bn_eqs) = rawify_bn_funs dts_env cnstrs_env bn_fun_env bn_funs bn_eqs |
227 val (raw_bn_funs, raw_bn_eqs) = rawify_bn_funs dts_env cnstrs_env bn_fun_env bn_funs bn_eqs |
228 val raw_bclauses = rawify_bclauses dts_env cnstrs_env bn_fun_full_env binds |
228 val raw_bclauses = rawify_bclauses dts_env cnstrs_env bn_fun_full_env bclauses |
229 |
229 |
230 val (raw_dt_full_names, thy1) = |
230 val (raw_dt_full_names, thy1) = |
231 Datatype.add_datatype Datatype.default_config raw_dt_names raw_dts thy |
231 Datatype.add_datatype Datatype.default_config raw_dt_names raw_dts thy |
232 |
232 |
233 val lthy1 = Named_Target.theory_init thy1 |
233 val lthy1 = Named_Target.theory_init thy1 |
256 val (raw_dt_names, raw_dts, raw_bclauses, raw_bn_funs, raw_bn_eqs, lthy0) = |
256 val (raw_dt_names, raw_dts, raw_bclauses, raw_bn_funs, raw_bn_eqs, lthy0) = |
257 if get_STEPS lthy > 0 |
257 if get_STEPS lthy > 0 |
258 then define_raw_dts dts bn_funs bn_eqs bclauses lthy |
258 then define_raw_dts dts bn_funs bn_eqs bclauses lthy |
259 else raise TEST lthy |
259 else raise TEST lthy |
260 |
260 |
|
261 val _ = tracing ("raw_bclauses\n" ^ cat_lines (map @{make_string} raw_bclauses)) |
|
262 |
261 val dtinfo = Datatype.the_info (ProofContext.theory_of lthy0) (hd raw_dt_names) |
263 val dtinfo = Datatype.the_info (ProofContext.theory_of lthy0) (hd raw_dt_names) |
262 val {descr, sorts, ...} = dtinfo |
264 val {descr, sorts, ...} = dtinfo |
263 |
265 |
264 val raw_tys = all_dtyps descr sorts |
266 val raw_tys = all_dtyps descr sorts |
265 val raw_full_ty_names = map (fst o dest_Type) raw_tys |
267 val raw_full_ty_names = map (fst o dest_Type) raw_tys |
268 |> map dest_TFree |
270 |> map dest_TFree |
269 |
271 |
270 val dtinfos = map (Datatype.the_info (ProofContext.theory_of lthy0)) raw_full_ty_names |
272 val dtinfos = map (Datatype.the_info (ProofContext.theory_of lthy0)) raw_full_ty_names |
271 |
273 |
272 val raw_cns_info = all_dtyp_constrs_types descr sorts |
274 val raw_cns_info = all_dtyp_constrs_types descr sorts |
273 val raw_constrs = flat (map (map (fn (c, _, _, _) => c)) raw_cns_info) |
275 val raw_constrs = map (map (fn (c, _, _, _) => c)) raw_cns_info |
274 |
276 |
275 val raw_inject_thms = flat (map #inject dtinfos) |
277 val raw_inject_thms = flat (map #inject dtinfos) |
276 val raw_distinct_thms = flat (map #distinct dtinfos) |
278 val raw_distinct_thms = flat (map #distinct dtinfos) |
277 val raw_induct_thm = #induct dtinfo |
279 val raw_induct_thm = #induct dtinfo |
278 val raw_induct_thms = #inducts dtinfo |
280 val raw_induct_thms = #inducts dtinfo |
284 |
286 |
285 (* definitions of raw permutations by primitive recursion *) |
287 (* definitions of raw permutations by primitive recursion *) |
286 val _ = warning "Definition of raw permutations"; |
288 val _ = warning "Definition of raw permutations"; |
287 val ((raw_perm_funs, raw_perm_simps, raw_perm_laws), lthy2a) = |
289 val ((raw_perm_funs, raw_perm_simps, raw_perm_laws), lthy2a) = |
288 if get_STEPS lthy0 > 0 |
290 if get_STEPS lthy0 > 0 |
289 then define_raw_perms raw_full_ty_names raw_tys tvs raw_constrs raw_induct_thm lthy0 |
291 then define_raw_perms raw_full_ty_names raw_tys tvs (flat raw_constrs) raw_induct_thm lthy0 |
290 else raise TEST lthy0 |
292 else raise TEST lthy0 |
291 |
293 |
292 (* noting the raw permutations as eqvt theorems *) |
294 (* noting the raw permutations as eqvt theorems *) |
293 val (_, lthy3) = Local_Theory.note ((Binding.empty, [eqvt_attr]), raw_perm_simps) lthy2a |
295 val (_, lthy3) = Local_Theory.note ((Binding.empty, [eqvt_attr]), raw_perm_simps) lthy2a |
294 |
296 |
417 |> map mk_funs_rsp |
419 |> map mk_funs_rsp |
418 else raise TEST lthy6 |
420 else raise TEST lthy6 |
419 |
421 |
420 val raw_constrs_rsp = |
422 val raw_constrs_rsp = |
421 if get_STEPS lthy > 18 |
423 if get_STEPS lthy > 18 |
422 then raw_constrs_rsp raw_constrs alpha_trms alpha_intros |
424 then raw_constrs_rsp (flat raw_constrs) alpha_trms alpha_intros |
423 (alpha_bn_imp_thms @ raw_funs_rsp_aux) lthy6 |
425 (alpha_bn_imp_thms @ raw_funs_rsp_aux) lthy6 |
424 else raise TEST lthy6 |
426 else raise TEST lthy6 |
425 |
427 |
426 val alpha_permute_rsp = |
428 val alpha_permute_rsp = |
427 if get_STEPS lthy > 19 |
429 if get_STEPS lthy > 19 |
460 val qty_full_names = map (fst o dest_Type) qtys |
462 val qty_full_names = map (fst o dest_Type) qtys |
461 val qty_names = map Long_Name.base_name qty_full_names |
463 val qty_names = map Long_Name.base_name qty_full_names |
462 |
464 |
463 (* defining of quotient term-constructors, binding functions, free vars functions *) |
465 (* defining of quotient term-constructors, binding functions, free vars functions *) |
464 val _ = warning "Defining the quotient constants" |
466 val _ = warning "Defining the quotient constants" |
465 val qconstrs_descr = |
467 val qconstrs_descrs = |
466 flat (map (fn (_, _, _, cs) => map (fn (b, _, mx) => (Name.of_binding b, mx)) cs) dts) |
468 map2 (map2 (fn (b, _, mx) => fn t => (Name.of_binding b, t, mx))) (get_cnstrs dts) raw_constrs |
467 |> map2 (fn t => fn (b, mx) => (b, t, mx)) raw_constrs |
|
468 |
469 |
469 val qbns_descr = |
470 val qbns_descr = |
470 map2 (fn (b, _, mx) => fn t => (Name.of_binding b, t, mx)) bn_funs raw_bns |
471 map2 (fn (b, _, mx) => fn t => (Name.of_binding b, t, mx)) bn_funs raw_bns |
471 |
472 |
472 val qfvs_descr = |
473 val qfvs_descr = |
485 map2 (fn n => fn t => ("size_" ^ n, t, NoSyn)) qty_names raw_size_trms |
486 map2 (fn n => fn t => ("size_" ^ n, t, NoSyn)) qty_names raw_size_trms |
486 |
487 |
487 val qperm_bn_descr = |
488 val qperm_bn_descr = |
488 map2 (fn (b, _, _) => fn t => ("permute_" ^ Name.of_binding b, t, NoSyn)) bn_funs raw_perm_bns |
489 map2 (fn (b, _, _) => fn t => ("permute_" ^ Name.of_binding b, t, NoSyn)) bn_funs raw_perm_bns |
489 |
490 |
490 |
491 val ((((((qconstrs_infos, qbns_info), qfvs_info), qfv_bns_info), qalpha_bns_info), qperm_bns_info), |
491 val ((((((qconstrs_info, qbns_info), qfvs_info), qfv_bns_info), qalpha_bns_info), qperm_bns_info), lthy8)= |
492 lthy8) = |
492 if get_STEPS lthy > 24 |
493 if get_STEPS lthy > 24 |
493 then |
494 then |
494 lthy7 |
495 lthy7 |
495 |> define_qconsts qtys qconstrs_descr |
496 |> fold_map (define_qconsts qtys) qconstrs_descrs |
496 ||>> define_qconsts qtys qbns_descr |
497 ||>> define_qconsts qtys qbns_descr |
497 ||>> define_qconsts qtys qfvs_descr |
498 ||>> define_qconsts qtys qfvs_descr |
498 ||>> define_qconsts qtys qfv_bns_descr |
499 ||>> define_qconsts qtys qfv_bns_descr |
499 ||>> define_qconsts qtys qalpha_bns_descr |
500 ||>> define_qconsts qtys qalpha_bns_descr |
500 ||>> define_qconsts qtys qperm_bn_descr |
501 ||>> define_qconsts qtys qperm_bn_descr |
509 val lthy9a = |
510 val lthy9a = |
510 if get_STEPS lthy > 26 |
511 if get_STEPS lthy > 26 |
511 then define_qsizes qtys qty_full_names tvs qsize_descr lthy9 |
512 then define_qsizes qtys qty_full_names tvs qsize_descr lthy9 |
512 else raise TEST lthy9 |
513 else raise TEST lthy9 |
513 |
514 |
514 val qtrms = map #qconst qconstrs_info |
515 val qtrms = map (map #qconst) qconstrs_infos |
515 val qbns = map #qconst qbns_info |
516 val qbns = map #qconst qbns_info |
516 val qfvs = map #qconst qfvs_info |
517 val qfvs = map #qconst qfvs_info |
517 val qfv_bns = map #qconst qfv_bns_info |
518 val qfv_bns = map #qconst qfv_bns_info |
518 val qalpha_bns = map #qconst qalpha_bns_info |
519 val qalpha_bns = map #qconst qalpha_bns_info |
519 val qperm_bns = map #qconst qperm_bns_info |
520 val qperm_bns = map #qconst qperm_bns_info |
552 |
553 |
553 (* supports lemmas *) |
554 (* supports lemmas *) |
554 val _ = warning "Proving Supports Lemmas and fs-Instances" |
555 val _ = warning "Proving Supports Lemmas and fs-Instances" |
555 val qsupports_thms = |
556 val qsupports_thms = |
556 if get_STEPS lthy > 29 |
557 if get_STEPS lthy > 29 |
557 then prove_supports lthyB qperm_simps qtrms |
558 then prove_supports lthyB qperm_simps (flat qtrms) |
558 else raise TEST lthyB |
559 else raise TEST lthyB |
559 |
560 |
560 (* finite supp lemmas *) |
561 (* finite supp lemmas *) |
561 val qfsupp_thms = |
562 val qfsupp_thms = |
562 if get_STEPS lthy > 30 |
563 if get_STEPS lthy > 30 |
571 |
572 |
572 (* fv - supp equality *) |
573 (* fv - supp equality *) |
573 val _ = warning "Proving Equality between fv and supp" |
574 val _ = warning "Proving Equality between fv and supp" |
574 val qfv_supp_thms = |
575 val qfv_supp_thms = |
575 if get_STEPS lthy > 32 |
576 if get_STEPS lthy > 32 |
576 then prove_fv_supp qtys qtrms qfvs qfv_bns qalpha_bns qfv_defs qeq_iffs |
577 then prove_fv_supp qtys (flat qtrms) qfvs qfv_bns qalpha_bns qfv_defs qeq_iffs |
577 qperm_simps qfv_qbn_eqvts qinduct (flat raw_bclauses) lthyC |
578 qperm_simps qfv_qbn_eqvts qinduct (flat raw_bclauses) lthyC |
578 else [] |
579 else [] |
579 |
580 |
580 (* postprocessing of eq and fv theorems *) |
581 (* postprocessing of eq and fv theorems *) |
581 |
582 |