doc-src/TutorialI/Misc/document/natsum.tex
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:
9722
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
     1
%
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
     2
\begin{isabellebody}%
9924
3370f6aa3200 updated;
wenzelm
parents: 9834
diff changeset
     3
\def\isabellecontext{natsum}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
     4
\isamarkupfalse%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     5
%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     6
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     7
\noindent
9541
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 9458
diff changeset
     8
In particular, there are \isa{case}-expressions, for example
d17c0b34d5c8 *** empty log message ***
nipkow
parents: 9458
diff changeset
     9
\begin{isabelle}%
10187
0376cccd9118 *** empty log message ***
nipkow
parents: 10171
diff changeset
    10
\ \ \ \ \ case\ n\ of\ {\isadigit{0}}\ {\isasymRightarrow}\ {\isadigit{0}}\ {\isacharbar}\ Suc\ m\ {\isasymRightarrow}\ m%
9924
3370f6aa3200 updated;
wenzelm
parents: 9834
diff changeset
    11
\end{isabelle}
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    12
primitive recursion, for example%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    13
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    14
\isamarkuptrue%
9673
1b2d4f995b13 updated;
wenzelm
parents: 9644
diff changeset
    15
\isacommand{consts}\ sum\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}nat\ {\isasymRightarrow}\ nat{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    16
\isamarkupfalse%
10187
0376cccd9118 *** empty log message ***
nipkow
parents: 10171
diff changeset
    17
\isacommand{primrec}\ {\isachardoublequote}sum\ {\isadigit{0}}\ {\isacharequal}\ {\isadigit{0}}{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    18
\ \ \ \ \ \ \ \ {\isachardoublequote}sum\ {\isacharparenleft}Suc\ n{\isacharparenright}\ {\isacharequal}\ Suc\ n\ {\isacharplus}\ sum\ n{\isachardoublequote}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    19
%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    20
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    21
\noindent
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    22
and induction, for example%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    23
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    24
\isamarkuptrue%
9673
1b2d4f995b13 updated;
wenzelm
parents: 9644
diff changeset
    25
\isacommand{lemma}\ {\isachardoublequote}sum\ n\ {\isacharplus}\ sum\ n\ {\isacharequal}\ n{\isacharasterisk}{\isacharparenleft}Suc\ n{\isacharparenright}{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    26
\isamarkupfalse%
9673
1b2d4f995b13 updated;
wenzelm
parents: 9644
diff changeset
    27
\isacommand{apply}{\isacharparenleft}induct{\isacharunderscore}tac\ n{\isacharparenright}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    28
\isamarkupfalse%
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9924
diff changeset
    29
\isacommand{apply}{\isacharparenleft}auto{\isacharparenright}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    30
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    31
\isacommand{done}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    32
%
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
    33
\begin{isamarkuptext}%
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
    34
\newcommand{\mystar}{*%
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
    35
}
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    36
\index{arithmetic operations!for \protect\isa{nat}}%
12332
aea72a834c85 *** empty log message ***
nipkow
parents: 12328
diff changeset
    37
The arithmetic operations \ttindexboldpos{+}{$HOL2arithfun},
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
    38
\ttindexboldpos{-}{$HOL2arithfun}, \ttindexboldpos{\mystar}{$HOL2arithfun},
11428
332347b9b942 tidying the index
paulson
parents: 11418
diff changeset
    39
\sdx{div}, \sdx{mod}, \cdx{min} and
332347b9b942 tidying the index
paulson
parents: 11418
diff changeset
    40
\cdx{max} are predefined, as are the relations
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
    41
\indexboldpos{\isasymle}{$HOL2arithrel} and
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    42
\ttindexboldpos{<}{$HOL2arithrel}. As usual, \isa{m\ {\isacharminus}\ n\ {\isacharequal}\ {\isadigit{0}}} if
10654
458068404143 *** empty log message ***
nipkow
parents: 10608
diff changeset
    43
\isa{m\ {\isacharless}\ n}. There is even a least number operation
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    44
\sdx{LEAST}\@.  For example, \isa{{\isacharparenleft}LEAST\ n{\isachardot}\ {\isadigit{0}}\ {\isacharless}\ n{\isacharparenright}\ {\isacharequal}\ Suc\ {\isadigit{0}}}.
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    45
\begin{warn}\index{overloading}
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    46
  The constants \cdx{0} and \cdx{1} and the operations
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
    47
  \ttindexboldpos{+}{$HOL2arithfun}, \ttindexboldpos{-}{$HOL2arithfun},
11428
332347b9b942 tidying the index
paulson
parents: 11418
diff changeset
    48
  \ttindexboldpos{\mystar}{$HOL2arithfun}, \cdx{min},
332347b9b942 tidying the index
paulson
parents: 11418
diff changeset
    49
  \cdx{max}, \indexboldpos{\isasymle}{$HOL2arithrel} and
12332
aea72a834c85 *** empty log message ***
nipkow
parents: 12328
diff changeset
    50
  \ttindexboldpos{<}{$HOL2arithrel} are overloaded: they are available
aea72a834c85 *** empty log message ***
nipkow
parents: 12328
diff changeset
    51
  not just for natural numbers but for other types as well.
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    52
  For example, given the goal \isa{x\ {\isacharplus}\ {\isadigit{0}}\ {\isacharequal}\ x}, there is nothing to indicate
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    53
  that you are talking about natural numbers. Hence Isabelle can only infer
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    54
  that \isa{x} is of some arbitrary type where \isa{{\isadigit{0}}} and \isa{{\isacharplus}} are
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    55
  declared. As a consequence, you will be unable to prove the
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    56
  goal. To alert you to such pitfalls, Isabelle flags numerals without a
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    57
  fixed type in its output: \isa{x\ {\isacharplus}\ {\isacharparenleft}{\isadigit{0}}{\isasymColon}{\isacharprime}a{\isacharparenright}\ {\isacharequal}\ x}. (In the absence of a numeral,
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    58
  it may take you some time to realize what has happened if \isa{show{\isacharunderscore}types} is not set).  In this particular example, you need to include
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    59
  an explicit type constraint, for example \isa{x{\isacharplus}{\isadigit{0}}\ {\isacharequal}\ {\isacharparenleft}x{\isacharcolon}{\isacharcolon}nat{\isacharparenright}}. If there
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    60
  is enough contextual information this may not be necessary: \isa{Suc\ x\ {\isacharequal}\ x} automatically implies \isa{x{\isacharcolon}{\isacharcolon}nat} because \isa{Suc} is not
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    61
  overloaded.
10978
5eebea8f359f *** empty log message ***
nipkow
parents: 10971
diff changeset
    62
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    63
  For details on overloading see \S\ref{sec:overloading}.
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    64
  Table~\ref{tab:overloading} in the appendix shows the most important
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    65
  overloaded operations.
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    66
\end{warn}
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    67
\begin{warn}
12332
aea72a834c85 *** empty log message ***
nipkow
parents: 12328
diff changeset
    68
  Constant \isa{{\isadigit{1}}{\isacharcolon}{\isacharcolon}nat} is defined to equal \isa{Suc\ {\isadigit{0}}}. This definition
12327
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    69
  (see \S\ref{sec:ConstDefinitions}) is unfolded automatically by some
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    70
  tactics (like \isa{auto}, \isa{simp} and \isa{arith}) but not by
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    71
  others (especially the single step tactics in Chapter~\ref{chap:rules}).
5a4d78204492 *** empty log message ***
nipkow
parents: 11866
diff changeset
    72
  If you need the full set of numerals, see~\S\ref{sec:numerals}.
12328
7c4ec77a8715 *** empty log message ***
nipkow
parents: 12327
diff changeset
    73
  \emph{Novices are advised to stick to \isa{{\isadigit{0}}} and \isa{Suc}.}
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
    74
\end{warn}
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
    75
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    76
Both \isa{auto} and \isa{simp}
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    77
(a method introduced below, \S\ref{sec:Simplification}) prove 
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    78
simple arithmetic goals automatically:%
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
    79
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    80
\isamarkuptrue%
13791
3b6ff7ceaf27 *** empty log message ***
nipkow
parents: 13778
diff changeset
    81
\isacommand{lemma}\ {\isachardoublequote}{\isasymlbrakk}\ {\isasymnot}\ m\ {\isacharless}\ n{\isacharsemicolon}\ m\ {\isacharless}\ n\ {\isacharplus}\ {\isacharparenleft}{\isadigit{1}}{\isacharcolon}{\isacharcolon}nat{\isacharparenright}\ {\isasymrbrakk}\ {\isasymLongrightarrow}\ m\ {\isacharequal}\ n{\isachardoublequote}\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    82
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    83
%
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
    84
\begin{isamarkuptext}%
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
    85
\noindent
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11457
diff changeset
    86
For efficiency's sake, this built-in prover ignores quantified formulae,
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11457
diff changeset
    87
logical connectives, and all arithmetic operations apart from addition.
13181
dc393bbee6ce *** empty log message ***
nipkow
parents: 12699
diff changeset
    88
In consequence, \isa{auto} and \isa{simp} cannot prove this slightly more complex goal:%
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11457
diff changeset
    89
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    90
\isamarkuptrue%
13791
3b6ff7ceaf27 *** empty log message ***
nipkow
parents: 13778
diff changeset
    91
\isacommand{lemma}\ {\isachardoublequote}m\ {\isasymnoteq}\ {\isacharparenleft}n{\isacharcolon}{\isacharcolon}nat{\isacharparenright}\ {\isasymLongrightarrow}\ m\ {\isacharless}\ n\ {\isasymor}\ n\ {\isacharless}\ m{\isachardoublequote}\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    92
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    93
%
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11457
diff changeset
    94
\begin{isamarkuptext}%
13996
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
    95
\noindent The method \methdx{arith} is more general.  It attempts to
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
    96
prove the first subgoal provided it is a \textbf{linear arithmetic} formula.
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
    97
Such formulas may involve the usual logical connectives (\isa{{\isasymnot}},
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
    98
\isa{{\isasymand}}, \isa{{\isasymor}}, \isa{{\isasymlongrightarrow}}, \isa{{\isacharequal}},
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
    99
\isa{{\isasymforall}}, \isa{{\isasymexists}}), the relations \isa{{\isacharequal}},
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
   100
\isa{{\isasymle}} and \isa{{\isacharless}}, and the operations \isa{{\isacharplus}}, \isa{{\isacharminus}},
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
   101
\isa{min} and \isa{max}.  For example,%
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
   102
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   103
\isamarkuptrue%
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
   104
\isacommand{lemma}\ {\isachardoublequote}min\ i\ {\isacharparenleft}max\ j\ {\isacharparenleft}k{\isacharasterisk}k{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ max\ {\isacharparenleft}min\ {\isacharparenleft}k{\isacharasterisk}k{\isacharparenright}\ i{\isacharparenright}\ {\isacharparenleft}min\ i\ {\isacharparenleft}j{\isacharcolon}{\isacharcolon}nat{\isacharparenright}{\isacharparenright}{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   105
\isamarkupfalse%
13791
3b6ff7ceaf27 *** empty log message ***
nipkow
parents: 13778
diff changeset
   106
\isacommand{apply}{\isacharparenleft}arith{\isacharparenright}\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   107
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   108
%
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
   109
\begin{isamarkuptext}%
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
   110
\noindent
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
   111
succeeds because \isa{k\ {\isacharasterisk}\ k} can be treated as atomic. In contrast,%
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
   112
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   113
\isamarkuptrue%
13791
3b6ff7ceaf27 *** empty log message ***
nipkow
parents: 13778
diff changeset
   114
\isacommand{lemma}\ {\isachardoublequote}n{\isacharasterisk}n\ {\isacharequal}\ n\ {\isasymLongrightarrow}\ n{\isacharequal}{\isadigit{0}}\ {\isasymor}\ n{\isacharequal}{\isadigit{1}}{\isachardoublequote}\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   115
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   116
%
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
   117
\begin{isamarkuptext}%
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
   118
\noindent
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
   119
is not proved even by \isa{arith} because the proof relies 
13996
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
   120
on properties of multiplication. Only multiplication by numerals (which is
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
   121
the same as iterated addition) is allowed.
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
   122
13996
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
   123
\begin{warn} The running time of \isa{arith} is exponential in the number
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
   124
  of occurrences of \ttindexboldpos{-}{$HOL2arithfun}, \cdx{min} and
11428
332347b9b942 tidying the index
paulson
parents: 11418
diff changeset
   125
  \cdx{max} because they are first eliminated by case distinctions.
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
   126
13996
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
   127
If \isa{k} is a numeral, \sdx{div}~\isa{k}, \sdx{mod}~\isa{k} and
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
   128
\isa{k}~\sdx{dvd} are also supported, where the former two are eliminated
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
   129
by case distinctions, again blowing up the running time.
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
   130
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
   131
If the formula involves explicit quantifiers, \isa{arith} may take
a994b92ab1ea *** empty log message ***
nipkow
parents: 13791
diff changeset
   132
super-exponential time and space.
10538
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
   133
\end{warn}%
d1bf9ca9008d *** empty log message ***
nipkow
parents: 10187
diff changeset
   134
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   135
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   136
\isamarkupfalse%
9722
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
   137
\end{isabellebody}%
9145
9f7b8de5bfaf updated;
wenzelm
parents: 8749
diff changeset
   138
%%% Local Variables:
9f7b8de5bfaf updated;
wenzelm
parents: 8749
diff changeset
   139
%%% mode: latex
9f7b8de5bfaf updated;
wenzelm
parents: 8749
diff changeset
   140
%%% TeX-master: "root"
9f7b8de5bfaf updated;
wenzelm
parents: 8749
diff changeset
   141
%%% End: