770 instance star :: (semidom) semidom .. |
770 instance star :: (semidom) semidom .. |
771 |
771 |
772 instance star :: (semidom_divide) semidom_divide |
772 instance star :: (semidom_divide) semidom_divide |
773 by (intro_classes; transfer) simp_all |
773 by (intro_classes; transfer) simp_all |
774 |
774 |
775 instance star :: (semiring_div) semiring_div |
|
776 by (intro_classes; transfer) (simp_all add: div_mult_mod_eq) |
|
777 |
|
778 instance star :: (ring_no_zero_divisors) ring_no_zero_divisors .. |
775 instance star :: (ring_no_zero_divisors) ring_no_zero_divisors .. |
779 instance star :: (ring_1_no_zero_divisors) ring_1_no_zero_divisors .. |
776 instance star :: (ring_1_no_zero_divisors) ring_1_no_zero_divisors .. |
780 instance star :: (idom) idom .. |
777 instance star :: (idom) idom .. |
781 instance star :: (idom_divide) idom_divide .. |
778 instance star :: (idom_divide) idom_divide .. |
782 |
779 |
818 |
815 |
819 instance star :: (linordered_idom) linordered_idom |
816 instance star :: (linordered_idom) linordered_idom |
820 by (intro_classes; transfer) (fact sgn_if) |
817 by (intro_classes; transfer) (fact sgn_if) |
821 |
818 |
822 instance star :: (linordered_field) linordered_field .. |
819 instance star :: (linordered_field) linordered_field .. |
|
820 |
|
821 instance star :: (algebraic_semidom) algebraic_semidom .. |
|
822 |
|
823 instantiation star :: (normalization_semidom) normalization_semidom |
|
824 begin |
|
825 |
|
826 definition unit_factor_star :: "'a star \<Rightarrow> 'a star" |
|
827 where [transfer_unfold]: "unit_factor_star = *f* unit_factor" |
|
828 |
|
829 definition normalize_star :: "'a star \<Rightarrow> 'a star" |
|
830 where [transfer_unfold]: "normalize_star = *f* normalize" |
|
831 |
|
832 instance |
|
833 by standard (transfer; simp add: is_unit_unit_factor unit_factor_mult)+ |
|
834 |
|
835 end |
823 |
836 |
824 |
837 |
825 subsection \<open>Power\<close> |
838 subsection \<open>Power\<close> |
826 |
839 |
827 lemma star_power_def [transfer_unfold]: "(op ^) \<equiv> \<lambda>x n. ( *f* (\<lambda>x. x ^ n)) x" |
840 lemma star_power_def [transfer_unfold]: "(op ^) \<equiv> \<lambda>x n. ( *f* (\<lambda>x. x ^ n)) x" |
910 apply (transfer, erule (1) odd_even_add) |
923 apply (transfer, erule (1) odd_even_add) |
911 apply (transfer, erule even_multD) |
924 apply (transfer, erule even_multD) |
912 apply (transfer, erule odd_ex_decrement) |
925 apply (transfer, erule odd_ex_decrement) |
913 done |
926 done |
914 |
927 |
915 instance star :: (semiring_div_parity) semiring_div_parity |
|
916 apply intro_classes |
|
917 apply (transfer, rule parity) |
|
918 apply (transfer, rule one_mod_two_eq_one) |
|
919 apply (transfer, rule zero_not_eq_two) |
|
920 done |
|
921 |
|
922 instantiation star :: (semiring_numeral_div) semiring_numeral_div |
|
923 begin |
|
924 |
|
925 definition divmod_star :: "num \<Rightarrow> num \<Rightarrow> 'a star \<times> 'a star" |
|
926 where divmod_star_def: "divmod_star m n = (numeral m div numeral n, numeral m mod numeral n)" |
|
927 |
|
928 definition divmod_step_star :: "num \<Rightarrow> 'a star \<times> 'a star \<Rightarrow> 'a star \<times> 'a star" |
|
929 where "divmod_step_star l qr = |
|
930 (let (q, r) = qr |
|
931 in if r \<ge> numeral l then (2 * q + 1, r - numeral l) else (2 * q, r))" |
|
932 |
|
933 instance |
|
934 proof |
|
935 show "divmod m n = (numeral m div numeral n :: 'a star, numeral m mod numeral n)" for m n |
|
936 by (fact divmod_star_def) |
|
937 show "divmod_step l qr = |
|
938 (let (q, r) = qr |
|
939 in if r \<ge> numeral l then (2 * q + 1, r - numeral l) else (2 * q, r))" |
|
940 for l and qr :: "'a star \<times> 'a star" |
|
941 by (fact divmod_step_star_def) |
|
942 qed (transfer, |
|
943 fact |
|
944 semiring_numeral_div_class.div_less |
|
945 semiring_numeral_div_class.mod_less |
|
946 semiring_numeral_div_class.div_positive |
|
947 semiring_numeral_div_class.mod_less_eq_dividend |
|
948 semiring_numeral_div_class.pos_mod_bound |
|
949 semiring_numeral_div_class.pos_mod_sign |
|
950 semiring_numeral_div_class.mod_mult2_eq |
|
951 semiring_numeral_div_class.div_mult2_eq |
|
952 semiring_numeral_div_class.discrete)+ |
|
953 |
|
954 end |
|
955 |
|
956 declare divmod_algorithm_code [where ?'a = "'a::semiring_numeral_div star", code] |
|
957 |
|
958 |
928 |
959 subsection \<open>Finite class\<close> |
929 subsection \<open>Finite class\<close> |
960 |
930 |
961 lemma starset_finite: "finite A \<Longrightarrow> *s* A = star_of ` A" |
931 lemma starset_finite: "finite A \<Longrightarrow> *s* A = star_of ` A" |
962 by (erule finite_induct) simp_all |
932 by (erule finite_induct) simp_all |