doc-src/TutorialI/Types/Overloading2.thy
author paulson
Tue, 18 Dec 2001 17:15:41 +0100
changeset 12541 c6e454ec501c
parent 12334 60bf75e157e4
child 14357 e49d5d5ae66a
permissions -rw-r--r--
new type definition figure
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10305
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     1
(*<*)theory Overloading2 = Overloading1:(*>*)
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     2
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     3
text{*
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     4
Of course this is not the only possible definition of the two relations.
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
     5
Componentwise comparison of lists of equal length also makes sense. This time
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
     6
the elements of the list must also be of class @{text ordrel} to permit their
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
     7
comparison:
10305
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     8
*}
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
     9
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    10
instance list :: (ordrel)ordrel
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    11
by intro_classes
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    12
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    13
defs (overloaded)
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    14
le_list_def: "xs <<= (ys::'a::ordrel list) \<equiv>
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    15
              size xs = size ys \<and> (\<forall>i<size xs. xs!i <<= ys!i)"
adff80268127 *** empty log message ***
nipkow
parents:
diff changeset
    16
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    17
text{*\noindent
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    18
The infix function @{text"!"} yields the nth element of a list.
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
    19
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
    20
\begin{warn}
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
    21
A type constructor can be instantiated in only one way to
12334
60bf75e157e4 *** empty log message ***
nipkow
parents: 11494
diff changeset
    22
a given type class.  For example, our two instantiations of @{text list} must
60bf75e157e4 *** empty log message ***
nipkow
parents: 11494
diff changeset
    23
reside in separate theories with disjoint scopes.
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
    24
\end{warn}
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10328
diff changeset
    25
*}
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10328
diff changeset
    26
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10761
diff changeset
    27
subsubsection{*Predefined Overloading*}
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10328
diff changeset
    28
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10328
diff changeset
    29
text{*
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10328
diff changeset
    30
HOL comes with a number of overloaded constants and corresponding classes.
10978
5eebea8f359f *** empty log message ***
nipkow
parents: 10971
diff changeset
    31
The most important ones are listed in Table~\ref{tab:overloading} in the appendix. They are
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10885
diff changeset
    32
defined on all numeric types and sometimes on other types as well, for example
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
    33
$-$ and @{text"\<le>"} on sets.
10396
5ab08609e6c8 *** empty log message ***
nipkow
parents: 10328
diff changeset
    34
10696
76d7f6c9a14c *** empty log message ***
nipkow
parents: 10654
diff changeset
    35
In addition there is a special input syntax for bounded quantifiers:
76d7f6c9a14c *** empty log message ***
nipkow
parents: 10654
diff changeset
    36
\begin{center}
76d7f6c9a14c *** empty log message ***
nipkow
parents: 10654
diff changeset
    37
\begin{tabular}{lcl}
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10978
diff changeset
    38
@{text"\<forall>x \<le> y. P x"} & @{text"\<rightharpoonup>"} & @{prop"\<forall>x. x \<le> y \<longrightarrow> P x"} \\
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10978
diff changeset
    39
@{text"\<exists>x \<le> y. P x"} & @{text"\<rightharpoonup>"} & @{prop"\<exists>x. x \<le> y \<and> P x"}
10696
76d7f6c9a14c *** empty log message ***
nipkow
parents: 10654
diff changeset
    40
\end{tabular}
76d7f6c9a14c *** empty log message ***
nipkow
parents: 10654
diff changeset
    41
\end{center}
76d7f6c9a14c *** empty log message ***
nipkow
parents: 10654
diff changeset
    42
And analogously for @{text"<"} instead of @{text"\<le>"}.
11277
a2bff98d6e5d *** empty log message ***
nipkow
parents: 11196
diff changeset
    43
The form on the left is translated into the one on the right upon input.
a2bff98d6e5d *** empty log message ***
nipkow
parents: 11196
diff changeset
    44
For technical reasons, it is not translated back upon output.
10328
bf33cbd76c05 *** empty log message ***
nipkow
parents: 10305
diff changeset
    45
*}(*<*)end(*>*)