412 |
412 |
413 in map prove_elim cs end; |
413 in map prove_elim cs end; |
414 |
414 |
415 (* prove simplification equations *) |
415 (* prove simplification equations *) |
416 |
416 |
417 fun prove_eqs quiet_mode cs params intr_ts intrs elims ctxt ctxt'' = |
417 fun prove_eqs quiet_mode cs params intr_ts intrs (elims: (thm * bstring list * int) list) ctxt ctxt'' = |
418 let |
418 let |
419 val _ = clean_message quiet_mode " Proving the simplification rules ..."; |
419 val _ = clean_message quiet_mode " Proving the simplification rules ..."; |
420 |
420 |
421 fun dest_intr r = |
421 fun dest_intr r = |
422 (the (dest_predicate cs params (HOLogic.dest_Trueprop (Logic.strip_assums_concl r))), |
422 (the (dest_predicate cs params (HOLogic.dest_Trueprop (Logic.strip_assums_concl r))), |
423 Logic.strip_assums_hyp r, Logic.strip_params r); |
423 Logic.strip_assums_hyp r, Logic.strip_params r); |
424 val intr_ts' = map dest_intr intr_ts; |
424 val intr_ts' = map dest_intr intr_ts; |
425 fun prove_eq c elim = |
425 fun prove_eq c (elim: thm * 'a * 'b) = |
426 let |
426 let |
427 val Ts = arg_types_of (length params) c; |
427 val Ts = arg_types_of (length params) c; |
428 val (anames, ctxt') = Variable.variant_fixes (mk_names "a" (length Ts)) ctxt; |
428 val (anames, ctxt') = Variable.variant_fixes (mk_names "a" (length Ts)) ctxt; |
429 val frees = map Free (anames ~~ Ts); |
429 val frees = map Free (anames ~~ Ts); |
430 val c_intrs = filter (equal c o #1 o #1 o #1) (intr_ts' ~~ intrs); |
430 val c_intrs = filter (equal c o #1 o #1 o #1) (intr_ts' ~~ intrs); |