src/HOL/Euclidean_Division.thy
changeset 66840 0d689d71dbdc
parent 66839 909ba5ed93dd
child 66886 960509bfd47e
equal deleted inserted replaced
66839:909ba5ed93dd 66840:0d689d71dbdc
    17   assumes mod_size_less: 
    17   assumes mod_size_less: 
    18     "b \<noteq> 0 \<Longrightarrow> euclidean_size (a mod b) < euclidean_size b"
    18     "b \<noteq> 0 \<Longrightarrow> euclidean_size (a mod b) < euclidean_size b"
    19   assumes size_mult_mono:
    19   assumes size_mult_mono:
    20     "b \<noteq> 0 \<Longrightarrow> euclidean_size a \<le> euclidean_size (a * b)"
    20     "b \<noteq> 0 \<Longrightarrow> euclidean_size a \<le> euclidean_size (a * b)"
    21 begin
    21 begin
       
    22 
       
    23 lemma euclidean_size_eq_0_iff [simp]:
       
    24   "euclidean_size b = 0 \<longleftrightarrow> b = 0"
       
    25 proof
       
    26   assume "b = 0"
       
    27   then show "euclidean_size b = 0"
       
    28     by simp
       
    29 next
       
    30   assume "euclidean_size b = 0"
       
    31   show "b = 0"
       
    32   proof (rule ccontr)
       
    33     assume "b \<noteq> 0"
       
    34     with mod_size_less have "euclidean_size (b mod b) < euclidean_size b" .
       
    35     with \<open>euclidean_size b = 0\<close> show False
       
    36       by simp
       
    37   qed
       
    38 qed
       
    39 
       
    40 lemma euclidean_size_greater_0_iff [simp]:
       
    41   "euclidean_size b > 0 \<longleftrightarrow> b \<noteq> 0"
       
    42   using euclidean_size_eq_0_iff [symmetric, of b] by safe simp
    22 
    43 
    23 lemma size_mult_mono': "b \<noteq> 0 \<Longrightarrow> euclidean_size a \<le> euclidean_size (b * a)"
    44 lemma size_mult_mono': "b \<noteq> 0 \<Longrightarrow> euclidean_size a \<le> euclidean_size (b * a)"
    24   by (subst mult.commute) (rule size_mult_mono)
    45   by (subst mult.commute) (rule size_mult_mono)
    25 
    46 
    26 lemma dvd_euclidean_size_eq_imp_dvd:
    47 lemma dvd_euclidean_size_eq_imp_dvd:
   106 
   127 
   107 end
   128 end
   108 
   129 
   109 class euclidean_ring = idom_modulo + euclidean_semiring
   130 class euclidean_ring = idom_modulo + euclidean_semiring
   110 
   131 
   111   
   132 
   112 subsection \<open>Euclidean (semi)rings with cancel rules\<close>
   133 subsection \<open>Euclidean (semi)rings with cancel rules\<close>
   113 
   134 
   114 class euclidean_semiring_cancel = euclidean_semiring +
   135 class euclidean_semiring_cancel = euclidean_semiring +
   115   assumes div_mult_self1 [simp]: "b \<noteq> 0 \<Longrightarrow> (a + c * b) div b = c + a div b"
   136   assumes div_mult_self1 [simp]: "b \<noteq> 0 \<Longrightarrow> (a + c * b) div b = c + a div b"
   116   and div_mult_mult1 [simp]: "c \<noteq> 0 \<Longrightarrow> (c * a) div (c * b) = a div b"
   137   and div_mult_mult1 [simp]: "c \<noteq> 0 \<Longrightarrow> (c * a) div (c * b) = a div b"
   504 
   525 
   505   
   526   
   506 subsection \<open>Uniquely determined division\<close>
   527 subsection \<open>Uniquely determined division\<close>
   507   
   528   
   508 class unique_euclidean_semiring = euclidean_semiring + 
   529 class unique_euclidean_semiring = euclidean_semiring + 
   509   assumes size_mono_mult:
   530   assumes euclidean_size_mult: "euclidean_size (a * b) = euclidean_size a * euclidean_size b"
   510     "b \<noteq> 0 \<Longrightarrow> euclidean_size a < euclidean_size c
       
   511       \<Longrightarrow> euclidean_size (a * b) < euclidean_size (c * b)"
       
   512     -- \<open>FIXME justify\<close>
       
   513   fixes division_segment :: "'a \<Rightarrow> 'a"
   531   fixes division_segment :: "'a \<Rightarrow> 'a"
   514   assumes is_unit_division_segment [simp]: "is_unit (division_segment a)"
   532   assumes is_unit_division_segment [simp]: "is_unit (division_segment a)"
   515     and division_segment_mult:
   533     and division_segment_mult:
   516     "a \<noteq> 0 \<Longrightarrow> b \<noteq> 0 \<Longrightarrow> division_segment (a * b) = division_segment a * division_segment b"
   534     "a \<noteq> 0 \<Longrightarrow> b \<noteq> 0 \<Longrightarrow> division_segment (a * b) = division_segment a * division_segment b"
   517     and division_segment_mod:
   535     and division_segment_mod:
   623     from \<open>b \<noteq> 0\<close> \<open>c \<noteq> 0\<close> have "b * c \<noteq> 0"
   641     from \<open>b \<noteq> 0\<close> \<open>c \<noteq> 0\<close> have "b * c \<noteq> 0"
   624       by simp
   642       by simp
   625     from remainder \<open>c \<noteq> 0\<close>
   643     from remainder \<open>c \<noteq> 0\<close>
   626     have "division_segment (r * c) = division_segment (b * c)"
   644     have "division_segment (r * c) = division_segment (b * c)"
   627       and "euclidean_size (r * c) < euclidean_size (b * c)"
   645       and "euclidean_size (r * c) < euclidean_size (b * c)"
   628       by (simp_all add: division_segment_mult division_segment_mod size_mono_mult)
   646       by (simp_all add: division_segment_mult division_segment_mod euclidean_size_mult)
   629     with remainder show ?thesis
   647     with remainder show ?thesis
   630       by (auto intro!: div_eqI [of _ "c * (a mod b)"] simp add: algebra_simps)
   648       by (auto intro!: div_eqI [of _ "c * (a mod b)"] simp add: algebra_simps)
   631         (use \<open>b * c \<noteq> 0\<close> in simp)
   649         (use \<open>b * c \<noteq> 0\<close> in simp)
   632   qed
   650   qed
   633 qed
   651 qed