summary |
shortlog |
changelog |
graph |
tags |
bookmarks |
branches |
files |
changeset |
raw | gz |
help

author | paulson <lp15@cam.ac.uk> |

Sun, 15 Jul 2018 16:05:38 +0100 | |

changeset 68635 | 8094b853a92f |

parent 68634 | db0980691ef4 |

child 68636 | f33ffa0a27a1 |

fixes and more de-applying

--- a/src/Doc/Tutorial/Types/Numbers.thy Sun Jul 15 13:15:31 2018 +0100 +++ b/src/Doc/Tutorial/Types/Numbers.thy Sun Jul 15 16:05:38 2018 +0100 @@ -117,7 +117,7 @@ @{thm[display] dvd_add[no_vars]} \rulename{dvd_add} -For the integers, I'd list a few theorems that somehow involve negative +For the integers, I'd list a few theorems that somehow involve negative numbers.\<close> @@ -137,8 +137,8 @@ @{thm[display] neg_mod_bound[no_vars]} \rulename{neg_mod_bound} -@{thm[display] zdiv_zadd1_eq[no_vars]} -\rulename{zdiv_zadd1_eq} +@{thm[display] div_add1_eq[no_vars]} +\rulename{div_add1_eq} @{thm[display] mod_add_eq[no_vars]} \rulename{mod_add_eq} @@ -154,13 +154,13 @@ @{thm[display] zmod_zmult2_eq[no_vars]} \rulename{zmod_zmult2_eq} -\<close> +\<close> lemma "abs (x+y) \<le> abs x + abs (y :: int)" by arith lemma "abs (2*x) = 2 * abs (x :: int)" -by (simp add: abs_if) +by (simp add: abs_if) text \<open>Induction rules for the Integers @@ -176,7 +176,7 @@ @{thm[display] int_less_induct[no_vars]} \rulename{int_less_induct} -\<close> +\<close> text \<open>FIELDS @@ -208,13 +208,13 @@ \<close> lemma "3/4 < (7/8 :: real)" -by simp +by simp lemma "P ((3/4) * (8/15 :: real))" txt\<open> @{subgoals[display,indent=0,margin=65]} \<close> -apply simp +apply simp txt\<open> @{subgoals[display,indent=0,margin=65]} \<close> @@ -224,7 +224,7 @@ txt\<open> @{subgoals[display,indent=0,margin=65]} \<close> -apply simp +apply simp txt\<open> @{subgoals[display,indent=0,margin=65]} \<close>

--- a/src/Doc/Tutorial/document/numerics.tex Sun Jul 15 13:15:31 2018 +0100 +++ b/src/Doc/Tutorial/document/numerics.tex Sun Jul 15 16:05:38 2018 +0100 @@ -11,7 +11,7 @@ subtraction. With subtraction, arithmetic reasoning is easier, which makes the integers preferable to the natural numbers for complicated arithmetic expressions, even if they are non-negative. There are also the types -\isa{rat}, \isa{real} and \isa{complex}: the rational, real and complex numbers. Isabelle has no +\isa{rat}, \isa{real} and \isa{complex}: the rational, real and complex numbers. Isabelle has no subtyping, so the numeric types are distinct and there are functions to convert between them. Most numeric operations are overloaded: the same symbol can be @@ -19,7 +19,7 @@ shows the most important operations, together with the priorities of the infix symbols. Algebraic properties are organized using type classes around algebraic concepts such as rings and fields; -a property such as the commutativity of addition is a single theorem +a property such as the commutativity of addition is a single theorem (\isa{add.commute}) that applies to all numeric types. \index{linear arithmetic}% @@ -28,7 +28,7 @@ \methdx{arith}. Linear arithmetic comprises addition, subtraction and multiplication by constant factors; subterms involving other operators are regarded as variables. The procedure can be slow, especially if the -subgoal to be proved involves subtraction over type \isa{nat}, which +subgoal to be proved involves subtraction over type \isa{nat}, which causes case splits. On types \isa{nat} and \isa{int}, \methdx{arith} can deal with quantifiers---this is known as Presburger arithmetic---whereas on type \isa{real} it cannot. @@ -51,19 +51,19 @@ numbers, integers, rationals, reals, etc.; they denote integer values of arbitrary size. -Literals look like constants, but they abbreviate -terms representing the number in a two's complement binary notation. -Isabelle performs arithmetic on literals by rewriting rather -than using the hardware arithmetic. In most cases arithmetic -is fast enough, even for numbers in the millions. The arithmetic operations -provided for literals include addition, subtraction, multiplication, +Literals look like constants, but they abbreviate +terms representing the number in a two's complement binary notation. +Isabelle performs arithmetic on literals by rewriting rather +than using the hardware arithmetic. In most cases arithmetic +is fast enough, even for numbers in the millions. The arithmetic operations +provided for literals include addition, subtraction, multiplication, integer division and remainder. Fractions of literals (expressed using division) are reduced to lowest terms. \begin{warn}\index{overloading!and arithmetic} -The arithmetic operators are -overloaded, so you must be careful to ensure that each numeric -expression refers to a specific type, if necessary by inserting +The arithmetic operators are +overloaded, so you must be careful to ensure that each numeric +expression refers to a specific type, if necessary by inserting type constraints. Here is an example of what can go wrong: \par \begin{isabelle} @@ -80,7 +80,7 @@ \end{warn} \begin{warn} -\index{function@\isacommand {function} (command)!and numeric literals} +\index{function@\isacommand {function} (command)!and numeric literals} Numeric literals are not constructors and therefore must not be used in patterns. For example, this declaration is rejected: @@ -103,7 +103,7 @@ \index{natural numbers|(}\index{*nat (type)|(}% This type requires no introduction: we have been using it from the beginning. Hundreds of theorems about the natural numbers are -proved in the theories \isa{Nat} and \isa{Divides}. +proved in the theories \isa{Nat} and \isa{Divides}. Basic properties of addition and multiplication are available through the axiomatic type class for semirings (\S\ref{sec:numeric-classes}). @@ -123,7 +123,7 @@ applied to terms of the form \isa{Suc\ $n$}. The following default simplification rules replace -small literals by zero and successor: +small literals by zero and successor: \begin{isabelle} 2\ +\ n\ =\ Suc\ (Suc\ n) \rulename{add_2_eq_Suc}\isanewline @@ -146,7 +146,7 @@ \rulenamedx{div_mult_mod_eq} \end{isabelle} -Many less obvious facts about quotient and remainder are also provided. +Many less obvious facts about quotient and remainder are also provided. Here is a selection: \begin{isabelle} a\ *\ b\ div\ c\ =\ a\ *\ (b\ div\ c)\ +\ a\ *\ (b\ mod\ c)\ div\ c% @@ -181,7 +181,7 @@ The \textbf{divides} relation\index{divides relation} has the standard definition, which -is overloaded over all numeric types: +is overloaded over all numeric types: \begin{isabelle} m\ dvd\ n\ \isasymequiv\ {\isasymexists}k.\ n\ =\ m\ *\ k \rulenamedx{dvd_def} @@ -198,10 +198,10 @@ \subsubsection{Subtraction} -There are no negative natural numbers, so \isa{m\ -\ n} equals zero unless +There are no negative natural numbers, so \isa{m\ -\ n} equals zero unless \isa{m} exceeds~\isa{n}. The following is one of the few facts about \isa{m\ -\ n} that is not subject to -the condition \isa{n\ \isasymle \ m}. +the condition \isa{n\ \isasymle \ m}. \begin{isabelle} (m\ -\ n)\ *\ k\ =\ m\ *\ k\ -\ n\ *\ k% \rulenamedx{diff_mult_distrib} @@ -234,7 +234,7 @@ \subsection{The Type of Integers, {\tt\slshape int}} \index{integers|(}\index{*int (type)|(}% -Reasoning methods for the integers resemble those for the natural numbers, +Reasoning methods for the integers resemble those for the natural numbers, but induction and the constant \isa{Suc} are not available. HOL provides many lemmas for proving inequalities involving integer multiplication and division, similar @@ -242,9 +242,9 @@ and multiplication are available through the axiomatic type class for rings (\S\ref{sec:numeric-classes}). -The \rmindex{absolute value} function \cdx{abs} is overloaded, and is +The \rmindex{absolute value} function \cdx{abs} is overloaded, and is defined for all types that involve negative numbers, including the integers. -The \isa{arith} method can prove facts about \isa{abs} automatically, +The \isa{arith} method can prove facts about \isa{abs} automatically, though as it does so by case analysis, the cost can be exponential. \begin{isabelle} \isacommand{lemma}\ "abs\ (x+y)\ \isasymle \ abs\ x\ +\ abs\ (y\ ::\ int)"\isanewline @@ -271,7 +271,7 @@ \begin{isabelle} (a\ +\ b)\ div\ c\ =\isanewline a\ div\ c\ +\ b\ div\ c\ +\ (a\ mod\ c\ +\ b\ mod\ c)\ div\ c% -\rulename{zdiv_zadd1_eq} +\rulename{div_add1_eq} \par\smallskip (a\ +\ b)\ mod\ c\ =\ (a\ mod\ c\ +\ b\ mod\ c)\ mod\ c% \rulename{mod_add_eq} @@ -320,9 +320,9 @@ \index{rational numbers|(}\index{*rat (type)|(}% \index{real numbers|(}\index{*real (type)|(}% \index{complex numbers|(}\index{*complex (type)|(}% -These types provide true division, the overloaded operator \isa{/}, -which differs from the operator \isa{div} of the -natural numbers and integers. The rationals and reals are +These types provide true division, the overloaded operator \isa{/}, +which differs from the operator \isa{div} of the +natural numbers and integers. The rationals and reals are \textbf{dense}: between every two distinct numbers lies another. This property follows from the division laws, since if $x\not=y$ then $(x+y)/2$ lies between them: \begin{isabelle} @@ -334,7 +334,7 @@ is bounded above has a least upper bound. Completeness distinguishes the reals from the rationals, for which the set $\{x\mid x^2<2\}$ has no least upper bound. (It could only be $\surd2$, which is irrational.) The -formalization of completeness, which is complicated, +formalization of completeness, which is complicated, can be found in theory \texttt{RComplete}. Numeric literals\index{numeric literals!for type \protect\isa{real}} @@ -357,13 +357,13 @@ \end{warn} Available in the logic HOL-NSA is the -theory \isa{Hyperreal}, which define the type \tydx{hypreal} of +theory \isa{Hyperreal}, which define the type \tydx{hypreal} of \rmindex{non-standard reals}. These \textbf{hyperreals} include infinitesimals, which represent infinitely small and infinitely large quantities; they facilitate proofs about limits, differentiation and integration~\cite{fleuriot-jcm}. The development defines an infinitely large number, \isa{omega} and an -infinitely small positive number, \isa{epsilon}. The +infinitely small positive number, \isa{epsilon}. The relation $x\approx y$ means ``$x$ is infinitely close to~$y$.'' Theory \isa{Hyperreal} also defines transcendental functions such as sine, cosine, exponential and logarithm --- even the versions for type @@ -381,23 +381,23 @@ for all numeric types satisfying the necessary axioms. The theory defines dozens of type classes, such as the following: \begin{itemize} -\item +\item \tcdx{semiring} and \tcdx{ordered_semiring}: a \emph{semiring} provides the associative operators \isa{+} and~\isa{*}, with \isa{0} and~\isa{1} as their respective identities. The operators enjoy the usual distributive law, and addition (\isa{+}) is also commutative. An \emph{ordered semiring} is also linearly ordered, with addition and multiplication respecting the ordering. Type \isa{nat} is an ordered semiring. -\item +\item \tcdx{ring} and \tcdx{ordered_ring}: a \emph{ring} extends a semiring with unary minus (the additive inverse) and subtraction (both denoted~\isa{-}). An \emph{ordered ring} includes the absolute value function, \cdx{abs}. Type \isa{int} is an ordered ring. -\item +\item \tcdx{field} and \tcdx{ordered_field}: a field extends a ring with the multiplicative inverse (called simply \cdx{inverse} and division~(\isa{/})). An ordered field is based on an ordered ring. Type \isa{complex} is a field, while type \isa{real} is an ordered field. -\item +\item \tcdx{division_by_zero} includes all types where \isa{inverse 0 = 0} and \isa{a / 0 = 0}. These include all of Isabelle's standard numeric types. However, the basic properties of fields are derived without assuming @@ -435,7 +435,7 @@ \subsubsection{Simplifying with the AC-Laws} -Suppose that two expressions are equal, differing only in +Suppose that two expressions are equal, differing only in associativity and commutativity of addition. Simplifying with the following equations sorts the terms and groups them to the right, making the two expressions identical. @@ -447,9 +447,9 @@ a\ +\ (b\ +\ c)\ =\ b\ +\ (a\ +\ c) \rulename{add.left_commute} \end{isabelle} -The name \isa{ac_simps}\index{*ac_simps (theorems)} +The name \isa{ac_simps}\index{*ac_simps (theorems)} refers to the list of all three theorems; similarly -there is \isa{ac_simps}.\index{*ac_simps (theorems)} +there is \isa{ac_simps}.\index{*ac_simps (theorems)} They are all proved for semirings and therefore hold for all numeric types. Here is an example of the sorting effect. Start @@ -506,16 +506,16 @@ \subsubsection{Absolute Value} -The \rmindex{absolute value} function \cdx{abs} is available for all +The \rmindex{absolute value} function \cdx{abs} is available for all ordered rings, including types \isa{int}, \isa{rat} and \isa{real}. It satisfies many properties, such as the following: \begin{isabelle} -\isasymbar x\ *\ y\isasymbar \ =\ \isasymbar x\isasymbar \ *\ \isasymbar y\isasymbar +\isasymbar x\ *\ y\isasymbar \ =\ \isasymbar x\isasymbar \ *\ \isasymbar y\isasymbar \rulename{abs_mult}\isanewline (\isasymbar a\isasymbar \ \isasymle \ b)\ =\ (a\ \isasymle \ b\ \isasymand \ -\ a\ \isasymle \ b) \rulename{abs_le_iff}\isanewline -\isasymbar a\ +\ b\isasymbar \ \isasymle \ \isasymbar a\isasymbar \ +\ \isasymbar b\isasymbar +\isasymbar a\ +\ b\isasymbar \ \isasymle \ \isasymbar a\isasymbar \ +\ \isasymbar b\isasymbar \rulename{abs_triangle_ineq} \end{isabelle} @@ -528,9 +528,9 @@ \subsubsection{Raising to a Power} -Another type class, \tcdx{ordered\_idom}, specifies rings that also have +Another type class, \tcdx{ordered\_idom}, specifies rings that also have exponentation to a natural number power, defined using the obvious primitive -recursion. Theory \thydx{Power} proves various theorems, such as the +recursion. Theory \thydx{Power} proves various theorems, such as the following. \begin{isabelle} a\ \isacharcircum \ (m\ +\ n)\ =\ a\ \isacharcircum \ m\ *\ a\ \isacharcircum \ n%

--- a/src/HOL/Analysis/Borel_Space.thy Sun Jul 15 13:15:31 2018 +0100 +++ b/src/HOL/Analysis/Borel_Space.thy Sun Jul 15 16:05:38 2018 +0100 @@ -254,8 +254,8 @@ shows "g a \<le> g b" proof (cases "a < b") assume "a < b" - from deriv have "\<forall>x. x \<ge> a \<and> x \<le> b \<longrightarrow> (g has_real_derivative g' x) (at x)" by simp - from MVT2[OF \<open>a < b\<close> this] and deriv + from deriv have "\<And>x. \<lbrakk>x \<ge> a; x \<le> b\<rbrakk> \<Longrightarrow> (g has_real_derivative g' x) (at x)" by simp + with MVT2[OF \<open>a < b\<close>] and deriv obtain \<xi> where \<xi>_ab: "\<xi> > a" "\<xi> < b" and g_ab: "g b - g a = (b - a) * g' \<xi>" by blast from \<xi>_ab ab nonneg have "(b - a) * g' \<xi> \<ge> 0" by simp with g_ab show ?thesis by simp

--- a/src/HOL/Deriv.thy Sun Jul 15 13:15:31 2018 +0100 +++ b/src/HOL/Deriv.thy Sun Jul 15 16:05:38 2018 +0100 @@ -1031,25 +1031,26 @@ lemma has_field_derivative_cong_ev: assumes "x = y" - and *: "eventually (\<lambda>x. x \<in> s \<longrightarrow> f x = g x) (nhds x)" - and "u = v" "s = t" "x \<in> s" - shows "(f has_field_derivative u) (at x within s) = (g has_field_derivative v) (at y within t)" + and *: "eventually (\<lambda>x. x \<in> S \<longrightarrow> f x = g x) (nhds x)" + and "u = v" "S = t" "x \<in> S" + shows "(f has_field_derivative u) (at x within S) = (g has_field_derivative v) (at y within t)" unfolding has_field_derivative_iff proof (rule filterlim_cong) from assms have "f y = g y" by (auto simp: eventually_nhds) - with * show "\<forall>\<^sub>F xa in at x within s. (f xa - f x) / (xa - x) = (g xa - g y) / (xa - y)" + with * show "\<forall>\<^sub>F z in at x within S. (f z - f x) / (z - x) = (g z - g y) / (z - y)" unfolding eventually_at_filter by eventually_elim (auto simp: assms \<open>f y = g y\<close>) qed (simp_all add: assms) lemma has_field_derivative_cong_eventually: - assumes "eventually (\<lambda>x. f x = g x) (at x within s)" "f x=g x" - shows "(f has_field_derivative u) (at x within s) = (g has_field_derivative u) (at x within s)" + assumes "eventually (\<lambda>x. f x = g x) (at x within S)" "f x = g x" + shows "(f has_field_derivative u) (at x within S) = (g has_field_derivative u) (at x within S)" unfolding has_field_derivative_iff - apply (rule tendsto_cong) - apply (insert assms) - by (auto elim: eventually_mono) +proof (rule tendsto_cong) + show "\<forall>\<^sub>F y in at x within S. (f y - f x) / (y - x) = (g y - g x) / (y - x)" + using assms by (auto elim: eventually_mono) +qed lemma DERIV_cong_ev: "x = y \<Longrightarrow> eventually (\<lambda>x. f x = g x) (nhds x) \<Longrightarrow> u = v \<Longrightarrow> @@ -1257,22 +1258,24 @@ subsection \<open>Rolle's Theorem\<close> text \<open>Lemma about introducing open ball in open interval\<close> -lemma lemma_interval_lt: "a < x \<Longrightarrow> x < b \<Longrightarrow> \<exists>d. 0 < d \<and> (\<forall>y. \<bar>x - y\<bar> < d \<longrightarrow> a < y \<and> y < b)" - for a b x :: real - apply (simp add: abs_less_iff) - apply (insert linorder_linear [of "x - a" "b - x"]) - apply safe - apply (rule_tac x = "x - a" in exI) - apply (rule_tac [2] x = "b - x" in exI) - apply auto - done +lemma lemma_interval_lt: + fixes a b x :: real + assumes "a < x" "x < b" + shows "\<exists>d. 0 < d \<and> (\<forall>y. \<bar>x - y\<bar> < d \<longrightarrow> a < y \<and> y < b)" + using linorder_linear [of "x - a" "b - x"] +proof + assume "x - a \<le> b - x" + with assms show ?thesis + by (rule_tac x = "x - a" in exI) auto +next + assume "b - x \<le> x - a" + with assms show ?thesis + by (rule_tac x = "b - x" in exI) auto +qed lemma lemma_interval: "a < x \<Longrightarrow> x < b \<Longrightarrow> \<exists>d. 0 < d \<and> (\<forall>y. \<bar>x - y\<bar> < d \<longrightarrow> a \<le> y \<and> y \<le> b)" for a b x :: real - apply (drule lemma_interval_lt) - apply auto - apply force - done + by (force dest: lemma_interval_lt) text \<open>Rolle's Theorem. If @{term f} is defined and continuous on the closed interval @@ -1401,14 +1404,23 @@ qed qed -lemma MVT2: - "a < b \<Longrightarrow> \<forall>x. a \<le> x \<and> x \<le> b \<longrightarrow> DERIV f x :> f' x \<Longrightarrow> - \<exists>z::real. a < z \<and> z < b \<and> (f b - f a = (b - a) * f' z)" - apply (drule MVT) - apply (blast intro: DERIV_isCont) - apply (force dest: order_less_imp_le simp add: real_differentiable_def) - apply (blast dest: DERIV_unique order_less_imp_le) - done +corollary MVT2: + assumes "a < b" and der: "\<And>x. \<lbrakk>a \<le> x; x \<le> b\<rbrakk> \<Longrightarrow> DERIV f x :> f' x" + shows "\<exists>z::real. a < z \<and> z < b \<and> (f b - f a = (b - a) * f' z)" +proof - + have "\<exists>l z. a < z \<and> + z < b \<and> + (f has_real_derivative l) (at z) \<and> + f b - f a = (b - a) * l" + proof (rule MVT [OF \<open>a < b\<close>]) + show "\<forall>x. a \<le> x \<and> x \<le> b \<longrightarrow> isCont f x" + using assms by (blast intro: DERIV_isCont) + show "\<forall>x. a < x \<and> x < b \<longrightarrow> f differentiable at x" + using assms by (force dest: order_less_imp_le simp add: real_differentiable_def) + qed + with assms show ?thesis + by (blast dest: DERIV_unique order_less_imp_le) +qed lemma pos_deriv_imp_strict_mono: assumes "\<And>x. (f has_real_derivative f' x) (at x)"

--- a/src/HOL/Transcendental.thy Sun Jul 15 13:15:31 2018 +0100 +++ b/src/HOL/Transcendental.thy Sun Jul 15 16:05:38 2018 +0100 @@ -4165,7 +4165,7 @@ shows "cos x < cos y" proof - have "- (x - y) < 0" using assms by auto - from MVT2[OF \<open>y < x\<close> DERIV_cos[THEN impI, THEN allI]] + from MVT2[OF \<open>y < x\<close> DERIV_cos] obtain z where "y < z" and "z < x" and cos_diff: "cos x - cos y = (x - y) * - sin z" by auto then have "0 < z" and "z < pi" @@ -4677,14 +4677,11 @@ assumes "- (pi/2) < y" and "y < x" and "x < pi/2" shows "tan y < tan x" proof - - have "\<forall>x'. y \<le> x' \<and> x' \<le> x \<longrightarrow> DERIV tan x' :> inverse ((cos x')\<^sup>2)" - proof (rule allI, rule impI) - fix x' :: real - assume "y \<le> x' \<and> x' \<le> x" - then have "-(pi/2) < x'" and "x' < pi/2" - using assms by auto - from cos_gt_zero_pi[OF this] - have "cos x' \<noteq> 0" by auto + have "DERIV tan x' :> inverse ((cos x')\<^sup>2)" if "y \<le> x'" "x' \<le> x" for x' + proof - + have "-(pi/2) < x'" and "x' < pi/2" + using that assms by auto + with cos_gt_zero_pi have "cos x' \<noteq> 0" by force then show "DERIV tan x' :> inverse ((cos x')\<^sup>2)" by (rule DERIV_tan) qed