src/HOL/Real_Asymp/Manual/Real_Asymp_Doc.thy
author wenzelm
Thu, 06 Jun 2024 23:19:59 +0200
changeset 80276 360e6217cda6
parent 69605 a96320074298
permissions -rw-r--r--
tuned proof: avoid smt/z3 to make this work with arm64-linux;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
     1
(*<*)
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
     2
theory Real_Asymp_Doc
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
     3
  imports "HOL-Real_Asymp.Real_Asymp"
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
     4
begin
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
     5
69605
a96320074298 isabelle update -u path_cartouches;
wenzelm
parents: 69597
diff changeset
     6
ML_file \<open>~~/src/Doc/antiquote_setup.ML\<close>
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
     7
(*>*)
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
     8
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
     9
section \<open>Introduction\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    10
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    11
text \<open>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    12
  This document describes the \<^verbatim>\<open>real_asymp\<close> package that provides a number of tools
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    13
  related to the asymptotics of real-valued functions. These tools are:
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    14
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    15
    \<^item> The @{method real_asymp} method to prove limits, statements involving Landau symbols
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    16
      (`Big-O' etc.), and asymptotic equivalence (\<open>\<sim>\<close>)
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    17
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    18
    \<^item> The @{command real_limit} command to compute the limit of a real-valued function at a
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    19
      certain point
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    20
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    21
    \<^item> The @{command real_expansion} command to compute the asymptotic expansion of a
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    22
      real-valued function at a certain point
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    23
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    24
  These three tools will be described in the following sections.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    25
\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    26
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    27
section \<open>Supported Operations\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    28
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    29
text \<open>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    30
  The \<^verbatim>\<open>real_asymp\<close> package fully supports the following operations:
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    31
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    32
    \<^item> Basic arithmetic (addition, subtraction, multiplication, division)
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    33
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    34
    \<^item> Powers with constant natural exponent
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    35
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    36
    \<^item> \<^term>\<open>exp\<close>, \<^term>\<open>ln\<close>, \<^term>\<open>log\<close>, \<^term>\<open>sqrt\<close>, \<^term>\<open>root k\<close> (for a constant k)
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    37
  
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    38
    \<^item> \<^term>\<open>sin\<close>, \<^term>\<open>cos\<close>, \<^term>\<open>tan\<close> at finite points
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    39
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    40
    \<^item> \<^term>\<open>sinh\<close>, \<^term>\<open>cosh\<close>, \<^term>\<open>tanh\<close>
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    41
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    42
    \<^item> \<^term>\<open>min\<close>, \<^term>\<open>max\<close>, \<^term>\<open>abs\<close>
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    43
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    44
  Additionally, the following operations are supported in a `best effort' fashion using asymptotic
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    45
  upper/lower bounds:
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    46
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    47
    \<^item> Powers with variable natural exponent
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    48
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    49
    \<^item> \<^term>\<open>sin\<close> and \<^term>\<open>cos\<close> at \<open>\<plusminus>\<infinity>\<close>
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    50
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    51
    \<^item> \<^term>\<open>floor\<close>, \<^term>\<open>ceiling\<close>, \<^term>\<open>frac\<close>, and \<open>mod\<close>
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    52
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    53
  Additionally, the \<^term>\<open>arctan\<close> function is partially supported. The method may fail when
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    54
  the argument to \<^term>\<open>arctan\<close> contains functions of different order of growth.
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    55
\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    56
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    57
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    58
section \<open>Proving Limits and Asymptotic Properties\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    59
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    60
text \<open>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    61
  \[
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    62
    @{method_def (HOL) real_asymp} : \<open>method\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    63
  \]
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    64
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    65
  \<^rail>\<open>
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    66
    @@{method (HOL) real_asymp} opt? (@{syntax simpmod} * )
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    67
    ;
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    68
    opt: '(' ('verbose' | 'fallback' ) ')'
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    69
    ;
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    70
    @{syntax_def simpmod}: ('add' | 'del' | 'only' | 'split' (() | '!' | 'del') |
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    71
      'cong' (() | 'add' | 'del')) ':' @{syntax thms}
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    72
  \<close>
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    73
\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    74
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    75
text \<open>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    76
  The @{method real_asymp} method is a semi-automatic proof method for proving certain statements
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    77
  related to the asymptotic behaviour of real-valued functions. In the following, let \<open>f\<close> and \<open>g\<close>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    78
  be functions of type \<^typ>\<open>real \<Rightarrow> real\<close> and \<open>F\<close> and \<open>G\<close> real filters.
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    79
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    80
  The functions \<open>f\<close> and \<open>g\<close> can be built from the operations mentioned before and may contain free 
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    81
  variables. The filters \<open>F\<close> and \<open>G\<close> can be either \<open>\<plusminus>\<infinity>\<close> or a finite point in \<open>\<real>\<close>, possibly
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    82
  with approach from the left or from the right.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    83
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    84
  The class of statements that is supported by @{method real_asymp} then consists of:
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    85
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    86
    \<^item> Limits, i.\,e.\ \<^prop>\<open>filterlim f F G\<close>
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    87
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    88
    \<^item> Landau symbols, i.\,e.\ \<^prop>\<open>f \<in> O[F](g)\<close> and analogously for \<^emph>\<open>o\<close>, \<open>\<Omega>\<close>, \<open>\<omega>\<close>, \<open>\<Theta>\<close>
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    89
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    90
    \<^item> Asymptotic equivalence, i.\,e.\ \<^prop>\<open>f \<sim>[F] g\<close>
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    91
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
    92
    \<^item> Asymptotic inequalities, i.\,e.\ \<^prop>\<open>eventually (\<lambda>x. f x \<le> g x) F\<close>
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    93
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    94
  For typical problems arising in practice that do not contain free variables, @{method real_asymp}
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    95
  tends to succeed fully automatically within fractions of seconds, e.\,g.:
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    96
\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    97
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    98
lemma \<open>filterlim (\<lambda>x::real. (1 + 1 / x) powr x) (nhds (exp 1)) at_top\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
    99
  by real_asymp
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   100
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   101
text \<open>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   102
  What makes the method \<^emph>\<open>semi-automatic\<close> is the fact that it has to internally determine the 
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   103
  sign of real-valued constants and identical zeroness of real-valued functions, and while the
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   104
  internal heuristics for this work very well most of the time, there are situations where the 
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   105
  method fails to determine the sign of a constant, in which case the user needs to go back and
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   106
  supply more information about the sign of that constant in order to get a result.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   107
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   108
  A simple example is the following:
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   109
\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   110
(*<*)
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   111
experiment
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   112
  fixes a :: real
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   113
begin
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   114
(*>*)
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   115
lemma \<open>filterlim (\<lambda>x::real. exp (a * x)) at_top at_top\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   116
oops
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   117
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   118
text \<open>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   119
  Here, @{method real_asymp} outputs an error message stating that it could not determine the
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
   120
  sign of the free variable \<^term>\<open>a :: real\<close>. In this case, the user must add the assumption
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   121
  \<open>a > 0\<close> and give it to @{method real_asymp}.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   122
\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   123
lemma
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   124
  assumes \<open>a > 0\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   125
  shows   \<open>filterlim (\<lambda>x::real. exp (a * x)) at_top at_top\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   126
  using assms by real_asymp
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   127
(*<*)
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   128
end
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   129
(*>*)
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   130
text \<open>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   131
  Additional modifications to the simpset that is used for determining signs can also be made
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   132
  with \<open>simp add:\<close> modifiers etc.\ in the same way as when using the @{method simp} method directly.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   133
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   134
  The same situation can also occur without free variables if the constant in question is a
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   135
  complicated expression that the simplifier does not know enough ebout,
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
   136
  e.\,g.\ \<^term>\<open>pi - exp 1\<close>.
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   137
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   138
  In order to trace problems with sign determination, the \<open>(verbose)\<close> option can be passed to
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   139
  @{method real_asymp}. It will then print a detailed error message whenever it encounters
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   140
  a sign determination problem that it cannot solve.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   141
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   142
  The \<open>(fallback)\<close> flag causes the method not to use asymptotic interval arithmetic, but only
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   143
  the much simpler core mechanism of computing a single Multiseries expansion for the input
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   144
  function. There should normally be no need to use this flag; however, the core part of the 
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   145
  code has been tested much more rigorously than the asymptotic interval part. In case there 
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   146
  is some implementation problem with it for a problem that can be solved without it, the 
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   147
  \<open>(fallback)\<close> option can be used until that problem is resolved.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   148
\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   149
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   150
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   151
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   152
section \<open>Diagnostic Commands\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   153
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   154
text \<open>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   155
  \[\begin{array}{rcl}
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   156
    @{command_def (HOL) real_limit} & : & \<open>context \<rightarrow>\<close> \\
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   157
    @{command_def (HOL) real_expansion} & : & \<open>context \<rightarrow>\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   158
  \end{array}\]
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   159
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
   160
  \<^rail>\<open>
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   161
    @@{command (HOL) real_limit} (limitopt*)
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   162
    ;
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   163
    @@{command (HOL) real_expansion} (expansionopt*)
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   164
    ;
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   165
    limitopt : ('limit' ':' @{syntax term}) | ('facts' ':' @{syntax thms})
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   166
    ;
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   167
    expansionopt : 
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   168
        ('limit' ':' @{syntax term}) |
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   169
        ('terms' ':' @{syntax nat} ('(' 'strict' ')') ?) |
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   170
        ('facts' ':' @{syntax thms})
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
   171
  \<close>
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   172
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   173
    \<^descr>@{command real_limit} computes the limit of the given function \<open>f(x)\<close> for as \<open>x\<close> tends
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   174
    to the specified limit point. Additional facts can be provided with the \<open>facts\<close> option, 
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   175
    similarly to the @{command using} command with @{method real_asymp}. The limit point given
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
   176
    by the \<open>limit\<close> option must be one of the filters \<^term>\<open>at_top\<close>, \<^term>\<open>at_bot\<close>, 
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
   177
    \<^term>\<open>at_left\<close>, or \<^term>\<open>at_right\<close>. If no limit point is given, \<^term>\<open>at_top\<close> is used
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   178
    by default.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   179
  
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   180
    \<^medskip>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   181
    The output of @{command real_limit} can be \<open>\<infinity>\<close>, \<open>-\<infinity>\<close>, \<open>\<plusminus>\<infinity>\<close>, \<open>c\<close> (for some real constant \<open>c\<close>),
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   182
    \<open>0\<^sup>+\<close>, or \<open>0\<^sup>-\<close>. The \<open>+\<close> and \<open>-\<close> in the last case indicate whether the approach is from above
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
   183
    or from below (corresponding to \<^term>\<open>at_right (0::real)\<close> and \<^term>\<open>at_left (0::real)\<close>); 
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   184
    for technical reasons, this information is currently not displayed if the limit is not 0.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   185
  
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   186
    \<^medskip>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
   187
    If the given function does not tend to a definite limit (e.\,g.\ \<^term>\<open>sin x\<close> for \<open>x \<rightarrow> \<infinity>\<close>),
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   188
    the command might nevertheless succeed to compute an asymptotic upper and/or lower bound and
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   189
    display the limits of these bounds instead.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   190
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   191
    \<^descr>@{command real_expansion} works similarly to @{command real_limit}, but displays the first few
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   192
    terms of the asymptotic multiseries expansion of the given function at the given limit point 
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   193
    and the order of growth of the remainder term.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   194
  
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   195
    In addition to the options already explained for the @{command real_limit} command, it takes
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   196
    an additional option \<open>terms\<close> that controls how many of the leading terms of the expansion are
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   197
    printed. If the \<open>(strict)\<close> modifier is passed to the \<open>terms option\<close>, terms whose coefficient is
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   198
    0 are dropped from the output and do not count to the number of terms to be output.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   199
  
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   200
    \<^medskip>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   201
    By default, the first three terms are output and the \<open>strict\<close> option is disabled.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   202
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   203
  Note that these two commands are intended for diagnostic use only. While the central part
68680
0a0e68369586 eliminated spurious Unicode;
wenzelm
parents: 68677
diff changeset
   204
  of their implementation -- finding a multiseries expansion and reading off the limit -- are the
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   205
  same as in the @{method real_asymp} method and therefore trustworthy, there is a small amount
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   206
  of unverified code involved in pre-processing and printing (e.\,g.\ for reducing all the
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
   207
  different options for the \<open>limit\<close> option to the \<^term>\<open>at_top\<close> case).
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   208
\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   209
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   210
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   211
section \<open>Extensibility\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   212
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   213
subsection \<open>Basic fact collections\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   214
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   215
text \<open>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   216
  The easiest way to add support for additional operations is to add corresponding facts
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   217
  to one of the following fact collections. However, this only works for particularly simple cases.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   218
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   219
    \<^descr>@{thm [source] real_asymp_reify_simps} specifies a list of (unconditional) equations that are 
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   220
     unfolded as a first step of @{method real_asymp} and the related commands. This can be used to 
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   221
     add support for operations that can be represented easily by other operations that are already
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
   222
     supported, such as \<^term>\<open>sinh\<close>, which is equal to \<^term>\<open>\<lambda>x. (exp x - exp (-x)) / 2\<close>.
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   223
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   224
    \<^descr>@{thm [source] real_asymp_nat_reify} and @{thm [source] real_asymp_int_reify} is used to
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   225
     convert operations on natural numbers or integers to operations on real numbers. This enables
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   226
     @{method real_asymp} to also work on functions that return a natural number or an integer.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   227
\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   228
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   229
subsection \<open>Expanding Custom Operations\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   230
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   231
text \<open>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   232
  Support for some non-trivial new operation \<open>f(x\<^sub>1, \<dots>, x\<^sub>n)\<close> can be added dynamically at any
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   233
  time, but it involves writing ML code and involves a significant amount of effort, especially
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   234
  when the function has essential singularities.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   235
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   236
  The first step is to write an ML function that takes as arguments
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   237
    \<^item> the expansion context
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   238
    \<^item> the term \<open>t\<close> to expand (which will be of the form \<open>f(g\<^sub>1(x), \<dots>, g\<^sub>n(x))\<close>)
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
   239
    \<^item> a list of \<open>n\<close> theorems of the form \<^prop>\<open>(g\<^sub>i expands_to G\<^sub>i) bs\<close>
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   240
    \<^item> the current basis \<open>bs\<close>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
   241
  and returns a theorem of the form \<^prop>\<open>(t expands_to F) bs'\<close> and a new basis \<open>bs'\<close> which 
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   242
  must be a superset of the original basis.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   243
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   244
  This function must then be registered as a handler for the operation by proving a vacuous lemma
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
   245
  of the form \<^prop>\<open>REAL_ASYMP_CUSTOM f\<close> (which is only used for tagging) and passing that
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   246
  lemma and the expansion function to @{ML [source] Exp_Log_Expression.register_custom_from_thm}
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   247
  in a @{command local_setup} invocation.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   248
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   249
  If the expansion produced by the handler function contains new definitions, corresponding 
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   250
  evaluation equations must be added to the fact collection @{thm [source] real_asymp_eval_eqs}.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   251
  These equations must have the form \<open>h p\<^sub>1 \<dots> p\<^sub>m = rhs\<close> where \<open>h\<close> must be a constant of arity \<open>m\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   252
  (i.\,e.\ the function on the left-hand side must be fully applied) and the \<open>p\<^sub>i\<close> can be patterns
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   253
  involving \<open>constructors\<close>.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   254
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   255
  New constructors for this pattern matching can be registered by adding a theorem of the form
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 68680
diff changeset
   256
  \<^prop>\<open>REAL_ASYMP_EVAL_CONSTRUCTOR c\<close> to the fact collection
68677
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   257
  @{thm [source] exp_log_eval_constructor}, but this should be quite rare in practice.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   258
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   259
  \<^medskip>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   260
  Note that there is currently no way to add support for custom operations in connection with
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   261
  `oscillating' terms. The above mechanism only works if all arguments of the new operation have
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   262
  an exact multiseries expansion.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   263
\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   264
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   265
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   266
subsection \<open>Extending the Sign Oracle\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   267
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   268
text \<open>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   269
  By default, the \<^verbatim>\<open>real_asymp\<close> package uses the simplifier with the given simpset and facts
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   270
  in order to determine the sign of real constants. This is done by invoking the simplifier
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   271
  on goals like \<open>c = 0\<close>, \<open>c \<noteq> 0\<close>, \<open>c > 0\<close>, or \<open>c < 0\<close> or some subset thereof, depending on the
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   272
  context.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   273
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   274
  If the simplifier cannot prove any of them, the entire method (or command) invocation will fail.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   275
  It is, however, possible to dynamically add additional sign oracles that will be tried; the 
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   276
  most obvious candidate for an oracle that one may want to add or remove dynamically are 
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   277
  approximation-based tactics.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   278
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   279
  Adding such a tactic can be done by calling
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   280
  @{ML [source] Multiseries_Expansion.register_sign_oracle}. Note that if the tactic cannot prove
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   281
  a goal, it should fail as fast as possible.
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   282
\<close>
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   283
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   284
(*<*)
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   285
end
99b1cf1e2d48 Moved Real_Asymp manual
eberlm <eberlm@in.tum.de>
parents:
diff changeset
   286
(*>*)