1007 apply(transfer, rule parity) |
1007 apply(transfer, rule parity) |
1008 apply(transfer, rule one_mod_two_eq_one) |
1008 apply(transfer, rule one_mod_two_eq_one) |
1009 apply(transfer, rule zero_not_eq_two) |
1009 apply(transfer, rule zero_not_eq_two) |
1010 done |
1010 done |
1011 |
1011 |
1012 instance star :: (semiring_numeral_div) semiring_numeral_div |
1012 instantiation star :: (semiring_numeral_div) semiring_numeral_div |
1013 apply intro_classes |
1013 begin |
1014 apply(transfer, fact semiring_numeral_div_class.div_less) |
1014 |
1015 apply(transfer, fact semiring_numeral_div_class.mod_less) |
1015 definition divmod_star :: "num \<Rightarrow> num \<Rightarrow> 'a star \<times> 'a star" |
1016 apply(transfer, fact semiring_numeral_div_class.div_positive) |
1016 where |
1017 apply(transfer, fact semiring_numeral_div_class.mod_less_eq_dividend) |
1017 divmod_star_def: "divmod_star m n = (numeral m div numeral n, numeral m mod numeral n)" |
1018 apply(transfer, fact semiring_numeral_div_class.pos_mod_bound) |
1018 |
1019 apply(transfer, fact semiring_numeral_div_class.pos_mod_sign) |
1019 definition divmod_step_star :: "num \<Rightarrow> 'a star \<times> 'a star \<Rightarrow> 'a star \<times> 'a star" |
1020 apply(transfer, fact semiring_numeral_div_class.mod_mult2_eq) |
1020 where |
1021 apply(transfer, fact semiring_numeral_div_class.div_mult2_eq) |
1021 "divmod_step_star l qr = (let (q, r) = qr |
1022 apply(transfer, fact discrete) |
1022 in if r \<ge> numeral l then (2 * q + 1, r - numeral l) |
1023 done |
1023 else (2 * q, r))" |
|
1024 |
|
1025 instance proof |
|
1026 show "divmod m n = (numeral m div numeral n :: 'a star, numeral m mod numeral n)" |
|
1027 for m n by (fact divmod_star_def) |
|
1028 show "divmod_step l qr = (let (q, r) = qr |
|
1029 in if r \<ge> numeral l then (2 * q + 1, r - numeral l) |
|
1030 else (2 * q, r))" for l and qr :: "'a star \<times> 'a star" |
|
1031 by (fact divmod_step_star_def) |
|
1032 qed (transfer, |
|
1033 fact |
|
1034 semiring_numeral_div_class.div_less |
|
1035 semiring_numeral_div_class.mod_less |
|
1036 semiring_numeral_div_class.div_positive |
|
1037 semiring_numeral_div_class.mod_less_eq_dividend |
|
1038 semiring_numeral_div_class.pos_mod_bound |
|
1039 semiring_numeral_div_class.pos_mod_sign |
|
1040 semiring_numeral_div_class.mod_mult2_eq |
|
1041 semiring_numeral_div_class.div_mult2_eq |
|
1042 semiring_numeral_div_class.discrete)+ |
|
1043 |
|
1044 end |
|
1045 |
|
1046 declare divmod_algorithm_code [where ?'a = "'a::semiring_numeral_div star", code] |
|
1047 |
1024 |
1048 |
1025 subsection {* Finite class *} |
1049 subsection {* Finite class *} |
1026 |
1050 |
1027 lemma starset_finite: "finite A \<Longrightarrow> *s* A = star_of ` A" |
1051 lemma starset_finite: "finite A \<Longrightarrow> *s* A = star_of ` A" |
1028 by (erule finite_induct, simp_all) |
1052 by (erule finite_induct, simp_all) |