src/HOL/Real.thy
changeset 58040 9a867afaab5a
parent 57514 bdc2c6b40bf2
child 58042 ffa9e39763e3
equal deleted inserted replaced
58039:469a375212c1 58040:9a867afaab5a
  1461     (* not needed because x < (y::int) can be rewritten as x + 1 <= y: real_of_int_less_iff RS iffD2 *)
  1461     (* not needed because x < (y::int) can be rewritten as x + 1 <= y: real_of_int_less_iff RS iffD2 *)
  1462   #> Lin_Arith.add_simps [@{thm real_of_nat_zero}, @{thm real_of_nat_Suc}, @{thm real_of_nat_add},
  1462   #> Lin_Arith.add_simps [@{thm real_of_nat_zero}, @{thm real_of_nat_Suc}, @{thm real_of_nat_add},
  1463       @{thm real_of_nat_mult}, @{thm real_of_int_zero}, @{thm real_of_one},
  1463       @{thm real_of_nat_mult}, @{thm real_of_int_zero}, @{thm real_of_one},
  1464       @{thm real_of_int_add}, @{thm real_of_int_minus}, @{thm real_of_int_diff},
  1464       @{thm real_of_int_add}, @{thm real_of_int_minus}, @{thm real_of_int_diff},
  1465       @{thm real_of_int_mult}, @{thm real_of_int_of_nat_eq},
  1465       @{thm real_of_int_mult}, @{thm real_of_int_of_nat_eq},
  1466       @{thm real_of_nat_numeral}, @{thm real_numeral(1)}, @{thm real_numeral(2)}]
  1466       @{thm real_of_nat_numeral}, @{thm real_numeral(1)}, @{thm real_numeral(2)},
       
  1467       @{thm real_of_int_def[symmetric]}, @{thm real_of_nat_def[symmetric]}]
  1467   #> Lin_Arith.add_inj_const (@{const_name real}, @{typ "nat \<Rightarrow> real"})
  1468   #> Lin_Arith.add_inj_const (@{const_name real}, @{typ "nat \<Rightarrow> real"})
  1468   #> Lin_Arith.add_inj_const (@{const_name real}, @{typ "int \<Rightarrow> real"}))
  1469   #> Lin_Arith.add_inj_const (@{const_name real}, @{typ "int \<Rightarrow> real"})
       
  1470   #> Lin_Arith.add_inj_const (@{const_name of_nat}, @{typ "nat \<Rightarrow> real"})
       
  1471   #> Lin_Arith.add_inj_const (@{const_name of_int}, @{typ "int \<Rightarrow> real"}))
  1469 *}
  1472 *}
  1470 
       
  1471 
  1473 
  1472 subsection{* Simprules combining x+y and 0: ARE THEY NEEDED?*}
  1474 subsection{* Simprules combining x+y and 0: ARE THEY NEEDED?*}
  1473 
  1475 
  1474 lemma real_add_minus_iff [simp]: "(x + - a = (0::real)) = (x=a)" 
  1476 lemma real_add_minus_iff [simp]: "(x + - a = (0::real)) = (x=a)" 
  1475 by arith
  1477 by arith
  1648 unfolding real_of_int_def by (simp add: floor_minus)
  1650 unfolding real_of_int_def by (simp add: floor_minus)
  1649 
  1651 
  1650 lemma real_lb_ub_int: " \<exists>n::int. real n \<le> r & r < real (n+1)"
  1652 lemma real_lb_ub_int: " \<exists>n::int. real n \<le> r & r < real (n+1)"
  1651 unfolding real_of_int_def by (rule floor_exists)
  1653 unfolding real_of_int_def by (rule floor_exists)
  1652 
  1654 
  1653 lemma lemma_floor:
  1655 lemma lemma_floor: "real m \<le> r \<Longrightarrow> r < real n + 1 \<Longrightarrow> m \<le> (n::int)"
  1654   assumes a1: "real m \<le> r" and a2: "r < real n + 1"
  1656   by simp
  1655   shows "m \<le> (n::int)"
       
  1656 proof -
       
  1657   have "real m < real n + 1" using a1 a2 by (rule order_le_less_trans)
       
  1658   also have "... = real (n + 1)" by simp
       
  1659   finally have "m < n + 1" by (simp only: real_of_int_less_iff)
       
  1660   thus ?thesis by arith
       
  1661 qed
       
  1662 
  1657 
  1663 lemma real_of_int_floor_le [simp]: "real (floor r) \<le> r"
  1658 lemma real_of_int_floor_le [simp]: "real (floor r) \<le> r"
  1664 unfolding real_of_int_def by (rule of_int_floor_le)
  1659 unfolding real_of_int_def by (rule of_int_floor_le)
  1665 
  1660 
  1666 lemma lemma_floor2: "real n < real (x::int) + 1 ==> n \<le> x"
  1661 lemma lemma_floor2: "real n < real (x::int) + 1 ==> n \<le> x"
  1667 by (auto intro: lemma_floor)
  1662   by simp
  1668 
  1663 
  1669 lemma real_of_int_floor_cancel [simp]:
  1664 lemma real_of_int_floor_cancel [simp]:
  1670     "(real (floor x) = x) = (\<exists>n::int. x = real n)"
  1665     "(real (floor x) = x) = (\<exists>n::int. x = real n)"
  1671   using floor_real_of_int by metis
  1666   using floor_real_of_int by metis
  1672 
  1667 
  1673 lemma floor_eq: "[| real n < x; x < real n + 1 |] ==> floor x = n"
  1668 lemma floor_eq: "[| real n < x; x < real n + 1 |] ==> floor x = n"
  1674   unfolding real_of_int_def using floor_unique [of n x] by simp
  1669   by linarith
  1675 
  1670 
  1676 lemma floor_eq2: "[| real n \<le> x; x < real n + 1 |] ==> floor x = n"
  1671 lemma floor_eq2: "[| real n \<le> x; x < real n + 1 |] ==> floor x = n"
  1677   unfolding real_of_int_def by (rule floor_unique)
  1672   by linarith
  1678 
  1673 
  1679 lemma floor_eq3: "[| real n < x; x < real (Suc n) |] ==> nat(floor x) = n"
  1674 lemma floor_eq3: "[| real n < x; x < real (Suc n) |] ==> nat(floor x) = n"
  1680 apply (rule inj_int [THEN injD])
  1675   by linarith
  1681 apply (simp add: real_of_nat_Suc)
       
  1682 apply (simp add: real_of_nat_Suc floor_eq floor_eq [where n = "int n"])
       
  1683 done
       
  1684 
  1676 
  1685 lemma floor_eq4: "[| real n \<le> x; x < real (Suc n) |] ==> nat(floor x) = n"
  1677 lemma floor_eq4: "[| real n \<le> x; x < real (Suc n) |] ==> nat(floor x) = n"
  1686 apply (drule order_le_imp_less_or_eq)
  1678   by linarith
  1687 apply (auto intro: floor_eq3)
       
  1688 done
       
  1689 
  1679 
  1690 lemma real_of_int_floor_ge_diff_one [simp]: "r - 1 \<le> real(floor r)"
  1680 lemma real_of_int_floor_ge_diff_one [simp]: "r - 1 \<le> real(floor r)"
  1691   unfolding real_of_int_def using floor_correct [of r] by simp
  1681   by linarith
  1692 
  1682 
  1693 lemma real_of_int_floor_gt_diff_one [simp]: "r - 1 < real(floor r)"
  1683 lemma real_of_int_floor_gt_diff_one [simp]: "r - 1 < real(floor r)"
  1694   unfolding real_of_int_def using floor_correct [of r] by simp
  1684   by linarith
  1695 
  1685 
  1696 lemma real_of_int_floor_add_one_ge [simp]: "r \<le> real(floor r) + 1"
  1686 lemma real_of_int_floor_add_one_ge [simp]: "r \<le> real(floor r) + 1"
  1697   unfolding real_of_int_def using floor_correct [of r] by simp
  1687   by linarith
  1698 
  1688 
  1699 lemma real_of_int_floor_add_one_gt [simp]: "r < real(floor r) + 1"
  1689 lemma real_of_int_floor_add_one_gt [simp]: "r < real(floor r) + 1"
  1700   unfolding real_of_int_def using floor_correct [of r] by simp
  1690   by linarith
  1701 
  1691 
  1702 lemma le_floor: "real a <= x ==> a <= floor x"
  1692 lemma le_floor: "real a <= x ==> a <= floor x"
  1703   unfolding real_of_int_def by (simp add: le_floor_iff)
  1693   by linarith
  1704 
  1694 
  1705 lemma real_le_floor: "a <= floor x ==> real a <= x"
  1695 lemma real_le_floor: "a <= floor x ==> real a <= x"
  1706   unfolding real_of_int_def by (simp add: le_floor_iff)
  1696   by linarith
  1707 
  1697 
  1708 lemma le_floor_eq: "(a <= floor x) = (real a <= x)"
  1698 lemma le_floor_eq: "(a <= floor x) = (real a <= x)"
  1709   unfolding real_of_int_def by (rule le_floor_iff)
  1699   by linarith
  1710 
  1700 
  1711 lemma floor_less_eq: "(floor x < a) = (x < real a)"
  1701 lemma floor_less_eq: "(floor x < a) = (x < real a)"
  1712   unfolding real_of_int_def by (rule floor_less_iff)
  1702   by linarith
  1713 
  1703 
  1714 lemma less_floor_eq: "(a < floor x) = (real a + 1 <= x)"
  1704 lemma less_floor_eq: "(a < floor x) = (real a + 1 <= x)"
  1715   unfolding real_of_int_def by (rule less_floor_iff)
  1705   by linarith
  1716 
  1706 
  1717 lemma floor_le_eq: "(floor x <= a) = (x < real a + 1)"
  1707 lemma floor_le_eq: "(floor x <= a) = (x < real a + 1)"
  1718   unfolding real_of_int_def by (rule floor_le_iff)
  1708   by linarith
  1719 
  1709 
  1720 lemma floor_add [simp]: "floor (x + real a) = floor x + a"
  1710 lemma floor_add [simp]: "floor (x + real a) = floor x + a"
  1721   unfolding real_of_int_def by (rule floor_add_of_int)
  1711   by linarith
  1722 
  1712 
  1723 lemma floor_subtract [simp]: "floor (x - real a) = floor x - a"
  1713 lemma floor_subtract [simp]: "floor (x - real a) = floor x - a"
  1724   unfolding real_of_int_def by (rule floor_diff_of_int)
  1714   by linarith
  1725 
  1715 
  1726 lemma le_mult_floor:
  1716 lemma le_mult_floor:
  1727   assumes "0 \<le> (a :: real)" and "0 \<le> b"
  1717   assumes "0 \<le> (a :: real)" and "0 \<le> b"
  1728   shows "floor a * floor b \<le> floor (a * b)"
  1718   shows "floor a * floor b \<le> floor (a * b)"
  1729 proof -
  1719 proof -
  1744        (metis add_left_cancel zero_neq_one real_of_int_div_aux real_of_int_inject
  1734        (metis add_left_cancel zero_neq_one real_of_int_div_aux real_of_int_inject
  1745               real_of_int_zero_cancel right_inverse_eq div_self mod_div_trivial)
  1735               real_of_int_zero_cancel right_inverse_eq div_self mod_div_trivial)
  1746 qed (auto simp: real_of_int_div)
  1736 qed (auto simp: real_of_int_div)
  1747 
  1737 
  1748 lemma ceiling_real_of_nat [simp]: "ceiling (real (n::nat)) = int n"
  1738 lemma ceiling_real_of_nat [simp]: "ceiling (real (n::nat)) = int n"
  1749   unfolding real_of_nat_def by simp
  1739   by linarith
  1750 
  1740 
  1751 lemma real_of_int_ceiling_ge [simp]: "r \<le> real (ceiling r)"
  1741 lemma real_of_int_ceiling_ge [simp]: "r \<le> real (ceiling r)"
  1752   unfolding real_of_int_def by (rule le_of_int_ceiling)
  1742   by linarith
  1753 
  1743 
  1754 lemma ceiling_real_of_int [simp]: "ceiling (real (n::int)) = n"
  1744 lemma ceiling_real_of_int [simp]: "ceiling (real (n::int)) = n"
  1755   unfolding real_of_int_def by simp
  1745   by linarith
  1756 
  1746 
  1757 lemma real_of_int_ceiling_cancel [simp]:
  1747 lemma real_of_int_ceiling_cancel [simp]:
  1758      "(real (ceiling x) = x) = (\<exists>n::int. x = real n)"
  1748      "(real (ceiling x) = x) = (\<exists>n::int. x = real n)"
  1759   using ceiling_real_of_int by metis
  1749   using ceiling_real_of_int by metis
  1760 
  1750 
  1761 lemma ceiling_eq: "[| real n < x; x < real n + 1 |] ==> ceiling x = n + 1"
  1751 lemma ceiling_eq: "[| real n < x; x < real n + 1 |] ==> ceiling x = n + 1"
  1762   unfolding real_of_int_def using ceiling_unique [of "n + 1" x] by simp
  1752   by linarith
  1763 
  1753 
  1764 lemma ceiling_eq2: "[| real n < x; x \<le> real n + 1 |] ==> ceiling x = n + 1"
  1754 lemma ceiling_eq2: "[| real n < x; x \<le> real n + 1 |] ==> ceiling x = n + 1"
  1765   unfolding real_of_int_def using ceiling_unique [of "n + 1" x] by simp
  1755   by linarith
  1766 
  1756 
  1767 lemma ceiling_eq3: "[| real n - 1 < x; x \<le> real n  |] ==> ceiling x = n"
  1757 lemma ceiling_eq3: "[| real n - 1 < x; x \<le> real n  |] ==> ceiling x = n"
  1768   unfolding real_of_int_def using ceiling_unique [of n x] by simp
  1758   by linarith
  1769 
  1759 
  1770 lemma real_of_int_ceiling_diff_one_le [simp]: "real (ceiling r) - 1 \<le> r"
  1760 lemma real_of_int_ceiling_diff_one_le [simp]: "real (ceiling r) - 1 \<le> r"
  1771   unfolding real_of_int_def using ceiling_correct [of r] by simp
  1761   by linarith
  1772 
  1762 
  1773 lemma real_of_int_ceiling_le_add_one [simp]: "real (ceiling r) \<le> r + 1"
  1763 lemma real_of_int_ceiling_le_add_one [simp]: "real (ceiling r) \<le> r + 1"
  1774   unfolding real_of_int_def using ceiling_correct [of r] by simp
  1764   by linarith
  1775 
  1765 
  1776 lemma ceiling_le: "x <= real a ==> ceiling x <= a"
  1766 lemma ceiling_le: "x <= real a ==> ceiling x <= a"
  1777   unfolding real_of_int_def by (simp add: ceiling_le_iff)
  1767   by linarith
  1778 
  1768 
  1779 lemma ceiling_le_real: "ceiling x <= a ==> x <= real a"
  1769 lemma ceiling_le_real: "ceiling x <= a ==> x <= real a"
  1780   unfolding real_of_int_def by (simp add: ceiling_le_iff)
  1770   by linarith
  1781 
  1771 
  1782 lemma ceiling_le_eq: "(ceiling x <= a) = (x <= real a)"
  1772 lemma ceiling_le_eq: "(ceiling x <= a) = (x <= real a)"
  1783   unfolding real_of_int_def by (rule ceiling_le_iff)
  1773   by linarith
  1784 
  1774 
  1785 lemma less_ceiling_eq: "(a < ceiling x) = (real a < x)"
  1775 lemma less_ceiling_eq: "(a < ceiling x) = (real a < x)"
  1786   unfolding real_of_int_def by (rule less_ceiling_iff)
  1776   by linarith
  1787 
  1777 
  1788 lemma ceiling_less_eq: "(ceiling x < a) = (x <= real a - 1)"
  1778 lemma ceiling_less_eq: "(ceiling x < a) = (x <= real a - 1)"
  1789   unfolding real_of_int_def by (rule ceiling_less_iff)
  1779   by linarith
  1790 
  1780 
  1791 lemma le_ceiling_eq: "(a <= ceiling x) = (real a - 1 < x)"
  1781 lemma le_ceiling_eq: "(a <= ceiling x) = (real a - 1 < x)"
  1792   unfolding real_of_int_def by (rule le_ceiling_iff)
  1782   by linarith
  1793 
  1783 
  1794 lemma ceiling_add [simp]: "ceiling (x + real a) = ceiling x + a"
  1784 lemma ceiling_add [simp]: "ceiling (x + real a) = ceiling x + a"
  1795   unfolding real_of_int_def by (rule ceiling_add_of_int)
  1785   by linarith
  1796 
  1786 
  1797 lemma ceiling_subtract [simp]: "ceiling (x - real a) = ceiling x - a"
  1787 lemma ceiling_subtract [simp]: "ceiling (x - real a) = ceiling x - a"
  1798   unfolding real_of_int_def by (rule ceiling_diff_of_int)
  1788   by linarith
  1799 
  1789 
  1800 
  1790 
  1801 subsubsection {* Versions for the natural numbers *}
  1791 subsubsection {* Versions for the natural numbers *}
  1802 
  1792 
  1803 definition
  1793 definition
  1806 
  1796 
  1807 definition
  1797 definition
  1808   natceiling :: "real => nat" where
  1798   natceiling :: "real => nat" where
  1809   "natceiling x = nat(ceiling x)"
  1799   "natceiling x = nat(ceiling x)"
  1810 
  1800 
       
  1801 lemma natfloor_split[arith_split]: "P (natfloor t) \<longleftrightarrow> (t < 0 \<longrightarrow> P 0) \<and> (\<forall>n. of_nat n \<le> t \<and> t < of_nat n + 1 \<longrightarrow> P n)"
       
  1802 proof -
       
  1803   have [dest]: "\<And>n m::nat. real n \<le> t \<Longrightarrow> t < real n + 1 \<Longrightarrow> real m \<le> t \<Longrightarrow> t < real m + 1 \<Longrightarrow> n = m"
       
  1804     by simp
       
  1805   show ?thesis
       
  1806     by (auto simp: natfloor_def real_of_nat_def[symmetric] split: split_nat floor_split)
       
  1807 qed
       
  1808 
       
  1809 lemma natceiling_split[arith_split]:
       
  1810   "P (natceiling t) \<longleftrightarrow> (t \<le> - 1 \<longrightarrow> P 0) \<and> (\<forall>n. of_nat n - 1 < t \<and> t \<le> of_nat n \<longrightarrow> P n)"
       
  1811 proof -
       
  1812   have [dest]: "\<And>n m::nat. real n - 1 < t \<Longrightarrow> t \<le> real n \<Longrightarrow> real m - 1 < t \<Longrightarrow> t \<le> real m \<Longrightarrow> n = m"
       
  1813     by simp
       
  1814   show ?thesis
       
  1815     by (auto simp: natceiling_def real_of_nat_def[symmetric] split: split_nat ceiling_split)
       
  1816 qed
       
  1817 
  1811 lemma natfloor_zero [simp]: "natfloor 0 = 0"
  1818 lemma natfloor_zero [simp]: "natfloor 0 = 0"
  1812   by (unfold natfloor_def, simp)
  1819   by linarith
  1813 
  1820 
  1814 lemma natfloor_one [simp]: "natfloor 1 = 1"
  1821 lemma natfloor_one [simp]: "natfloor 1 = 1"
  1815   by (unfold natfloor_def, simp)
  1822   by linarith
  1816 
       
  1817 lemma zero_le_natfloor [simp]: "0 <= natfloor x"
       
  1818   by (unfold natfloor_def, simp)
       
  1819 
  1823 
  1820 lemma natfloor_numeral_eq [simp]: "natfloor (numeral n) = numeral n"
  1824 lemma natfloor_numeral_eq [simp]: "natfloor (numeral n) = numeral n"
  1821   by (unfold natfloor_def, simp)
  1825   by (unfold natfloor_def, simp)
  1822 
  1826 
  1823 lemma natfloor_real_of_nat [simp]: "natfloor(real n) = n"
  1827 lemma natfloor_real_of_nat [simp]: "natfloor(real n) = n"
  1824   by (unfold natfloor_def, simp)
  1828   by linarith
  1825 
  1829 
  1826 lemma real_natfloor_le: "0 <= x ==> real(natfloor x) <= x"
  1830 lemma real_natfloor_le: "0 <= x ==> real(natfloor x) <= x"
  1827   by (unfold natfloor_def, simp)
  1831   by linarith
  1828 
  1832 
  1829 lemma natfloor_neg: "x <= 0 ==> natfloor x = 0"
  1833 lemma natfloor_neg: "x <= 0 ==> natfloor x = 0"
  1830   unfolding natfloor_def by simp
  1834   by linarith
  1831 
  1835 
  1832 lemma natfloor_mono: "x <= y ==> natfloor x <= natfloor y"
  1836 lemma natfloor_mono: "x <= y ==> natfloor x <= natfloor y"
  1833   unfolding natfloor_def by (intro nat_mono floor_mono)
  1837   by linarith
  1834 
  1838 
  1835 lemma le_natfloor: "real x <= a ==> x <= natfloor a"
  1839 lemma le_natfloor: "real x <= a ==> x <= natfloor a"
  1836   apply (unfold natfloor_def)
  1840   by linarith
  1837   apply (subst nat_int [THEN sym])
       
  1838   apply (rule nat_mono)
       
  1839   apply (rule le_floor)
       
  1840   apply simp
       
  1841 done
       
  1842 
  1841 
  1843 lemma natfloor_less_iff: "0 \<le> x \<Longrightarrow> natfloor x < n \<longleftrightarrow> x < real n"
  1842 lemma natfloor_less_iff: "0 \<le> x \<Longrightarrow> natfloor x < n \<longleftrightarrow> x < real n"
  1844   unfolding natfloor_def real_of_nat_def
  1843   by linarith
  1845   by (simp add: nat_less_iff floor_less_iff)
  1844 
  1846 
  1845 lemma less_natfloor: "0 \<le> x \<Longrightarrow> x < real (n :: nat) \<Longrightarrow> natfloor x < n"
  1847 lemma less_natfloor:
  1846   by linarith
  1848   assumes "0 \<le> x" and "x < real (n :: nat)"
       
  1849   shows "natfloor x < n"
       
  1850   using assms by (simp add: natfloor_less_iff)
       
  1851 
  1847 
  1852 lemma le_natfloor_eq: "0 <= x ==> (a <= natfloor x) = (real a <= x)"
  1848 lemma le_natfloor_eq: "0 <= x ==> (a <= natfloor x) = (real a <= x)"
  1853   apply (rule iffI)
  1849   by linarith
  1854   apply (rule order_trans)
       
  1855   prefer 2
       
  1856   apply (erule real_natfloor_le)
       
  1857   apply (subst real_of_nat_le_iff)
       
  1858   apply assumption
       
  1859   apply (erule le_natfloor)
       
  1860 done
       
  1861 
  1850 
  1862 lemma le_natfloor_eq_numeral [simp]:
  1851 lemma le_natfloor_eq_numeral [simp]:
  1863     "~ neg((numeral n)::int) ==> 0 <= x ==>
  1852     "0 \<le> x \<Longrightarrow> (numeral n \<le> natfloor x) = (numeral n \<le> x)"
  1864       (numeral n <= natfloor x) = (numeral n <= x)"
  1853   by (subst le_natfloor_eq, assumption) simp
  1865   apply (subst le_natfloor_eq, assumption)
  1854 
  1866   apply simp
  1855 lemma le_natfloor_eq_one [simp]: "(1 \<le> natfloor x) = (1 \<le> x)"
  1867 done
  1856   by linarith
  1868 
  1857 
  1869 lemma le_natfloor_eq_one [simp]: "(1 <= natfloor x) = (1 <= x)"
  1858 lemma natfloor_eq: "real n \<le> x \<Longrightarrow> x < real n + 1 \<Longrightarrow> natfloor x = n"
  1870   apply (case_tac "0 <= x")
  1859   by linarith
  1871   apply (subst le_natfloor_eq, assumption, simp)
  1860 
  1872   apply (rule iffI)
  1861 lemma real_natfloor_add_one_gt: "x < real (natfloor x) + 1"
  1873   apply (subgoal_tac "natfloor x <= natfloor 0")
  1862   by linarith
  1874   apply simp
       
  1875   apply (rule natfloor_mono)
       
  1876   apply simp
       
  1877   apply simp
       
  1878 done
       
  1879 
       
  1880 lemma natfloor_eq: "real n <= x ==> x < real n + 1 ==> natfloor x = n"
       
  1881   unfolding natfloor_def by (simp add: floor_eq2 [where n="int n"])
       
  1882 
       
  1883 lemma real_natfloor_add_one_gt: "x < real(natfloor x) + 1"
       
  1884   apply (case_tac "0 <= x")
       
  1885   apply (unfold natfloor_def)
       
  1886   apply simp
       
  1887   apply simp_all
       
  1888 done
       
  1889 
  1863 
  1890 lemma real_natfloor_gt_diff_one: "x - 1 < real(natfloor x)"
  1864 lemma real_natfloor_gt_diff_one: "x - 1 < real(natfloor x)"
  1891 using real_natfloor_add_one_gt by (simp add: algebra_simps)
  1865   by linarith
  1892 
  1866 
  1893 lemma ge_natfloor_plus_one_imp_gt: "natfloor z + 1 <= n ==> z < real n"
  1867 lemma ge_natfloor_plus_one_imp_gt: "natfloor z + 1 <= n ==> z < real n"
  1894   apply (subgoal_tac "z < real(natfloor z) + 1")
  1868   by linarith
  1895   apply arith
       
  1896   apply (rule real_natfloor_add_one_gt)
       
  1897 done
       
  1898 
  1869 
  1899 lemma natfloor_add [simp]: "0 <= x ==> natfloor (x + real a) = natfloor x + a"
  1870 lemma natfloor_add [simp]: "0 <= x ==> natfloor (x + real a) = natfloor x + a"
  1900   unfolding natfloor_def
  1871   by linarith
  1901   unfolding real_of_int_of_nat_eq [symmetric] floor_add
       
  1902   by (simp add: nat_add_distrib)
       
  1903 
  1872 
  1904 lemma natfloor_add_numeral [simp]:
  1873 lemma natfloor_add_numeral [simp]:
  1905     "~neg ((numeral n)::int) ==> 0 <= x ==>
  1874     "0 <= x \<Longrightarrow> natfloor (x + numeral n) = natfloor x + numeral n"
  1906       natfloor (x + numeral n) = natfloor x + numeral n"
       
  1907   by (simp add: natfloor_add [symmetric])
  1875   by (simp add: natfloor_add [symmetric])
  1908 
  1876 
  1909 lemma natfloor_add_one: "0 <= x ==> natfloor(x + 1) = natfloor x + 1"
  1877 lemma natfloor_add_one: "0 <= x ==> natfloor(x + 1) = natfloor x + 1"
  1910   by (simp add: natfloor_add [symmetric] del: One_nat_def)
  1878   by linarith
  1911 
  1879 
  1912 lemma natfloor_subtract [simp]:
  1880 lemma natfloor_subtract [simp]:
  1913     "natfloor(x - real a) = natfloor x - a"
  1881     "natfloor(x - real a) = natfloor x - a"
  1914   unfolding natfloor_def real_of_int_of_nat_eq [symmetric] floor_subtract
  1882   by linarith
  1915   by simp
       
  1916 
  1883 
  1917 lemma natfloor_div_nat:
  1884 lemma natfloor_div_nat:
  1918   assumes "1 <= x" and "y > 0"
  1885   assumes "1 <= x" and "y > 0"
  1919   shows "natfloor (x / real y) = natfloor x div y"
  1886   shows "natfloor (x / real y) = natfloor x div y"
  1920 proof (rule natfloor_eq)
  1887 proof (rule natfloor_eq)
  1937   shows "natfloor a * natfloor b \<le> natfloor (a * b)"
  1904   shows "natfloor a * natfloor b \<le> natfloor (a * b)"
  1938   by (cases "0 <= a & 0 <= b")
  1905   by (cases "0 <= a & 0 <= b")
  1939     (auto simp add: le_natfloor_eq mult_mono' real_natfloor_le natfloor_neg)
  1906     (auto simp add: le_natfloor_eq mult_mono' real_natfloor_le natfloor_neg)
  1940 
  1907 
  1941 lemma natceiling_zero [simp]: "natceiling 0 = 0"
  1908 lemma natceiling_zero [simp]: "natceiling 0 = 0"
  1942   by (unfold natceiling_def, simp)
  1909   by linarith
  1943 
  1910 
  1944 lemma natceiling_one [simp]: "natceiling 1 = 1"
  1911 lemma natceiling_one [simp]: "natceiling 1 = 1"
  1945   by (unfold natceiling_def, simp)
  1912   by linarith
  1946 
  1913 
  1947 lemma zero_le_natceiling [simp]: "0 <= natceiling x"
  1914 lemma zero_le_natceiling [simp]: "0 <= natceiling x"
  1948   by (unfold natceiling_def, simp)
  1915   by linarith
  1949 
  1916 
  1950 lemma natceiling_numeral_eq [simp]: "natceiling (numeral n) = numeral n"
  1917 lemma natceiling_numeral_eq [simp]: "natceiling (numeral n) = numeral n"
  1951   by (unfold natceiling_def, simp)
  1918   by (simp add: natceiling_def)
  1952 
  1919 
  1953 lemma natceiling_real_of_nat [simp]: "natceiling(real n) = n"
  1920 lemma natceiling_real_of_nat [simp]: "natceiling(real n) = n"
  1954   by (unfold natceiling_def, simp)
  1921   by linarith
  1955 
  1922 
  1956 lemma real_natceiling_ge: "x <= real(natceiling x)"
  1923 lemma real_natceiling_ge: "x <= real(natceiling x)"
  1957   unfolding natceiling_def by (cases "x < 0", simp_all)
  1924   by linarith
  1958 
  1925 
  1959 lemma natceiling_neg: "x <= 0 ==> natceiling x = 0"
  1926 lemma natceiling_neg: "x <= 0 ==> natceiling x = 0"
  1960   unfolding natceiling_def by simp
  1927   by linarith
  1961 
  1928 
  1962 lemma natceiling_mono: "x <= y ==> natceiling x <= natceiling y"
  1929 lemma natceiling_mono: "x <= y ==> natceiling x <= natceiling y"
  1963   unfolding natceiling_def by (intro nat_mono ceiling_mono)
  1930   by linarith
  1964 
  1931 
  1965 lemma natceiling_le: "x <= real a ==> natceiling x <= a"
  1932 lemma natceiling_le: "x <= real a ==> natceiling x <= a"
  1966   unfolding natceiling_def real_of_nat_def
  1933   by linarith
  1967   by (simp add: nat_le_iff ceiling_le_iff)
       
  1968 
  1934 
  1969 lemma natceiling_le_eq: "(natceiling x <= a) = (x <= real a)"
  1935 lemma natceiling_le_eq: "(natceiling x <= a) = (x <= real a)"
  1970   unfolding natceiling_def real_of_nat_def
  1936   by linarith
  1971   by (simp add: nat_le_iff ceiling_le_iff)
       
  1972 
  1937 
  1973 lemma natceiling_le_eq_numeral [simp]:
  1938 lemma natceiling_le_eq_numeral [simp]:
  1974     "~ neg((numeral n)::int) ==>
  1939     "(natceiling x <= numeral n) = (x <= numeral n)"
  1975       (natceiling x <= numeral n) = (x <= numeral n)"
       
  1976   by (simp add: natceiling_le_eq)
  1940   by (simp add: natceiling_le_eq)
  1977 
  1941 
  1978 lemma natceiling_le_eq_one: "(natceiling x <= 1) = (x <= 1)"
  1942 lemma natceiling_le_eq_one: "(natceiling x <= 1) = (x <= 1)"
  1979   unfolding natceiling_def
  1943   by linarith
  1980   by (simp add: nat_le_iff ceiling_le_iff)
       
  1981 
  1944 
  1982 lemma natceiling_eq: "real n < x ==> x <= real n + 1 ==> natceiling x = n + 1"
  1945 lemma natceiling_eq: "real n < x ==> x <= real n + 1 ==> natceiling x = n + 1"
  1983   unfolding natceiling_def
  1946   by linarith
  1984   by (simp add: ceiling_eq2 [where n="int n"])
  1947 
  1985 
  1948 lemma natceiling_add [simp]: "0 <= x ==> natceiling (x + real a) = natceiling x + a"
  1986 lemma natceiling_add [simp]: "0 <= x ==>
  1949   by linarith
  1987     natceiling (x + real a) = natceiling x + a"
       
  1988   unfolding natceiling_def
       
  1989   unfolding real_of_int_of_nat_eq [symmetric] ceiling_add
       
  1990   by (simp add: nat_add_distrib)
       
  1991 
  1950 
  1992 lemma natceiling_add_numeral [simp]:
  1951 lemma natceiling_add_numeral [simp]:
  1993     "~ neg ((numeral n)::int) ==> 0 <= x ==>
  1952     "0 <= x ==> natceiling (x + numeral n) = natceiling x + numeral n"
  1994       natceiling (x + numeral n) = natceiling x + numeral n"
       
  1995   by (simp add: natceiling_add [symmetric])
  1953   by (simp add: natceiling_add [symmetric])
  1996 
  1954 
  1997 lemma natceiling_add_one: "0 <= x ==> natceiling(x + 1) = natceiling x + 1"
  1955 lemma natceiling_add_one: "0 <= x ==> natceiling(x + 1) = natceiling x + 1"
  1998   by (simp add: natceiling_add [symmetric] del: One_nat_def)
  1956   by linarith
  1999 
  1957 
  2000 lemma natceiling_subtract [simp]: "natceiling(x - real a) = natceiling x - a"
  1958 lemma natceiling_subtract [simp]: "natceiling(x - real a) = natceiling x - a"
  2001   unfolding natceiling_def real_of_int_of_nat_eq [symmetric] ceiling_subtract
  1959   by linarith
  2002   by simp
       
  2003 
  1960 
  2004 lemma Rats_no_top_le: "\<exists> q \<in> \<rat>. (x :: real) \<le> q"
  1961 lemma Rats_no_top_le: "\<exists> q \<in> \<rat>. (x :: real) \<le> q"
  2005   by (auto intro!: bexI[of _ "of_nat (natceiling x)"]) (metis real_natceiling_ge real_of_nat_def)
  1962   by (auto intro!: bexI[of _ "of_nat (natceiling x)"]) (metis real_natceiling_ge real_of_nat_def)
  2006 
  1963 
  2007 lemma Rats_no_bot_less: "\<exists> q \<in> \<rat>. q < (x :: real)"
  1964 lemma Rats_no_bot_less: "\<exists> q \<in> \<rat>. q < (x :: real)"