# HG changeset patch # User haftmann # Date 1699542711 0 # Node ID 5e788ff7a48980a0b2ed6499ad102249e2d43ed2 # Parent 5553a86a1091f5f7418cf549cd1362abff1202f7 explicit type class for discrete linordered semidoms diff -r 5553a86a1091 -r 5e788ff7a489 NEWS --- a/NEWS Thu Nov 09 19:06:50 2023 +0100 +++ b/NEWS Thu Nov 09 15:11:51 2023 +0000 @@ -15,6 +15,9 @@ by Sledgehammer and should be used instead. For more information, see Sledgehammer's documentation relating to "preplay_timeout". INCOMPATIBILITY. +* Explicit type class for discrete_linear_ordered_semidom for integral + semidomains with a discrete linear order. + *** ML *** diff -r 5553a86a1091 -r 5e788ff7a489 src/HOL/Code_Numeral.thy --- a/src/HOL/Code_Numeral.thy Thu Nov 09 19:06:50 2023 +0100 +++ b/src/HOL/Code_Numeral.thy Thu Nov 09 15:11:51 2023 +0000 @@ -178,46 +178,59 @@ "integer_of_num (Num.Bit0 Num.One) = 2" by simp_all -instantiation integer :: "{linordered_idom, equal}" +instantiation integer :: equal begin -lift_definition abs_integer :: "integer \ integer" - is "abs :: int \ int" +lift_definition equal_integer :: \integer \ integer \ bool\ + is \HOL.equal :: int \ int \ bool\ + . + +instance + by (standard; transfer) (fact equal_eq) + +end + +instantiation integer :: linordered_idom +begin + +lift_definition abs_integer :: \integer \ integer\ + is \abs :: int \ int\ . declare abs_integer.rep_eq [simp] -lift_definition sgn_integer :: "integer \ integer" - is "sgn :: int \ int" +lift_definition sgn_integer :: \integer \ integer\ + is \sgn :: int \ int\ . declare sgn_integer.rep_eq [simp] -lift_definition less_eq_integer :: "integer \ integer \ bool" - is "less_eq :: int \ int \ bool" +lift_definition less_eq_integer :: \integer \ integer \ bool\ + is \less_eq :: int \ int \ bool\ . lemma integer_less_eq_iff: - "k \ l \ int_of_integer k \ int_of_integer l" + \k \ l \ int_of_integer k \ int_of_integer l\ by (fact less_eq_integer.rep_eq) -lift_definition less_integer :: "integer \ integer \ bool" - is "less :: int \ int \ bool" +lift_definition less_integer :: \integer \ integer \ bool\ + is \less :: int \ int \ bool\ . lemma integer_less_iff: - "k < l \ int_of_integer k < int_of_integer l" + \k < l \ int_of_integer k < int_of_integer l\ by (fact less_integer.rep_eq) -lift_definition equal_integer :: "integer \ integer \ bool" - is "HOL.equal :: int \ int \ bool" - . - instance - by standard (transfer, simp add: algebra_simps equal less_le_not_le [symmetric] mult_strict_right_mono linear)+ + by (standard; transfer) + (simp_all add: algebra_simps less_le_not_le [symmetric] mult_strict_right_mono linear) end +instance integer :: discrete_linordered_semidom + by (standard; transfer) + (fact less_iff_succ_less_eq) + context includes lifting_syntax begin @@ -1051,7 +1064,7 @@ "division_segment (n::natural) = 1" by (simp add: natural_eq_iff) -instance natural :: linordered_semidom +instance natural :: discrete_linordered_semidom by (standard; transfer) simp_all instance natural :: unique_euclidean_semiring_with_nat diff -r 5553a86a1091 -r 5e788ff7a489 src/HOL/Divides.thy --- a/src/HOL/Divides.thy Thu Nov 09 19:06:50 2023 +0100 +++ b/src/HOL/Divides.thy Thu Nov 09 15:11:51 2023 +0000 @@ -7,7 +7,7 @@ imports Parity begin -class unique_euclidean_semiring_numeral = unique_euclidean_semiring_with_nat + linordered_semidom + +class unique_euclidean_semiring_numeral = unique_euclidean_semiring_with_nat + discrete_linordered_semidom + assumes div_less [no_atp]: "0 \ a \ a < b \ a div b = 0" and mod_less [no_atp]: " 0 \ a \ a < b \ a mod b = a" and div_positive [no_atp]: "0 < b \ b \ a \ a div b > 0" @@ -16,9 +16,8 @@ and pos_mod_sign [no_atp]: "0 < b \ 0 \ a mod b" and mod_mult2_eq [no_atp]: "0 \ c \ a mod (b * c) = b * (a div b mod c) + a mod b" and div_mult2_eq [no_atp]: "0 \ c \ a div (b * c) = a div b div c" - assumes discrete [no_atp]: "a < b \ a + 1 \ b" -hide_fact (open) div_less mod_less div_positive mod_less_eq_dividend pos_mod_bound pos_mod_sign mod_mult2_eq div_mult2_eq discrete +hide_fact (open) div_less mod_less div_positive mod_less_eq_dividend pos_mod_bound pos_mod_sign mod_mult2_eq div_mult2_eq context unique_euclidean_semiring_numeral begin @@ -26,6 +25,10 @@ context begin +qualified lemma discrete [no_atp]: + "a < b \ a + 1 \ b" + by (fact less_iff_succ_less_eq) + qualified lemma divmod_digit_1 [no_atp]: assumes "0 \ a" "0 < b" and "b \ a mod (2 * b)" shows "2 * (a div (2 * b)) + 1 = a div b" (is "?P") diff -r 5553a86a1091 -r 5e788ff7a489 src/HOL/Groups_List.thy --- a/src/HOL/Groups_List.thy Thu Nov 09 19:06:50 2023 +0100 +++ b/src/HOL/Groups_List.thy Thu Nov 09 15:11:51 2023 +0000 @@ -421,7 +421,7 @@ end -context unique_euclidean_semiring_numeral +context discrete_linordered_semidom begin lemma horner_sum_bound: @@ -435,11 +435,16 @@ moreover define a where \a = 2 ^ length bs - horner_sum of_bool 2 bs\ ultimately have *: \2 ^ length bs = horner_sum of_bool 2 bs + a\ by simp - have \1 < a * 2\ if \0 < a\ - using that add_mono [of 1 a 1 a] - by (simp add: mult_2_right discrete) + have \0 < a\ + using Cons * by simp + moreover have \1 \ a\ + using \0 < a\ by (simp add: less_eq_iff_succ_less) + ultimately have \0 + 1 < a + a\ + by (rule add_less_le_mono) + then have \1 < a * 2\ + by (simp add: mult_2_right) with Cons show ?case - by (simp add: algebra_simps *) + by (simp add: * algebra_simps) qed end @@ -448,7 +453,7 @@ \nat (horner_sum of_bool 2 bs) = horner_sum of_bool 2 bs\ by (induction bs) (auto simp add: nat_add_distrib horner_sum_nonnegative) -context unique_euclidean_semiring_numeral +context discrete_linordered_semidom begin lemma horner_sum_less_eq_iff_lexordp_eq: diff -r 5553a86a1091 -r 5e788ff7a489 src/HOL/Int.thy --- a/src/HOL/Int.thy Thu Nov 09 19:06:50 2023 +0100 +++ b/src/HOL/Int.thy Thu Nov 09 15:11:51 2023 +0000 @@ -181,6 +181,31 @@ end +instance int :: discrete_linordered_semidom +proof + fix k l :: int + show \k < l \ k + 1 \ l\ (is \?P \ ?Q\) + proof + assume ?Q + then show ?P + by simp + next + assume ?P + then have \l - k > 0\ + by simp + with zero_less_imp_eq_int obtain n where \l - k = int n\ + by blast + then have \n > 0\ + using \l - k > 0\ by simp + then have \n \ 1\ + by simp + then have \int n \ int 1\ + by (rule of_nat_mono) + with \l - k = int n\ show ?Q + by simp + qed +qed + lemma zless_imp_add1_zle: "w < z \ w + 1 \ z" for w z :: int by transfer clarsimp diff -r 5553a86a1091 -r 5e788ff7a489 src/HOL/Nat.thy --- a/src/HOL/Nat.thy Thu Nov 09 19:06:50 2023 +0100 +++ b/src/HOL/Nat.thy Thu Nov 09 15:11:51 2023 +0000 @@ -846,19 +846,21 @@ text \The naturals form an ordered \semidom\ and a \dioid\.\ -instance nat :: linordered_semidom +instance nat :: discrete_linordered_semidom proof fix m n q :: nat - show "0 < (1::nat)" + show \0 < (1::nat)\ by simp - show "m \ n \ q + m \ q + n" + show \m \ n \ q + m \ q + n\ by simp - show "m < n \ 0 < q \ q * m < q * n" + show \m < n \ 0 < q \ q * m < q * n\ by (simp add: mult_less_mono2) - show "m \ 0 \ n \ 0 \ m * n \ 0" + show \m \ 0 \ n \ 0 \ m * n \ 0\ by simp - show "n \ m \ (m - n) + n = m" + show \n \ m \ (m - n) + n = m\ by (simp add: add_diff_inverse_nat add.commute linorder_not_less) + show \m < n \ m + 1 \ n\ + by (simp add: Suc_le_eq) qed instance nat :: dioid diff -r 5553a86a1091 -r 5e788ff7a489 src/HOL/Rings.thy --- a/src/HOL/Rings.thy Thu Nov 09 19:06:50 2023 +0100 +++ b/src/HOL/Rings.thy Thu Nov 09 15:11:51 2023 +0000 @@ -2679,6 +2679,16 @@ end +class discrete_linordered_semidom = linordered_semidom + + assumes less_iff_succ_less_eq: \a < b \ a + 1 \ b\ +begin + +lemma less_eq_iff_succ_less: + \a \ b \ a < b + 1\ + using less_iff_succ_less_eq [of a \b + 1\] by simp + +end + text \Reasoning about inequalities with division\ context linordered_semidom