src/HOL/Nonstandard_Analysis/StarDef.thy
changeset 66806 a4e82b58d833
parent 64600 86e2f2208a58
child 66815 93c6632ddf44
equal deleted inserted replaced
66805:274b4edca859 66806:a4e82b58d833
   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