src/Doc/Datatypes/Datatypes.thy
author blanchet
Thu, 12 Sep 2013 00:07:46 +0200
changeset 53553 d4191bf88529
parent 53552 eed6efba4e3f
child 53554 78fe0002024d
permissions -rw-r--r--
avoid a keyword
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
     1
(*  Title:      Doc/Datatypes/Datatypes.thy
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
     2
    Author:     Jasmin Blanchette, TU Muenchen
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
     3
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
     4
Tutorial for (co)datatype definitions with the new package.
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
     5
*)
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
     6
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
     7
theory Datatypes
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
     8
imports Setup
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
     9
begin
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    10
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
    11
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
    12
section {* Introduction
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
    13
  \label{sec:introduction} *}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    14
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    15
text {*
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    16
The 2013 edition of Isabelle introduced a new definitional package for freely
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    17
generated datatypes and codatatypes. The datatype support is similar to that
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    18
provided by the earlier package due to Berghofer and Wenzel
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    19
\cite{Berghofer-Wenzel:1999:TPHOL}, documented in the Isar reference manual
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
    20
\cite{isabelle-isar-ref}; indeed, replacing the keyword \keyw{datatype} by
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    21
@{command datatype_new} is usually all that is needed to port existing theories
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    22
to use the new package.
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    23
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
    24
Perhaps the main advantage of the new package is that it supports recursion
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
    25
through a large class of non-datatypes, comprising finite sets:
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    26
*}
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    27
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    28
    datatype_new 'a tree\<^sub>f\<^sub>s = Node\<^sub>f\<^sub>s 'a "'a tree\<^sub>f\<^sub>s fset"
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    29
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    30
text {*
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    31
\noindent
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    32
Another strong point is the support for local definitions:
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    33
*}
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    34
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    35
    context linorder
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    36
    begin
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
    37
    datatype_new flag = Less | Eq | Greater
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    38
    end
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    39
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    40
text {*
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    41
\noindent
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    42
The package also provides some convenience, notably automatically generated
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
    43
discriminators and selectors.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    44
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    45
In addition to plain inductive datatypes, the new package supports coinductive
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    46
datatypes, or \emph{codatatypes}, which may have infinite values. For example,
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    47
the following command introduces the type of lazy lists, which comprises both
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    48
finite and infinite values:
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    49
*}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    50
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    51
    codatatype 'a llist (*<*)(map: lmap) (*>*)= LNil | LCons 'a "'a llist"
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    52
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    53
text {*
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    54
\noindent
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    55
Mixed inductive--coinductive recursion is possible via nesting. Compare the
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    56
following four Rose tree examples:
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    57
*}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    58
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    59
(*<*)
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    60
    locale dummy_tree
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    61
    begin
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    62
(*>*)
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    63
    datatype_new 'a tree\<^sub>f\<^sub>f = Node\<^sub>f\<^sub>f 'a "'a tree\<^sub>f\<^sub>f list"
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    64
    datatype_new 'a tree\<^sub>f\<^sub>i = Node\<^sub>f\<^sub>i 'a "'a tree\<^sub>f\<^sub>i llist"
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    65
    codatatype 'a tree\<^sub>i\<^sub>f = Node\<^sub>i\<^sub>f 'a "'a tree\<^sub>i\<^sub>f list"
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    66
    codatatype 'a tree\<^sub>i\<^sub>i = Node\<^sub>i\<^sub>i 'a "'a tree\<^sub>i\<^sub>i llist"
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    67
(*<*)
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    68
    end
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    69
(*>*)
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    70
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    71
text {*
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    72
The first two tree types allow only finite branches, whereas the last two allow
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    73
branches of infinite length. Orthogonally, the nodes in the first and third
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    74
types have finite branching, whereas those of the second and fourth may have
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    75
infinitely many direct subtrees.
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    76
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    77
To use the package, it is necessary to import the @{theory BNF} theory, which
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
    78
can be precompiled into the \texttt{HOL-BNF} image. The following commands show
52806
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
    79
how to launch jEdit/PIDE with the image loaded and how to build the image
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
    80
without launching jEdit:
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    81
*}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    82
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    83
text {*
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    84
\noindent
52806
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
    85
\ \ \ \ \texttt{isabelle jedit -l HOL-BNF} \\
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
    86
\noindent
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
    87
\hbox{}\ \ \ \ \texttt{isabelle build -b HOL-BNF}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    88
*}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    89
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    90
text {*
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    91
The package, like its predecessor, fully adheres to the LCF philosophy
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    92
\cite{mgordon79}: The characteristic theorems associated with the specified
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    93
(co)datatypes are derived rather than introduced axiomatically.%
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
    94
\footnote{If the @{text quick_and_dirty} option is enabled, some of the
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
    95
internal constructions and most of the internal proof obligations are skipped.}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    96
The package's metatheory is described in a pair of papers
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
    97
\cite{traytel-et-al-2012,blanchette-et-al-wit}. The central notion is that of a
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
    98
\emph{bounded natural functor} (BNF)---a well-behaved type constructor for which
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
    99
nested (co)recursion is supported.
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
   100
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   101
This tutorial is organized as follows:
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   102
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   103
\begin{itemize}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   104
\setlength{\itemsep}{0pt}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   105
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   106
\item Section \ref{sec:defining-datatypes}, ``Defining Datatypes,''
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   107
describes how to specify datatypes using the @{command datatype_new} command.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   108
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
   109
\item Section \ref{sec:defining-recursive-functions}, ``Defining Recursive
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   110
Functions,'' describes how to specify recursive functions using
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   111
@{command primrec_new}, \keyw{fun}, and \keyw{function}.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   112
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   113
\item Section \ref{sec:defining-codatatypes}, ``Defining Codatatypes,''
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   114
describes how to specify codatatypes using the @{command codatatype} command.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   115
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
   116
\item Section \ref{sec:defining-corecursive-functions}, ``Defining Corecursive
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   117
Functions,'' describes how to specify corecursive functions using the
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   118
@{command primcorec} command.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   119
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
   120
\item Section \ref{sec:registering-bounded-natural-functors}, ``Registering
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   121
Bounded Natural Functors,'' explains how to use the @{command bnf} command
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   122
to register arbitrary type constructors as BNFs.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   123
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   124
\item Section
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   125
\ref{sec:generating-destructors-and-theorems-for-free-constructors},
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   126
``Generating Destructors and Theorems for Free Constructors,'' explains how to
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   127
use the command @{command wrap_free_constructors} to derive destructor constants
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   128
and theorems for freely generated types, as performed internally by @{command
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   129
datatype_new} and @{command codatatype}.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   130
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   131
\item Section \ref{sec:standard-ml-interface}, ``Standard ML Interface,''
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   132
describes the package's programmatic interface.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   133
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   134
\item Section \ref{sec:interoperability}, ``Interoperability,''
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   135
is concerned with the packages' interaction with other Isabelle packages and
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   136
tools, such as the code generator and the counterexample generators.
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   137
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
   138
\item Section \ref{sec:known-bugs-and-limitations}, ``Known Bugs and
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   139
Limitations,'' concludes with known open issues at the time of writing.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   140
\end{itemize}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   141
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   142
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   143
\newbox\boxA
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   144
\setbox\boxA=\hbox{\texttt{nospam}}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   145
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   146
\newcommand\authoremaili{\texttt{blan{\color{white}nospam}\kern-\wd\boxA{}chette@\allowbreak
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   147
in.\allowbreak tum.\allowbreak de}}
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   148
\newcommand\authoremailii{\texttt{lore{\color{white}nospam}\kern-\wd\boxA{}nz.panny@\allowbreak
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   149
\allowbreak tum.\allowbreak de}}
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   150
\newcommand\authoremailiii{\texttt{pope{\color{white}nospam}\kern-\wd\boxA{}scua@\allowbreak
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   151
in.\allowbreak tum.\allowbreak de}}
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   152
\newcommand\authoremailiv{\texttt{tray{\color{white}nospam}\kern-\wd\boxA{}tel@\allowbreak
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   153
in.\allowbreak tum.\allowbreak de}}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   154
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   155
The commands @{command datatype_new} and @{command primrec_new} are expected to
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   156
displace \keyw{datatype} and \keyw{primrec} in a future release. Authors of new
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   157
theories are encouraged to use the new commands, and maintainers of older
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   158
theories may want to consider upgrading.
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   159
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   160
Comments and bug reports concerning either the tool or this tutorial should be
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   161
directed to the authors at \authoremaili, \authoremailii, \authoremailiii,
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   162
and \authoremailiv.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   163
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   164
\begin{framed}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   165
\noindent
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   166
\textbf{Warning:} This tutorial is under heavy construction. Please apologise
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   167
for its appearance. If you have ideas regarding material that should be
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   168
included, please let the authors know.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   169
\end{framed}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   170
*}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   171
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   172
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   173
section {* Defining Datatypes
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   174
  \label{sec:defining-datatypes} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   175
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   176
text {*
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   177
This section describes how to specify datatypes using the @{command
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   178
datatype_new} command. The command is first illustrated through concrete
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   179
examples featuring different flavors of recursion. More examples can be found in
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   180
the directory \verb|~~/src/HOL/BNF/Examples|.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   181
*}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
   182
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   183
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
   184
subsection {* Examples
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
   185
  \label{ssec:datatype-examples} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   186
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   187
subsubsection {* Nonrecursive Types *}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   188
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   189
text {*
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   190
Datatypes are introduced by specifying the desired names and argument types for
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   191
their constructors. \emph{Enumeration} types are the simplest form of datatype.
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   192
All their constructors are nullary:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   193
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   194
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   195
    datatype_new trool = Truue | Faalse | Perhaaps
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   196
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   197
text {*
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   198
\noindent
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   199
Here, @{const Truue}, @{const Faalse}, and @{const Perhaaps} have the type @{typ trool}.
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   200
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   201
Polymorphic types are possible, such as the following option type, modeled after
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   202
its homologue from the @{theory Option} theory:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   203
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   204
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   205
(*<*)
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   206
    hide_const None Some
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   207
(*>*)
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   208
    datatype_new 'a option = None | Some 'a
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   209
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   210
text {*
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   211
\noindent
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   212
The constructors are @{text "None :: 'a option"} and
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   213
@{text "Some :: 'a \<Rightarrow> 'a option"}.
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   214
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   215
The next example has three type parameters:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   216
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   217
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   218
    datatype_new ('a, 'b, 'c) triple = Triple 'a 'b 'c
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   219
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   220
text {*
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   221
\noindent
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   222
The constructor is
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   223
@{text "Triple :: 'a \<Rightarrow> 'b \<Rightarrow> 'c \<Rightarrow> ('a, 'b, 'c) triple"}.
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   224
Unlike in Standard ML, curried constructors are supported. The uncurried variant
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   225
is also possible:
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   226
*}
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   227
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   228
    datatype_new ('a, 'b, 'c) triple\<^sub>u = Triple\<^sub>u "'a * 'b * 'c"
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   229
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   230
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   231
subsubsection {* Simple Recursion *}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   232
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   233
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   234
Natural numbers are the simplest example of a recursive type:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   235
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   236
53332
c97a05a26dd6 Doc improvements
traytel
parents: 53331
diff changeset
   237
    datatype_new nat = Zero | Suc nat
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   238
(*<*)
53332
c97a05a26dd6 Doc improvements
traytel
parents: 53331
diff changeset
   239
    (* FIXME: remove once "datatype_new" is integrated with "fun" *)
c97a05a26dd6 Doc improvements
traytel
parents: 53331
diff changeset
   240
    datatype_new_compat nat
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   241
(*>*)
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   242
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   243
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   244
\noindent
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   245
Lists were shown in the introduction. Terminated lists are a variant:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   246
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   247
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   248
(*<*)
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   249
    locale dummy_tlist
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   250
    begin
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   251
(*>*)
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   252
    datatype_new ('a, 'b) tlist = TNil 'b | TCons 'a "('a, 'b) tlist"
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   253
(*<*)
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   254
    end
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   255
(*>*)
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   256
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   257
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   258
\noindent
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   259
Occurrences of nonatomic types on the right-hand side of the equal sign must be
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   260
enclosed in double quotes, as is customary in Isabelle.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   261
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   262
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   263
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   264
subsubsection {* Mutual Recursion *}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   265
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   266
text {*
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   267
\emph{Mutually recursive} types are introduced simultaneously and may refer to
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   268
each other. The example below introduces a pair of types for even and odd
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   269
natural numbers:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   270
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   271
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   272
    datatype_new enat = EZero | ESuc onat
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   273
    and onat = OSuc enat
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   274
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   275
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   276
\noindent
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   277
Arithmetic expressions are defined via terms, terms via factors, and factors via
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   278
expressions:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   279
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   280
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   281
    datatype_new ('a, 'b) exp =
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   282
      Term "('a, 'b) trm" | Sum "('a, 'b) trm" "('a, 'b) exp"
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   283
    and ('a, 'b) trm =
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   284
      Factor "('a, 'b) fct" | Prod "('a, 'b) fct" "('a, 'b) trm"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   285
    and ('a, 'b) fct =
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   286
      Const 'a | Var 'b | Expr "('a, 'b) exp"
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   287
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   288
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   289
subsubsection {* Nested Recursion *}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   290
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   291
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   292
\emph{Nested recursion} occurs when recursive occurrences of a type appear under
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   293
a type constructor. The introduction showed some examples of trees with nesting
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   294
through lists. A more complex example, that reuses our @{text option} type,
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   295
follows:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   296
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   297
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   298
    datatype_new 'a btree =
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   299
      BNode 'a "'a btree option" "'a btree option"
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   300
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   301
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   302
\noindent
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   303
Not all nestings are admissible. For example, this command will fail:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   304
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   305
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   306
    datatype_new 'a wrong = Wrong (*<*)'a
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   307
    typ (*>*)"'a wrong \<Rightarrow> 'a"
52806
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   308
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   309
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   310
\noindent
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   311
The issue is that the function arrow @{text "\<Rightarrow>"} allows recursion
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   312
only through its right-hand side. This issue is inherited by polymorphic
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   313
datatypes defined in terms of~@{text "\<Rightarrow>"}:
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   314
*}
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   315
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   316
    datatype_new ('a, 'b) fn = Fn "'a \<Rightarrow> 'b"
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   317
    datatype_new 'a also_wrong = Also_Wrong (*<*)'a
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   318
    typ (*>*)"('a also_wrong, 'a) fn"
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   319
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   320
text {*
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   321
\noindent
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   322
In general, type constructors @{text "('a\<^sub>1, \<dots>, 'a\<^sub>m) t"}
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   323
allow recursion on a subset of their type arguments @{text 'a\<^sub>1}, \ldots,
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   324
@{text 'a\<^sub>m}. These type arguments are called \emph{live}; the remaining
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   325
type arguments are called \emph{dead}. In @{typ "'a \<Rightarrow> 'b"} and
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   326
@{typ "('a, 'b) fn"}, the type variable @{typ 'a} is dead and @{typ 'b} is live.
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   327
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   328
Type constructors must be registered as bounded natural functors (BNFs) to have
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   329
live arguments. This is done automatically for datatypes and codatatypes
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   330
introduced by the @{command datatype_new} and @{command codatatype} commands.
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   331
Section~\ref{sec:registering-bounded-natural-functors} explains how to register
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   332
arbitrary type constructors as BNFs.
52806
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   333
*}
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   334
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   335
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   336
subsubsection {* Auxiliary Constants and Syntaxes *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   337
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   338
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   339
The @{command datatype_new} command introduces various constants in addition to
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   340
the constructors. Given a type @{text "('a\<^sub>1, \<dots>, 'a\<^sub>m) t"}
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   341
with $m > 0$ live type variables and $n$ constructors
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   342
@{text "t.C\<^sub>1"}, \ldots, @{text "t.C\<^sub>n"}, the
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   343
following auxiliary constants are introduced (among others):
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   344
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   345
\begin{itemize}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   346
\setlength{\itemsep}{0pt}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   347
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   348
\item \relax{Case combinator}: @{text t_case} (rendered using the familiar
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   349
@{text case}--@{text of} syntax)
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   350
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   351
\item \relax{Iterator}: @{text t_fold}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   352
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   353
\item \relax{Recursor}: @{text t_rec}
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   354
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   355
\item \relax{Discriminators}: @{text "t.is_C\<^sub>1"}, \ldots,
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   356
@{text "t.is_C\<^sub>n"}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   357
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   358
\item \relax{Selectors}:
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   359
@{text t.un_C\<^sub>11}$, \ldots, @{text t.un_C\<^sub>1k\<^sub>1}, \\
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   360
\phantom{\relax{Selectors:}} \quad\vdots \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   361
\phantom{\relax{Selectors:}} @{text t.un_C\<^sub>n1}$, \ldots, @{text t.un_C\<^sub>nk\<^sub>n}.
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   362
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   363
\item \relax{Set functions} (or \relax{natural transformations}):
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   364
@{text t_set1}, \ldots, @{text t_setm}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   365
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   366
\item \relax{Map function} (or \relax{functorial action}): @{text t_map}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   367
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   368
\item \relax{Relator}: @{text t_rel}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   369
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   370
\end{itemize}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   371
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   372
\noindent
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   373
The case combinator, discriminators, and selectors are collectively called
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   374
\emph{destructors}. The prefix ``@{text "t."}'' is an optional component of the
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   375
name and is normally hidden. The set functions, map function, relator,
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   376
discriminators, and selectors can be given custom names, as in the example
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   377
below:
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   378
*}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   379
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   380
(*<*)
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   381
    no_translations
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   382
      "[x, xs]" == "x # [xs]"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   383
      "[x]" == "x # []"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   384
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   385
    no_notation
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   386
      Nil ("[]") and
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   387
      Cons (infixr "#" 65)
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   388
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   389
    hide_type list
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   390
    hide_const Nil Cons hd tl set map list_all2 list_case list_rec
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   391
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   392
    locale dummy_list
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   393
    begin
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   394
(*>*)
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   395
    datatype_new (set: 'a) list (map: map rel: list_all2) =
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   396
      null: Nil (defaults tl: Nil)
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   397
    | Cons (hd: 'a) (tl: "'a list")
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   398
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   399
text {*
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   400
\noindent
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   401
The command introduces a discriminator @{const null} and a pair of selectors
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   402
@{const hd} and @{const tl} characterized as follows:
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   403
%
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   404
\[@{thm list.collapse(1)[of xs, no_vars]}
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   405
  \qquad @{thm list.collapse(2)[of xs, no_vars]}\]
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   406
%
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   407
For two-constructor datatypes, a single discriminator constant suffices. The
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   408
discriminator associated with @{const Cons} is simply
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   409
@{term "\<lambda>xs. \<not> null xs"}.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   410
53553
d4191bf88529 avoid a keyword
blanchet
parents: 53552
diff changeset
   411
The @{text defaults} clause following the @{const Nil} constructor specifies a
d4191bf88529 avoid a keyword
blanchet
parents: 53552
diff changeset
   412
default value for selectors associated with other constructors. Here, it is used
d4191bf88529 avoid a keyword
blanchet
parents: 53552
diff changeset
   413
to ensure that the tail of the empty list is itself (instead of being left
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   414
unspecified).
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   415
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   416
Because @{const Nil} is a nullary constructor, it is also possible to use
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   417
@{term "\<lambda>xs. xs = Nil"} as a discriminator. This is specified by
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   418
entering ``@{text "="}'' instead of the identifier @{const null}. Although this
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   419
may look appealing, the mixture of constructors and selectors in the
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   420
characteristic theorems can lead Isabelle's automation to switch between the
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   421
constructor and the destructor view in surprising ways.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   422
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   423
The usual mixfix syntaxes are available for both types and constructors. For
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   424
example:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   425
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   426
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   427
(*<*)
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   428
    end
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   429
(*>*)
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   430
    datatype_new ('a, 'b) prod (infixr "*" 20) = Pair 'a 'b
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   431
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   432
text {* \blankline *}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   433
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   434
    datatype_new (set: 'a) list (map: map rel: list_all2) =
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   435
      null: Nil ("[]")
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   436
    | Cons (hd: 'a) (tl: "'a list") (infixr "#" 65)
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   437
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   438
text {*
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   439
\noindent
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   440
Incidentally, this is how the traditional syntaxes can be set up:
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   441
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   442
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   443
    syntax "_list" :: "args \<Rightarrow> 'a list" ("[(_)]")
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   444
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   445
text {* \blankline *}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   446
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   447
    translations
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   448
      "[x, xs]" == "x # [xs]"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   449
      "[x]" == "x # []"
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   450
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   451
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
   452
subsection {* Syntax
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
   453
  \label{ssec:datatype-syntax} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   454
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   455
text {*
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   456
Datatype definitions have the following general syntax:
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   457
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   458
@{rail "
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   459
  @@{command_def datatype_new} target? @{syntax dt_options}? \\
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   460
    (@{syntax dt_name} '=' (@{syntax ctor} + '|') + @'and')
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   461
  ;
52969
f2df0730f8ac clarified option name (since case/fold/rec are also destructors)
blanchet
parents: 52868
diff changeset
   462
  @{syntax_def dt_options}: '(' ((@'no_discs_sels' | @'rep_compat') + ',') ')'
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   463
"}
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   464
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   465
The syntactic quantity \synt{target} can be used to specify a local
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   466
context---e.g., @{text "(in linorder)"}. It is documented in the Isar reference
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   467
manual \cite{isabelle-isar-ref}.
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   468
%
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   469
The optional target is optionally followed by datatype-specific options:
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   470
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   471
\begin{itemize}
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   472
\setlength{\itemsep}{0pt}
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   473
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   474
\item
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   475
The \keyw{no\_discs\_sels} option indicates that no discriminators or selectors
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   476
should be generated.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   477
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   478
\item
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   479
The \keyw{rep\_compat} option indicates that the names generated by the
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   480
package should contain optional (and normally not displayed) ``@{text "new."}''
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   481
components to prevent clashes with a later call to \keyw{rep\_datatype}. See
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   482
Section~\ref{ssec:datatype-compatibility-issues} for details.
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   483
\end{itemize}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   484
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   485
The left-hand sides of the datatype equations specify the name of the type to
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   486
define, its type parameters, and additional information:
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   487
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   488
@{rail "
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   489
  @{syntax_def dt_name}: @{syntax tyargs}? name @{syntax map_rel}? mixfix?
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   490
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   491
  @{syntax_def tyargs}: typefree | '(' ((name ':')? typefree + ',') ')'
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   492
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   493
  @{syntax_def map_rel}: '(' ((('map' | 'rel') ':' name) +) ')'
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   494
"}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   495
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   496
\noindent
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   497
The syntactic quantity \synt{name} denotes an identifier, \synt{typefree}
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   498
denotes fixed type variable (@{typ 'a}, @{typ 'b}, \ldots), and \synt{mixfix}
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   499
denotes the usual parenthesized mixfix notation. They are documented in the Isar
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   500
reference manual \cite{isabelle-isar-ref}.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   501
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   502
The optional names preceding the type variables allow to override the default
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   503
names of the set functions (@{text t_set1}, \ldots, @{text t_setM}).
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   504
Inside a mutually recursive datatype specification, all defined datatypes must
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   505
specify exactly the same type variables in the same order.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   506
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   507
@{rail "
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   508
  @{syntax_def ctor}: (name ':')? name (@{syntax ctor_arg} * ) \\
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   509
    @{syntax dt_sel_defaults}? mixfix?
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   510
"}
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   511
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   512
\medskip
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   513
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   514
\noindent
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   515
The main constituents of a constructor specification is the name of the
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   516
constructor and the list of its argument types. An optional discriminator name
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   517
can be supplied at the front to override the default name (@{text t.un_Cji}).
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   518
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   519
@{rail "
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   520
  @{syntax_def ctor_arg}: type | '(' name ':' type ')'
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   521
"}
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   522
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   523
\medskip
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   524
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   525
\noindent
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   526
In addition to the type of a constructor argument, it is possible to specify a
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   527
name for the corresponding selector to override the default name
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   528
(@{text t.un_C}$_{ij}$). The same selector names can be reused for several
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   529
constructors as long as they have the same type.
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   530
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   531
@{rail "
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   532
  @{syntax_def dt_sel_defaults}: '(' @'defaults' (name ':' term +) ')'
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   533
"}
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   534
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   535
\noindent
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   536
Given a constructor
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   537
@{text "C \<Colon> \<sigma>\<^sub>1 \<Rightarrow> \<dots> \<Rightarrow> \<sigma>\<^sub>p \<Rightarrow> \<sigma>"},
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   538
default values can be specified for any selector
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   539
@{text "un_D \<Colon> \<sigma> \<Rightarrow> \<tau>"}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   540
associated with other constructors. The specified default value must be of type
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   541
@{text "\<sigma>\<^sub>1 \<Rightarrow> \<dots> \<Rightarrow> \<sigma>\<^sub>p \<Rightarrow> \<tau>"}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   542
(i.e., it may depends on @{text C}'s arguments).
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   543
*}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   544
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
   545
subsection {* Generated Theorems
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
   546
  \label{ssec:datatype-generated-theorems} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   547
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   548
text {*
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   549
The characteristic theorems generated by @{command datatype_new} are grouped in
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   550
two broad categories:
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   551
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   552
\begin{itemize}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   553
\item The \emph{free constructor theorems} are properties about the constructors
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   554
and destructors that can be derived for any freely generated type. Internally,
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   555
the derivation is performed by @{command wrap_free_constructors}.
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   556
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   557
\item The \emph{functorial theorems} are properties of datatypes related to
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   558
their BNF nature.
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   559
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   560
\item The \emph{inductive theorems} are properties of datatypes related to
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   561
their inductive nature.
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   562
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   563
\end{itemize}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   564
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   565
\noindent
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   566
The full list of named theorems can be obtained as usual by entering the
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   567
command \keyw{print\_theorems} immediately after the datatype definition.
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   568
This list normally excludes low-level theorems that reveal internal
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   569
constructions. To make these accessible, add the line
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   570
*}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   571
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   572
    declare [[bnf_note_all]]
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   573
(*<*)
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   574
    declare [[bnf_note_all = false]]
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   575
(*>*)
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   576
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   577
text {*
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   578
\noindent
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   579
to the top of the theory file.
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   580
*}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   581
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   582
subsubsection {* Free Constructor Theorems *}
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   583
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   584
(*<*)
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   585
    consts is_Cons :: 'a
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   586
(*>*)
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   587
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   588
text {*
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   589
The first subgroup of properties are concerned with the constructors.
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   590
They are listed below for @{typ "'a list"}:
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   591
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   592
\begin{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   593
\begin{description}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   594
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   595
\item[@{text "t."}\hthm{inject} @{text "[iff, induct_simp]"}\upshape:] ~ \\
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   596
@{thm list.inject[no_vars]}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   597
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   598
\item[@{text "t."}\hthm{distinct} @{text "[simp, induct_simp]"}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   599
@{thm list.distinct(1)[no_vars]} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   600
@{thm list.distinct(2)[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   601
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   602
\item[@{text "t."}\hthm{exhaust} @{text "[cases t, case_names C\<^sub>1 \<dots> C\<^sub>n]"}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   603
@{thm list.exhaust[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   604
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   605
\item[@{text "t."}\hthm{nchotomy}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   606
@{thm list.nchotomy[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   607
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   608
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   609
\end{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   610
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   611
\noindent
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   612
The next subgroup is concerned with the case combinator:
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   613
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   614
\begin{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   615
\begin{description}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   616
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   617
\item[@{text "t."}\hthm{case} @{text "[simp]"}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   618
@{thm list.case(1)[no_vars]} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   619
@{thm list.case(2)[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   620
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   621
\item[@{text "t."}\hthm{case\_cong}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   622
@{thm list.case_cong[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   623
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   624
\item[@{text "t."}\hthm{weak\_case\_cong} @{text "[cong]"}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   625
@{thm list.weak_case_cong[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   626
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   627
\item[@{text "t."}\hthm{split}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   628
@{thm list.split[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   629
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   630
\item[@{text "t."}\hthm{split\_asm}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   631
@{thm list.split_asm[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   632
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   633
\item[@{text "t."}\hthm{splits} = @{text "split split_asm"}]
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   634
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   635
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   636
\end{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   637
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   638
\noindent
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   639
The third and last subgroup revolves around discriminators and selectors:
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   640
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   641
\begin{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   642
\begin{description}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   643
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   644
\item[@{text "t."}\hthm{discs} @{text "[simp]"}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   645
@{thm list.discs(1)[no_vars]} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   646
@{thm list.discs(2)[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   647
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   648
\item[@{text "t."}\hthm{sels} @{text "[simp]"}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   649
@{thm list.sels(1)[no_vars]} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   650
@{thm list.sels(2)[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   651
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   652
\item[@{text "t."}\hthm{collapse} @{text "[simp]"}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   653
@{thm list.collapse(1)[no_vars]} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   654
@{thm list.collapse(2)[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   655
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   656
\item[@{text "t."}\hthm{disc\_exclude}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   657
These properties are missing for @{typ "'a list"} because there is only one
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   658
proper discriminator. Had the datatype been introduced with a second
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   659
discriminator called @{const is_Cons}, they would have read thusly: \\[\jot]
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   660
@{prop "null list \<Longrightarrow> \<not> is_Cons list"} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   661
@{prop "is_Cons list \<Longrightarrow> \<not> null list"}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   662
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   663
\item[@{text "t."}\hthm{disc\_exhaust} @{text "[case_names C\<^sub>1 \<dots> C\<^sub>n]"}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   664
@{thm list.disc_exhaust[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   665
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   666
\item[@{text "t."}\hthm{expand}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   667
@{thm list.expand[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   668
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   669
\item[@{text "t."}\hthm{case\_conv}\upshape:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   670
@{thm list.case_conv[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   671
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   672
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   673
\end{indentblock}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   674
*}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   675
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   676
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   677
subsubsection {* Functorial Theorems *}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   678
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   679
text {*
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   680
The BNF-related theorem are listed below:
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   681
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   682
\begin{indentblock}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   683
\begin{description}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   684
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   685
\item[@{text "t."}\hthm{sets} @{text "[code]"}\upshape:] ~ \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   686
@{thm list.sets(1)[no_vars]} \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   687
@{thm list.sets(2)[no_vars]}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   688
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   689
\item[@{text "t."}\hthm{map} @{text "[code]"}\upshape:] ~ \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   690
@{thm list.map(1)[no_vars]} \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   691
@{thm list.map(2)[no_vars]}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   692
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   693
\item[@{text "t."}\hthm{rel\_inject} @{text "[code]"}\upshape:] ~ \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   694
@{thm list.rel_inject(1)[no_vars]} \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   695
@{thm list.rel_inject(2)[no_vars]}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   696
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   697
\item[@{text "t."}\hthm{rel\_distinct} @{text "[code]"}\upshape:] ~ \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   698
@{thm list.rel_distinct(1)[no_vars]} \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   699
@{thm list.rel_distinct(2)[no_vars]}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   700
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   701
\end{description}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   702
\end{indentblock}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   703
*}
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   704
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   705
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   706
subsubsection {* Inductive Theorems *}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   707
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   708
text {*
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   709
The inductive theorems are listed below:
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   710
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   711
\begin{indentblock}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   712
\begin{description}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   713
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   714
\item[@{text "t."}\hthm{induct} @{text "[induct t, case_names C\<^sub>1 \<dots> C\<^sub>n]"}\upshape:] ~ \\
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   715
@{thm list.induct[no_vars]}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   716
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   717
\item[@{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{induct} @{text "[case_names C\<^sub>1 \<dots> C\<^sub>n]"}\upshape:] ~ \\
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   718
Given $m > 1$ mutually recursive datatypes, this induction rule can be used to
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   719
prove $m$ properties simultaneously.
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   720
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   721
\item[@{text "t."}\hthm{fold} @{text "[code]"}\upshape:] ~ \\
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   722
@{thm list.fold(1)[no_vars]} \\
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   723
@{thm list.fold(2)[no_vars]}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   724
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   725
\item[@{text "t."}\hthm{rec} @{text "[code]"}\upshape:] ~ \\
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   726
@{thm list.rec(1)[no_vars]} \\
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   727
@{thm list.rec(2)[no_vars]}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   728
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   729
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   730
\end{indentblock}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   731
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   732
\noindent
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   733
For convenience, @{command datatype_new} also provides the following collection:
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   734
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   735
\begin{indentblock}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   736
\begin{description}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   737
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   738
\item[@{text "t."}\hthm{simps} = @{text t.inject} @{text t.distinct} @{text t.case} @{text t.rec} @{text t.fold} @{text t.map} @{text t.rel_inject}] ~ \\
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   739
@{text t.rel_distinct} @{text t.sets}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   740
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   741
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   742
\end{indentblock}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   743
*}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   744
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   745
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   746
subsection {* Compatibility Issues
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   747
  \label{ssec:datatype-compatibility-issues} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   748
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   749
text {*
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   750
  * main incompabilities between two packages
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   751
    * differences in theorem names (e.g. singular vs. plural for some props?)
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   752
    * differences in "simps"?
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   753
    * different recursor/induction in nested case
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   754
        * discussed in Section~\ref{sec:defining-recursive-functions}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   755
    * different ML interfaces / extension mechanisms
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   756
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   757
  * register new datatype as old datatype
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   758
    * motivation:
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   759
      * do recursion through new datatype in old datatype
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   760
        (e.g. useful when porting to the new package one type at a time)
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   761
      * use old primrec
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   762
      * use fun
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   763
      * use extensions like size (needed for fun), the AFP order, Quickcheck,
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   764
        Nitpick
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   765
      * provide exactly the same theorems with the same names (compatibility)
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   766
    * option 1
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   767
      * \keyw{rep\_compat}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   768
      * \keyw{rep\_datatype}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   769
      * has some limitations
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   770
        * mutually recursive datatypes? (fails with rep_datatype?)
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   771
        * nested datatypes? (fails with datatype_new?)
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   772
    * option 2
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   773
      * @{command datatype_new_compat}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   774
      * not fully implemented yet?
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   775
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   776
@{rail "
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   777
  @@{command_def datatype_new_compat} types
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   778
"}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   779
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   780
  * register old datatype as new datatype
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   781
    * no clean way yet
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   782
    * if the goal is to do recursion through old datatypes, can register it as
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   783
      a BNF (Section XXX)
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   784
    * can also derive destructors etc. using @{command wrap_free_constructors}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   785
      (Section XXX)
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   786
*}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   787
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
   788
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   789
section {* Defining Recursive Functions
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   790
  \label{sec:defining-recursive-functions} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   791
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   792
text {*
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   793
This describes how to specify recursive functions over datatypes specified using
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   794
@{command datatype_new}. The focus in on the @{command primrec_new} command,
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   795
which supports primitive recursion. A few examples feature the \keyw{fun} and
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   796
\keyw{function} commands, described in a separate tutorial
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   797
\cite{isabelle-function}.
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   798
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   799
%%% TODO: partial_function?
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   800
*}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
   801
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   802
text {*
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   803
More examples in \verb|~~/src/HOL/BNF/Examples|.
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   804
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   805
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
   806
subsection {* Examples
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
   807
  \label{ssec:primrec-examples} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   808
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   809
subsubsection {* Nonrecursive Types *}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   810
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   811
text {*
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   812
  * simple (depth 1) pattern matching on the left-hand side
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   813
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   814
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   815
    primrec_new bool_of_trool :: "trool \<Rightarrow> bool" where
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   816
      "bool_of_trool Faalse = False" |
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   817
      "bool_of_trool Truue = True"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   818
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   819
text {*
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   820
  * OK to specify the cases in a different order
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   821
  * OK to leave out some case (but get a warning -- maybe we need a "quiet"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   822
    or "silent" flag?)
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   823
    * case is then unspecified
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   824
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   825
More examples:
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   826
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   827
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   828
    primrec_new the_list :: "'a option \<Rightarrow> 'a list" where
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   829
      "the_list None = []" |
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   830
      "the_list (Some a) = [a]"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   831
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   832
    primrec_new the_default :: "'a \<Rightarrow> 'a option \<Rightarrow> 'a" where
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   833
      "the_default d None = d" |
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   834
      "the_default _ (Some a) = a"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   835
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   836
    primrec_new mirrror :: "('a, 'b, 'c) triple \<Rightarrow> ('c, 'b, 'a) triple" where
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   837
      "mirrror (Triple a b c) = Triple c b a"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   838
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   839
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   840
subsubsection {* Simple Recursion *}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   841
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   842
text {*
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   843
again, simple pattern matching on left-hand side, but possibility
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   844
to call a function recursively on an argument to a constructor:
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   845
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   846
53330
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
   847
    primrec_new replicate :: "nat \<Rightarrow> 'a \<Rightarrow> 'a list" where
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
   848
      "replicate Zero _ = []" |
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
   849
      "replicate (Suc n) a = a # replicate n a"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   850
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   851
text {*
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   852
we don't like the confusing name @{const nth}:
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   853
*}
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   854
53332
c97a05a26dd6 Doc improvements
traytel
parents: 53331
diff changeset
   855
    primrec_new at :: "'a list \<Rightarrow> nat \<Rightarrow> 'a" where
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   856
      "at (a # as) j =
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   857
         (case j of
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   858
            Zero \<Rightarrow> a
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   859
          | Suc j' \<Rightarrow> at as j')"
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   860
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   861
(*<*)
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   862
    context dummy_tlist
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   863
    begin
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   864
(*>*)
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   865
    primrec_new tfold :: "('a \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> ('a, 'b) tlist \<Rightarrow> 'b" where
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   866
      "tfold _ (TNil b) = b" |
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   867
      "tfold f (TCons a as) = f a (tfold f as)"
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   868
(*<*)
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   869
    end
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   870
(*>*)
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   871
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   872
text {*
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   873
Show one example where fun is needed.
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   874
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   875
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   876
subsubsection {* Mutual Recursion *}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   877
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   878
text {*
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   879
E.g., converting even/odd naturals to plain old naturals:
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   880
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   881
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   882
    primrec_new
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   883
      nat_of_enat :: "enat \<Rightarrow> nat" and
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   884
      nat_of_onat :: "onat => nat"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   885
    where
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   886
      "nat_of_enat EZero = Zero" |
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   887
      "nat_of_enat (ESuc n) = Suc (nat_of_onat n)" |
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   888
      "nat_of_onat (OSuc n) = Suc (nat_of_enat n)"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   889
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   890
text {*
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   891
Mutual recursion is be possible within a single type, but currently only using fun:
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   892
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   893
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   894
    fun
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   895
      even :: "nat \<Rightarrow> bool" and
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   896
      odd :: "nat \<Rightarrow> bool"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   897
    where
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   898
      "even Zero = True" |
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   899
      "even (Suc n) = odd n" |
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   900
      "odd Zero = False" |
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   901
      "odd (Suc n) = even n"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   902
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   903
text {*
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   904
More elaborate example that works with primrec_new:
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   905
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   906
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   907
    primrec_new
53330
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
   908
      eval\<^sub>e :: "('a \<Rightarrow> int) \<Rightarrow> ('b \<Rightarrow> int) \<Rightarrow> ('a, 'b) exp \<Rightarrow> int" and
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
   909
      eval\<^sub>t :: "('a \<Rightarrow> int) \<Rightarrow> ('b \<Rightarrow> int) \<Rightarrow> ('a, 'b) trm \<Rightarrow> int" and
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
   910
      eval\<^sub>f :: "('a \<Rightarrow> int) \<Rightarrow> ('b \<Rightarrow> int) \<Rightarrow> ('a, 'b) fct \<Rightarrow> int"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   911
    where
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   912
      "eval\<^sub>e \<gamma> \<xi> (Term t) = eval\<^sub>t \<gamma> \<xi> t" |
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   913
      "eval\<^sub>e \<gamma> \<xi> (Sum t e) = eval\<^sub>t \<gamma> \<xi> t + eval\<^sub>e \<gamma> \<xi> e" |
53330
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
   914
      "eval\<^sub>t \<gamma> \<xi> (Factor f) = eval\<^sub>f \<gamma> \<xi> f" |
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   915
      "eval\<^sub>t \<gamma> \<xi> (Prod f t) = eval\<^sub>f \<gamma> \<xi> f + eval\<^sub>t \<gamma> \<xi> t" |
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   916
      "eval\<^sub>f \<gamma> _ (Const a) = \<gamma> a" |
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   917
      "eval\<^sub>f _ \<xi> (Var b) = \<xi> b" |
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   918
      "eval\<^sub>f \<gamma> \<xi> (Expr e) = eval\<^sub>e \<gamma> \<xi> e"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   919
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   920
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   921
subsubsection {* Nested Recursion *}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   922
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   923
(*<*)
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   924
    datatype_new 'a tree\<^sub>f\<^sub>f = Node\<^sub>f\<^sub>f 'a "'a tree\<^sub>f\<^sub>f list"
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   925
    datatype_new 'a tree\<^sub>f\<^sub>i = Node\<^sub>f\<^sub>i 'a "'a tree\<^sub>f\<^sub>i llist"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   926
(*>*)
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   927
    primrec_new at\<^sub>f\<^sub>f :: "'a tree\<^sub>f\<^sub>f \<Rightarrow> nat list \<Rightarrow> 'a" where
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   928
      "at\<^sub>f\<^sub>f (Node\<^sub>f\<^sub>f a ts) js =
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   929
         (case js of
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   930
            [] \<Rightarrow> a
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   931
          | j # js' \<Rightarrow> at (map (\<lambda>t. at\<^sub>f\<^sub>f t js') ts) j)"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   932
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   933
text {*
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   934
Explain @{const lmap}.
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   935
*}
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   936
53335
585b2fee55e5 fixed bug in primrec_new (allow indirect recursion through constructor arguments other than the first)
panny
parents: 53332
diff changeset
   937
(*<*)
585b2fee55e5 fixed bug in primrec_new (allow indirect recursion through constructor arguments other than the first)
panny
parents: 53332
diff changeset
   938
    locale sum_btree_nested
585b2fee55e5 fixed bug in primrec_new (allow indirect recursion through constructor arguments other than the first)
panny
parents: 53332
diff changeset
   939
      begin
585b2fee55e5 fixed bug in primrec_new (allow indirect recursion through constructor arguments other than the first)
panny
parents: 53332
diff changeset
   940
(*>*)
585b2fee55e5 fixed bug in primrec_new (allow indirect recursion through constructor arguments other than the first)
panny
parents: 53332
diff changeset
   941
    primrec_new sum_btree :: "('a\<Colon>{zero,plus}) btree \<Rightarrow> 'a" where
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   942
      "sum_btree (BNode a lt rt) =
53330
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
   943
         a + the_default 0 (option_map sum_btree lt) +
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
   944
           the_default 0 (option_map sum_btree rt)"
53335
585b2fee55e5 fixed bug in primrec_new (allow indirect recursion through constructor arguments other than the first)
panny
parents: 53332
diff changeset
   945
(*<*)
585b2fee55e5 fixed bug in primrec_new (allow indirect recursion through constructor arguments other than the first)
panny
parents: 53332
diff changeset
   946
    end
585b2fee55e5 fixed bug in primrec_new (allow indirect recursion through constructor arguments other than the first)
panny
parents: 53332
diff changeset
   947
(*>*)
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   948
53136
98a2c33d5d1b ideas for (co)datatype docs
blanchet
parents: 53028
diff changeset
   949
text {*
98a2c33d5d1b ideas for (co)datatype docs
blanchet
parents: 53028
diff changeset
   950
Show example with function composition (ftree).
98a2c33d5d1b ideas for (co)datatype docs
blanchet
parents: 53028
diff changeset
   951
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   952
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   953
subsubsection {* Nested-as-Mutual Recursion *}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   954
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   955
text {*
53136
98a2c33d5d1b ideas for (co)datatype docs
blanchet
parents: 53028
diff changeset
   956
  * can pretend a nested type is mutually recursive (if purely inductive)
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   957
  * avoids the higher-order map
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   958
  * e.g.
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   959
*}
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   960
53331
20440c789759 prove theorem in the right context (that knows about local variables)
traytel
parents: 53330
diff changeset
   961
    primrec_new
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   962
      at_tree\<^sub>f\<^sub>f :: "'a tree\<^sub>f\<^sub>f \<Rightarrow> nat list \<Rightarrow> 'a" and
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   963
      at_trees\<^sub>f\<^sub>f :: "'a tree\<^sub>f\<^sub>f list \<Rightarrow> nat \<Rightarrow> nat list \<Rightarrow> 'a"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   964
    where
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   965
      "at_tree\<^sub>f\<^sub>f (Node\<^sub>f\<^sub>f a ts) js =
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   966
         (case js of
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   967
            [] \<Rightarrow> a
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   968
          | j # js' \<Rightarrow> at_trees\<^sub>f\<^sub>f ts j js')" |
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   969
      "at_trees\<^sub>f\<^sub>f (t # ts) j =
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   970
         (case j of
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   971
            Zero \<Rightarrow> at_tree\<^sub>f\<^sub>f t
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   972
          | Suc j' \<Rightarrow> at_trees\<^sub>f\<^sub>f ts j')"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   973
53331
20440c789759 prove theorem in the right context (that knows about local variables)
traytel
parents: 53330
diff changeset
   974
    primrec_new
53330
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
   975
      sum_btree :: "('a\<Colon>{zero,plus}) btree \<Rightarrow> 'a" and
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
   976
      sum_btree_option :: "'a btree option \<Rightarrow> 'a"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   977
    where
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   978
      "sum_btree (BNode a lt rt) =
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   979
         a + sum_btree_option lt + sum_btree_option rt" |
53330
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
   980
      "sum_btree_option None = 0" |
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   981
      "sum_btree_option (Some t) = sum_btree t"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   982
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   983
text {*
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   984
  * this can always be avoided;
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   985
     * e.g. in our previous example, we first mapped the recursive
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   986
       calls, then we used a generic at function to retrieve the result
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   987
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   988
  * there's no hard-and-fast rule of when to use one or the other,
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   989
    just like there's no rule when to use fold and when to use
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   990
    primrec_new
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   991
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   992
  * higher-order approach, considering nesting as nesting, is more
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   993
    compositional -- e.g. we saw how we could reuse an existing polymorphic
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   994
    at or the_default, whereas @{text at_trees\<^sub>f\<^sub>f} is much more specific
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   995
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   996
  * but:
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   997
     * is perhaps less intuitive, because it requires higher-order thinking
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   998
     * may seem inefficient, and indeed with the code generator the
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   999
       mutually recursive version might be nicer
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1000
     * is somewhat indirect -- must apply a map first, then compute a result
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1001
       (cannot mix)
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1002
     * the auxiliary functions like @{text at_trees\<^sub>f\<^sub>f} are sometimes useful in own right
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1003
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1004
  * impact on automation unclear
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1005
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1006
%%% TODO: change text antiquotation to const once the real primrec is used
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1007
*}
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1008
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1009
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1010
subsection {* Syntax
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1011
  \label{ssec:primrec-syntax} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1012
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1013
text {*
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1014
Primitive recursive functions have the following general syntax:
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1015
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1016
@{rail "
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1017
  @@{command_def primrec_new} target? fixes \\ @'where'
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1018
    (@{syntax primrec_equation} + '|')
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1019
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  1020
  @{syntax_def primrec_equation}: thmdecl? prop
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1021
"}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1022
*}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1023
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1024
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1025
subsection {* Generated Theorems
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1026
  \label{ssec:primrec-generated-theorems} *}
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1027
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1028
text {*
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1029
  * synthesized nonrecursive definition
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1030
  * user specification is rederived from it, exactly as entered
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1031
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1032
  * induct
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1033
    * mutualized
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1034
    * without some needless induction hypotheses if not used
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1035
  * fold, rec
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1036
    * mutualized
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1037
*}
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1038
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1039
subsection {* Recursive Default Values for Selectors
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1040
  \label{ssec:recursive-default-values-for-selectors} *}
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1041
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1042
text {*
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1043
A datatype selector @{text un_D} can have a default value for each constructor
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1044
on which it is not otherwise specified. Occasionally, it is useful to have the
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1045
default value be defined recursively. This produces a chicken-and-egg situation
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1046
that appears unsolvable, because the datatype is not introduced yet at the
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1047
moment when the selectors are introduced. Of course, we can always define the
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1048
selectors manually afterward, but we then have to state and prove all the
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1049
characteristic theorems ourselves instead of letting the package do it.
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1050
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1051
Fortunately, there is a fairly elegant workaround that relies on overloading and
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1052
that avoids the tedium of manual derivations:
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1053
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1054
\begin{enumerate}
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1055
\setlength{\itemsep}{0pt}
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1056
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1057
\item
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1058
Introduce a fully unspecified constant @{text "un_D\<^sub>0 \<Colon> 'a"} using
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1059
@{keyword consts}.
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1060
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1061
\item
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1062
Define the datatype, specifying @{text "un_D\<^sub>0"} as the selector's default
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1063
value.
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1064
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1065
\item
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1066
Define the behavior of @{text "un_D\<^sub>0"} on values of the newly introduced
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1067
datatype using the \keyw{overloading} command.
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1068
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1069
\item
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1070
Derive the desired equation on @{text un_D} from the characteristic equations
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1071
for @{text "un_D\<^sub>0"}.
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1072
\end{enumerate}
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1073
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1074
The following example illustrates this procedure:
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1075
*}
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1076
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1077
    consts termi\<^sub>0 :: 'a
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1078
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
  1079
    datatype_new ('a, 'b) tlist =
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1080
      TNil (termi: 'b) (defaults ttl: TNil)
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
  1081
    | TCons (thd: 'a) (ttl : "('a, 'b) tlist") (defaults termi: "\<lambda>_ xs. termi\<^sub>0 xs")
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1082
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1083
    overloading
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
  1084
      termi\<^sub>0 \<equiv> "termi\<^sub>0 \<Colon> ('a, 'b) tlist \<Rightarrow> 'b"
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1085
    begin
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
  1086
    primrec_new termi\<^sub>0 :: "('a, 'b) tlist \<Rightarrow> 'b" where
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1087
    "termi\<^sub>0 (TNil y) = y" |
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1088
    "termi\<^sub>0 (TCons x xs) = termi\<^sub>0 xs"
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1089
    end
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1090
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1091
    lemma terminal_TCons[simp]: "termi (TCons x xs) = termi xs"
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1092
    by (cases xs) auto
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1093
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1094
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1095
subsection {* Compatibility Issues
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1096
  \label{ssec:datatype-compatibility-issues} *}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1097
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1098
text {*
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1099
  * different induction in nested case
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1100
    * solution: define nested-as-mutual functions with primrec,
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1101
      and look at .induct
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1102
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1103
  * different induction and recursor in nested case
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1104
    * only matters to low-level users; they can define a dummy function to force
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1105
      generation of mutualized recursor
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1106
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1107
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1108
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1109
section {* Defining Codatatypes
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1110
  \label{sec:defining-codatatypes} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1111
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1112
text {*
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1113
This section describes how to specify codatatypes using the @{command codatatype}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1114
command.
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1115
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1116
  * libraries include some useful codatatypes, notably lazy lists;
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1117
    see the ``Coinductive'' AFP entry \cite{xxx} for an elaborate library
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1118
*}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1119
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1120
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1121
subsection {* Examples
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1122
  \label{ssec:codatatype-examples} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1123
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1124
text {*
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1125
More examples in \verb|~~/src/HOL/BNF/Examples|.
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1126
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1127
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1128
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1129
subsection {* Syntax
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1130
  \label{ssec:codatatype-syntax} *}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1131
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1132
text {*
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1133
Definitions of codatatypes have almost exactly the same syntax as for datatypes
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1134
(Section~\ref{ssec:datatype-syntax}), with two exceptions: The command is called
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
  1135
@{command codatatype}; the \keyw{no\_discs\_sels} option is not available,
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
  1136
because destructors are a central notion for codatatypes.
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1137
*}
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1138
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1139
subsection {* Generated Theorems
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1140
  \label{ssec:codatatype-generated-theorems} *}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1141
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1142
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1143
section {* Defining Corecursive Functions
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1144
  \label{sec:defining-corecursive-functions} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1145
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1146
text {*
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1147
This section describes how to specify corecursive functions using the
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1148
@{command primcorec} command.
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1149
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1150
%%% TODO: partial_function? E.g. for defining tail recursive function on lazy
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1151
%%% lists (cf. terminal0 in TLList.thy)
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1152
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1153
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1154
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1155
subsection {* Examples
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1156
  \label{ssec:primcorec-examples} *}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1157
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1158
text {*
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1159
More examples in \verb|~~/src/HOL/BNF/Examples|.
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1160
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1161
Also, for default values, the same trick as for datatypes is possible for
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1162
codatatypes (Section~\ref{ssec:recursive-default-values-for-selectors}).
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1163
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1164
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1165
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1166
subsection {* Syntax
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1167
  \label{ssec:primcorec-syntax} *}
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1168
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1169
text {*
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1170
Primitive corecursive definitions have the following general syntax:
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1171
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1172
@{rail "
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1173
  @@{command_def primcorec} target? fixes \\ @'where'
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1174
    (@{syntax primcorec_formula} + '|')
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1175
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  1176
  @{syntax_def primcorec_formula}: thmdecl? prop (@'of' (term * ))?
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1177
"}
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1178
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1179
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1180
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1181
subsection {* Generated Theorems
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1182
  \label{ssec:primcorec-generated-theorems} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1183
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1184
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1185
section {* Registering Bounded Natural Functors
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1186
  \label{sec:registering-bounded-natural-functors} *}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1187
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1188
text {*
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1189
This section explains how to set up the (co)datatype package to allow nested
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1190
recursion through custom well-behaved type constructors. The key concept is that
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1191
of a bounded natural functor (BNF).
52829
591e76f2651e minor doc fixes
blanchet
parents: 52828
diff changeset
  1192
591e76f2651e minor doc fixes
blanchet
parents: 52828
diff changeset
  1193
    * @{command bnf}
591e76f2651e minor doc fixes
blanchet
parents: 52828
diff changeset
  1194
    * @{command print_bnfs}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1195
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1196
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1197
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1198
subsection {* Example
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1199
  \label{ssec:bnf-examples} *}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1200
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1201
text {*
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1202
More examples in \verb|~~/src/HOL/BNF/Basic_BNFs.thy| and
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1203
\verb|~~/src/HOL/BNF/More_BNFs.thy|.
52806
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
  1204
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
  1205
Mention distinction between live and dead type arguments;
53136
98a2c33d5d1b ideas for (co)datatype docs
blanchet
parents: 53028
diff changeset
  1206
  * and existence of map, set for those
52806
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
  1207
mention =>.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1208
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1209
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1210
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1211
subsection {* Syntax
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1212
  \label{ssec:bnf-syntax} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1213
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1214
text {*
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1215
@{rail "
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1216
  @@{command_def bnf} target? (name ':')? term \\
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  1217
    term_list term term_list term?
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1218
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  1219
  X_list: '[' (X + ',') ']'
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1220
"}
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1221
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1222
options: no_discs_sels rep_compat
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1223
*}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1224
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
  1225
section {* Generating Destructors and Theorems for Free Constructors
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
  1226
  \label{sec:generating-destructors-and-theorems-for-free-constructors} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1227
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1228
text {*
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1229
This section explains how to derive convenience theorems for free constructors,
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1230
as performed internally by @{command datatype_new} and @{command codatatype}.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1231
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1232
  * need for this is rare but may arise if you want e.g. to add destructors to
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1233
    a type not introduced by ...
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1234
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1235
  * also useful for compatibility with old package, e.g. add destructors to
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1236
    old \keyw{datatype}
52829
591e76f2651e minor doc fixes
blanchet
parents: 52828
diff changeset
  1237
591e76f2651e minor doc fixes
blanchet
parents: 52828
diff changeset
  1238
  * @{command wrap_free_constructors}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
  1239
    * \keyw{no\_discs\_sels}, \keyw{rep\_compat}
52969
f2df0730f8ac clarified option name (since case/fold/rec are also destructors)
blanchet
parents: 52868
diff changeset
  1240
    * hack to have both co and nonco view via locale (cf. ext nats)
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1241
*}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1242
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1243
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1244
subsection {* Example
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1245
  \label{ssec:ctors-examples} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1246
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1247
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1248
subsection {* Syntax
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1249
  \label{ssec:ctors-syntax} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1250
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1251
text {*
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1252
Free constructor wrapping has the following general syntax:
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1253
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1254
@{rail "
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1255
  @@{command_def wrap_free_constructors} target? @{syntax dt_options} \\
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  1256
    term_list name @{syntax fc_discs_sels}?
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1257
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  1258
  @{syntax_def fc_discs_sels}: name_list (name_list_list name_term_list_list? )?
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1259
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  1260
  @{syntax_def name_term}: (name ':' term)
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1261
"}
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1262
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1263
options: no_discs_sels rep_compat
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1264
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1265
X_list is as for BNF
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1266
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
  1267
Section~\ref{ssec:datatype-generated-theorems} lists the generated theorems.
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1268
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1269
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1270
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1271
section {* Standard ML Interface
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1272
  \label{sec:standard-ml-interface} *}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1273
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1274
text {*
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1275
This section describes the package's programmatic interface.
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1276
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1277
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1278
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1279
section {* Interoperability
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1280
  \label{sec:interoperability} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1281
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1282
text {*
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1283
This section is concerned with the packages' interaction with other Isabelle
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1284
packages and tools, such as the code generator and the counterexample
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1285
generators.
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1286
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1287
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1288
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1289
subsection {* Transfer and Lifting
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1290
  \label{ssec:transfer-and-lifting} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1291
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1292
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1293
subsection {* Code Generator
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1294
  \label{ssec:code-generator} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1295
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1296
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1297
subsection {* Quickcheck
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1298
  \label{ssec:quickcheck} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1299
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1300
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1301
subsection {* Nitpick
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1302
  \label{ssec:nitpick} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1303
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1304
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1305
subsection {* Nominal Isabelle
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1306
  \label{ssec:nominal-isabelle} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1307
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1308
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1309
section {* Known Bugs and Limitations
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1310
  \label{sec:known-bugs-and-limitations} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1311
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1312
text {*
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1313
This section lists known open issues of the package.
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1314
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1315
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1316
text {*
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
  1317
* primcorec is unfinished
52806
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
  1318
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1319
* slow n-ary mutual (co)datatype, avoid as much as possible (e.g. using nesting)
52806
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
  1320
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
  1321
* issues with HOL-Proofs?
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
  1322
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
  1323
* partial documentation
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
  1324
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
  1325
* too much output by commands like "datatype_new" and "codatatype"
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1326
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1327
* no direct way to define recursive functions for default values -- but show trick
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1328
  based on overloading
53259
d6d813d7e702 documentation ideas
blanchet
parents: 53136
diff changeset
  1329
d6d813d7e702 documentation ideas
blanchet
parents: 53136
diff changeset
  1330
* no way to register "sum" and "prod" as (co)datatypes to enable N2M reduction for them
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
  1331
  (for @{command datatype_new_compat} and prim(co)rec)
53259
d6d813d7e702 documentation ideas
blanchet
parents: 53136
diff changeset
  1332
d6d813d7e702 documentation ideas
blanchet
parents: 53136
diff changeset
  1333
* no way to register same type as both data- and codatatype?
53262
23927b18dce2 rationalize message generation + added a warning
blanchet
parents: 53259
diff changeset
  1334
23927b18dce2 rationalize message generation + added a warning
blanchet
parents: 53259
diff changeset
  1335
* no recursion through unused arguments (unlike with the old package)
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1336
*}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1337
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1338
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1339
section {* Acknowledgments
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1340
  \label{sec:acknowledgments} *}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1341
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1342
text {*
52829
591e76f2651e minor doc fixes
blanchet
parents: 52828
diff changeset
  1343
Tobias Nipkow and Makarius Wenzel made this work possible. Andreas Lochbihler
591e76f2651e minor doc fixes
blanchet
parents: 52828
diff changeset
  1344
provided lots of comments on earlier versions of the package, especially for the
591e76f2651e minor doc fixes
blanchet
parents: 52828
diff changeset
  1345
coinductive part. Brian Huffman suggested major simplifications to the internal
591e76f2651e minor doc fixes
blanchet
parents: 52828
diff changeset
  1346
constructions, much of which has yet to be implemented. Florian Haftmann and
591e76f2651e minor doc fixes
blanchet
parents: 52828
diff changeset
  1347
Christian Urban provided general advice advice on Isabelle and package writing.
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1348
Stefan Milius and Lutz Schr\"oder suggested an elegant proof to eliminate one of
52829
591e76f2651e minor doc fixes
blanchet
parents: 52828
diff changeset
  1349
the BNF assumptions.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1350
*}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1351
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1352
end