doc-src/TutorialI/Misc/natsum.thy
author chaieb
Wed, 19 May 2004 11:23:59 +0200
changeset 14758 af3b71a46a1c
parent 13996 a994b92ab1ea
child 15364 0c3891c3528f
permissions -rw-r--r--
A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller. the tactic has also changed and allows the abstaction over fuction occurences whose type is nat or int.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     1
(*<*)
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     2
theory natsum = Main:;
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     3
(*>*)
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     4
text{*\noindent
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9541
diff changeset
     5
In particular, there are @{text"case"}-expressions, for example
9541
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 9458
diff changeset
     6
@{term[display]"case n of 0 => 0 | Suc m => m"}
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     7
primitive recursion, for example
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     8
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
     9
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    10
consts sum :: "nat \<Rightarrow> nat";
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    11
primrec "sum 0 = 0"
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    12
        "sum (Suc n) = Suc n + sum n";
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    13
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    14
text{*\noindent
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    15
and induction, for example
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    16
*}
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    17
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    18
lemma "sum n + sum n = n*(Suc n)";
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    19
apply(induct_tac n);
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9834
diff changeset
    20
apply(auto);
59d6633835fa *** empty log message ***
nipkow
parents: 9834
diff changeset
    21
done
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
    22
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    23
text{*\newcommand{\mystar}{*%
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    24
}
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    25
\index{arithmetic operations!for \protect\isa{nat}}%
12329
8743e8305611 minor textual tweaks
paulson
parents: 12327
diff changeset
    26
The arithmetic operations \ttindexboldpos{+}{$HOL2arithfun},
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    27
\ttindexboldpos{-}{$HOL2arithfun}, \ttindexboldpos{\mystar}{$HOL2arithfun},
11428
332347b9b942 tidying the index
paulson
parents: 11418
diff changeset
    28
\sdx{div}, \sdx{mod}, \cdx{min} and
332347b9b942 tidying the index
paulson
parents: 11418
diff changeset
    29
\cdx{max} are predefined, as are the relations
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    30
\indexboldpos{\isasymle}{$HOL2arithrel} and
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    31
\ttindexboldpos{<}{$HOL2arithrel}. As usual, @{prop"m-n = (0::nat)"} if
10654
458068404143 *** empty log message ***
nipkow
parents: 10608
diff changeset
    32
@{prop"m<n"}. There is even a least number operation
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    33
\sdx{LEAST}\@.  For example, @{prop"(LEAST n. 0 < n) = Suc 0"}.
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    34
\begin{warn}\index{overloading}
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    35
  The constants \cdx{0} and \cdx{1} and the operations
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    36
  \ttindexboldpos{+}{$HOL2arithfun}, \ttindexboldpos{-}{$HOL2arithfun},
11428
332347b9b942 tidying the index
paulson
parents: 11418
diff changeset
    37
  \ttindexboldpos{\mystar}{$HOL2arithfun}, \cdx{min},
332347b9b942 tidying the index
paulson
parents: 11418
diff changeset
    38
  \cdx{max}, \indexboldpos{\isasymle}{$HOL2arithrel} and
12329
8743e8305611 minor textual tweaks
paulson
parents: 12327
diff changeset
    39
  \ttindexboldpos{<}{$HOL2arithrel} are overloaded: they are available
8743e8305611 minor textual tweaks
paulson
parents: 12327
diff changeset
    40
  not just for natural numbers but for other types as well.
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    41
  For example, given the goal @{text"x + 0 = x"}, there is nothing to indicate
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    42
  that you are talking about natural numbers. Hence Isabelle can only infer
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    43
  that @{term x} is of some arbitrary type where @{text 0} and @{text"+"} are
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    44
  declared. As a consequence, you will be unable to prove the
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    45
  goal. To alert you to such pitfalls, Isabelle flags numerals without a
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    46
  fixed type in its output: @{prop"x+0 = x"}. (In the absence of a numeral,
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    47
  it may take you some time to realize what has happened if @{text
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    48
  show_types} is not set).  In this particular example, you need to include
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    49
  an explicit type constraint, for example @{text"x+0 = (x::nat)"}. If there
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    50
  is enough contextual information this may not be necessary: @{prop"Suc x =
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    51
  x"} automatically implies @{text"x::nat"} because @{term Suc} is not
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    52
  overloaded.
10978
5eebea8f359f *** empty log message ***
nipkow
parents: 10971
diff changeset
    53
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    54
  For details on overloading see \S\ref{sec:overloading}.
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    55
  Table~\ref{tab:overloading} in the appendix shows the most important
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    56
  overloaded operations.
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    57
\end{warn}
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    58
\begin{warn}
12329
8743e8305611 minor textual tweaks
paulson
parents: 12327
diff changeset
    59
  Constant @{text"1::nat"} is defined to equal @{term"Suc 0"}. This definition
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    60
  (see \S\ref{sec:ConstDefinitions}) is unfolded automatically by some
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    61
  tactics (like @{text auto}, @{text simp} and @{text arith}) but not by
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    62
  others (especially the single step tactics in Chapter~\ref{chap:rules}).
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    63
  If you need the full set of numerals, see~\S\ref{sec:numerals}.
5a4d78204492 *** empty log message ***
nipkow
parents: 11711
diff changeset
    64
  \emph{Novices are advised to stick to @{term"0::nat"} and @{term Suc}.}
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    65
\end{warn}
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    66
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    67
Both @{text auto} and @{text simp}
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    68
(a method introduced below, \S\ref{sec:Simplification}) prove 
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    69
simple arithmetic goals automatically:
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    70
*}
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    71
11711
ecdfd237ffee fixed numerals;
wenzelm
parents: 11458
diff changeset
    72
lemma "\<lbrakk> \<not> m < n; m < n + (1::nat) \<rbrakk> \<Longrightarrow> m = n"
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    73
(*<*)by(auto)(*>*)
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    74
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    75
text{*\noindent
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11457
diff changeset
    76
For efficiency's sake, this built-in prover ignores quantified formulae,
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11457
diff changeset
    77
logical connectives, and all arithmetic operations apart from addition.
13181
dc393bbee6ce *** empty log message ***
nipkow
parents: 12699
diff changeset
    78
In consequence, @{text auto} and @{text simp} cannot prove this slightly more complex goal:
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11457
diff changeset
    79
*}
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    80
13181
dc393bbee6ce *** empty log message ***
nipkow
parents: 12699
diff changeset
    81
lemma "m \<noteq> (n::nat) \<Longrightarrow> m < n \<or> n < m"
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11457
diff changeset
    82
(*<*)by(arith)(*>*)
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11457
diff changeset
    83
13996
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
    84
text{*\noindent The method \methdx{arith} is more general.  It attempts to
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
    85
prove the first subgoal provided it is a \textbf{linear arithmetic} formula.
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
    86
Such formulas may involve the usual logical connectives (@{text"\<not>"},
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
    87
@{text"\<and>"}, @{text"\<or>"}, @{text"\<longrightarrow>"}, @{text"="},
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
    88
@{text"\<forall>"}, @{text"\<exists>"}), the relations @{text"="},
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
    89
@{text"\<le>"} and @{text"<"}, and the operations @{text"+"}, @{text"-"},
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
    90
@{term min} and @{term max}.  For example, *}
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    91
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    92
lemma "min i (max j (k*k)) = max (min (k*k) i) (min i (j::nat))";
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    93
apply(arith)
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    94
(*<*)done(*>*)
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    95
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    96
text{*\noindent
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    97
succeeds because @{term"k*k"} can be treated as atomic. In contrast,
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    98
*}
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
    99
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
   100
lemma "n*n = n \<Longrightarrow> n=0 \<or> n=1"
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
   101
(*<*)oops(*>*)
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
   102
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
   103
text{*\noindent
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
   104
is not proved even by @{text arith} because the proof relies 
13996
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
   105
on properties of multiplication. Only multiplication by numerals (which is
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
   106
the same as iterated addition) is allowed.
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
   107
13996
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
   108
\begin{warn} The running time of @{text arith} is exponential in the number
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
   109
  of occurrences of \ttindexboldpos{-}{$HOL2arithfun}, \cdx{min} and
11428
332347b9b942 tidying the index
paulson
parents: 11418
diff changeset
   110
  \cdx{max} because they are first eliminated by case distinctions.
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
   111
13996
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
   112
If @{text k} is a numeral, \sdx{div}~@{text k}, \sdx{mod}~@{text k} and
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
   113
@{text k}~\sdx{dvd} are also supported, where the former two are eliminated
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
   114
by case distinctions, again blowing up the running time.
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
   115
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
   116
If the formula involves explicit quantifiers, @{text arith} may take
a994b92ab1ea *** empty log message ***
nipkow
parents: 13181
diff changeset
   117
super-exponential time and space.
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
   118
\end{warn}
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
   119
*}
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10171
diff changeset
   120
8745
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   121
(*<*)
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   122
end
13b32661dde4 I wonder which files i forgot.
nipkow
parents:
diff changeset
   123
(*>*)