src/HOL/NSA/StarDef.thy
changeset 61275 053ec04ea866
parent 61076 bdc1e2f0a86a
child 61810 3c5040d5694a
equal deleted inserted replaced
61274:0261eec37233 61275:053ec04ea866
  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)