src/Doc/Datatypes/Datatypes.thy
author blanchet
Sun, 15 Sep 2013 23:02:23 +0200
changeset 53646 ac6e0a28489f
parent 53644 eb8362530715
child 53647 e78ebb290dd6
permissions -rw-r--r--
more (co)data docs
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
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
     3
    Author:     Lorenz Panny, TU Muenchen
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
     4
    Author:     Andrei Popescu, TU Muenchen
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
     5
    Author:     Dmitriy Traytel, TU Muenchen
52792
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
Tutorial for (co)datatype definitions with the new package.
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
     8
*)
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
     9
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    10
theory Datatypes
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
    11
imports Setup
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    12
keywords
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    13
  "primcorec_notyet" :: thy_decl
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    14
begin
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    15
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
    16
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    17
(*<*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    18
(* FIXME: Temporary setup until "primcorec" is fully implemented. *)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    19
ML_command {*
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    20
fun add_dummy_cmd _ _ lthy = lthy;
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    21
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    22
val _ = Outer_Syntax.local_theory @{command_spec "primcorec_notyet"} ""
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    23
  (Parse.fixes -- Parse_Spec.where_alt_specs >> uncurry add_dummy_cmd);
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    24
*}
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    25
(*>*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    26
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    27
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
    28
section {* Introduction
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
    29
  \label{sec:introduction} *}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    30
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    31
text {*
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    32
The 2013 edition of Isabelle introduced a new definitional package for freely
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    33
generated datatypes and codatatypes. The datatype support is similar to that
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    34
provided by the earlier package due to Berghofer and Wenzel
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    35
\cite{Berghofer-Wenzel:1999:TPHOL}, documented in the Isar reference manual
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
    36
\cite{isabelle-isar-ref}; indeed, replacing the keyword \keyw{datatype} by
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    37
@{command datatype_new} is usually all that is needed to port existing theories
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    38
to use the new package.
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    39
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
    40
Perhaps the main advantage of the new package is that it supports recursion
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
    41
through a large class of non-datatypes, such as finite sets:
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    42
*}
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    43
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    44
    datatype_new 'a tree\<^sub>f\<^sub>s = Node\<^sub>f\<^sub>s (lbl\<^sub>f\<^sub>s: 'a) (sub\<^sub>f\<^sub>s: "'a tree\<^sub>f\<^sub>s fset")
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    45
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    46
text {*
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    47
\noindent
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    48
Another strong point is the support for local definitions:
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    49
*}
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    50
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    51
    context linorder
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    52
    begin
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
    53
    datatype_new flag = Less | Eq | Greater
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    54
    end
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    55
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    56
text {*
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    57
\noindent
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    58
The package also provides some convenience, notably automatically generated
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
    59
discriminators and selectors.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    60
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    61
In addition to plain inductive datatypes, the new package supports coinductive
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    62
datatypes, or \emph{codatatypes}, which may have infinite values. For example,
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    63
the following command introduces the type of lazy lists, which comprises both
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    64
finite and infinite values:
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    65
*}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    66
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
    67
(*<*)
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
    68
    locale dummy_llist
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
    69
    begin
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
    70
(*>*)
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
    71
    codatatype 'a llist = LNil | LCons 'a "'a llist"
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    72
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    73
text {*
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    74
\noindent
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    75
Mixed inductive--coinductive recursion is possible via nesting. Compare the
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    76
following four Rose tree examples:
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    77
*}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    78
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    79
    datatype_new 'a tree\<^sub>f\<^sub>f = Node\<^sub>f\<^sub>f (lbl\<^sub>f\<^sub>f: 'a) (sub\<^sub>f\<^sub>f: "'a tree\<^sub>f\<^sub>f list")
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    80
    datatype_new 'a tree\<^sub>f\<^sub>i = Node\<^sub>f\<^sub>i (lbl\<^sub>f\<^sub>i: 'a) (sub\<^sub>f\<^sub>i: "'a tree\<^sub>f\<^sub>i llist")
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    81
    codatatype 'a tree\<^sub>i\<^sub>f = Node\<^sub>i\<^sub>f (lbl\<^sub>i\<^sub>f: 'a) (sub\<^sub>i\<^sub>f: "'a tree\<^sub>i\<^sub>f list")
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    82
    codatatype 'a tree\<^sub>i\<^sub>i = Node\<^sub>i\<^sub>i (lbl\<^sub>i\<^sub>i: 'a) (sub\<^sub>i\<^sub>i: "'a tree\<^sub>i\<^sub>i llist")
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    83
(*<*)
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    84
    end
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    85
(*>*)
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    86
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    87
text {*
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    88
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
    89
branches of infinite length. Orthogonally, the nodes in the first and third
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    90
types have finite branching, whereas those of the second and fourth may have
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    91
infinitely many direct subtrees.
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    92
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    93
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
    94
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
    95
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
    96
without launching jEdit:
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    97
*}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    98
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    99
text {*
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   100
\noindent
52806
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   101
\ \ \ \ \texttt{isabelle jedit -l HOL-BNF} \\
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   102
\noindent
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   103
\hbox{}\ \ \ \ \texttt{isabelle build -b HOL-BNF}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   104
*}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   105
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   106
text {*
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   107
The package, like its predecessor, fully adheres to the LCF philosophy
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   108
\cite{mgordon79}: The characteristic theorems associated with the specified
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   109
(co)datatypes are derived rather than introduced axiomatically.%
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   110
\footnote{If the @{text quick_and_dirty} option is enabled, some of the
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   111
internal constructions and most of the internal proof obligations are skipped.}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   112
The package's metatheory is described in a pair of papers
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   113
\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
   114
\emph{bounded natural functor} (BNF)---a well-behaved type constructor for which
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   115
nested (co)recursion is supported.
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
   116
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   117
This tutorial is organized as follows:
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   118
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   119
\begin{itemize}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   120
\setlength{\itemsep}{0pt}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   121
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   122
\item Section \ref{sec:defining-datatypes}, ``Defining Datatypes,''
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   123
describes how to specify datatypes using the @{command datatype_new} command.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   124
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
   125
\item Section \ref{sec:defining-recursive-functions}, ``Defining Recursive
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   126
Functions,'' describes how to specify recursive functions using
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   127
@{command primrec_new}, \keyw{fun}, and \keyw{function}.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   128
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   129
\item Section \ref{sec:defining-codatatypes}, ``Defining Codatatypes,''
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   130
describes how to specify codatatypes using the @{command codatatype} command.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   131
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
   132
\item Section \ref{sec:defining-corecursive-functions}, ``Defining Corecursive
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   133
Functions,'' describes how to specify corecursive functions using the
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   134
@{command primcorec} command.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   135
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
   136
\item Section \ref{sec:registering-bounded-natural-functors}, ``Registering
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   137
Bounded Natural Functors,'' explains how to use the @{command bnf} command
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   138
to register arbitrary type constructors as BNFs.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   139
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   140
\item Section
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   141
\ref{sec:deriving-destructors-and-theorems-for-free-constructors},
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   142
``Deriving Destructors and Theorems for Free Constructors,'' explains how to
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   143
use the command @{command wrap_free_constructors} to derive destructor constants
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   144
and theorems for freely generated types, as performed internally by @{command
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   145
datatype_new} and @{command codatatype}.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   146
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   147
%\item Section \ref{sec:standard-ml-interface}, ``Standard ML Interface,''
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   148
%describes the package's programmatic interface.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   149
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   150
%\item Section \ref{sec:interoperability}, ``Interoperability,''
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   151
%is concerned with the packages' interaction with other Isabelle packages and
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   152
%tools, such as the code generator and the counterexample generators.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   153
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   154
%\item Section \ref{sec:known-bugs-and-limitations}, ``Known Bugs and
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   155
%Limitations,'' concludes with known open issues at the time of writing.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   156
\end{itemize}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   157
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   158
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   159
\newbox\boxA
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   160
\setbox\boxA=\hbox{\texttt{nospam}}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   161
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   162
\newcommand\authoremaili{\texttt{blan{\color{white}nospam}\kern-\wd\boxA{}chette@\allowbreak
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   163
in.\allowbreak tum.\allowbreak de}}
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   164
\newcommand\authoremailii{\texttt{lore{\color{white}nospam}\kern-\wd\boxA{}nz.panny@\allowbreak
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   165
\allowbreak tum.\allowbreak de}}
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   166
\newcommand\authoremailiii{\texttt{pope{\color{white}nospam}\kern-\wd\boxA{}scua@\allowbreak
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   167
in.\allowbreak tum.\allowbreak de}}
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   168
\newcommand\authoremailiv{\texttt{tray{\color{white}nospam}\kern-\wd\boxA{}tel@\allowbreak
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   169
in.\allowbreak tum.\allowbreak de}}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   170
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   171
The commands @{command datatype_new} and @{command primrec_new} are expected to
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   172
displace \keyw{datatype} and \keyw{primrec} in a future release. Authors of new
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   173
theories are encouraged to use the new commands, and maintainers of older
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   174
theories may want to consider upgrading.
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   175
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   176
Comments and bug reports concerning either the tool or this tutorial should be
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   177
directed to the authors at \authoremaili, \authoremailii, \authoremailiii,
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   178
and \authoremailiv.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   179
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   180
\begin{framed}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   181
\noindent
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   182
\textbf{Warning:}\enskip This tutorial and the package it describes are under
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   183
construction. Please apologise for their appearance. Should you have suggestions
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   184
or comments regarding either, please let the authors know.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   185
\end{framed}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   186
*}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   187
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   188
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   189
section {* Defining Datatypes
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   190
  \label{sec:defining-datatypes} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   191
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   192
text {*
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   193
Datatypes can be specified using the @{command datatype_new} command.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   194
*}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
   195
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   196
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   197
subsection {* Introductory Examples
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   198
  \label{ssec:datatype-introductory-examples} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   199
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   200
text {*
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   201
Datatypes are illustrated through concrete examples featuring different flavors
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   202
of recursion. More examples can be found in the directory
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   203
\verb|~~/src/HOL/BNF/Examples|.
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   204
*}
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   205
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   206
subsubsection {* Nonrecursive Types
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   207
  \label{sssec:datatype-nonrecursive-types} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   208
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   209
text {*
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   210
Datatypes are introduced by specifying the desired names and argument types for
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   211
their constructors. \emph{Enumeration} types are the simplest form of datatype.
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   212
All their constructors are nullary:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   213
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   214
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   215
    datatype_new trool = Truue | Faalse | Perhaaps
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   216
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   217
text {*
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   218
\noindent
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   219
Here, @{const Truue}, @{const Faalse}, and @{const Perhaaps} have the type @{typ trool}.
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   220
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   221
Polymorphic types are possible, such as the following option type, modeled after
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   222
its homologue from the @{theory Option} theory:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   223
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   224
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   225
(*<*)
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   226
    hide_const None Some
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   227
(*>*)
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   228
    datatype_new 'a option = None | Some 'a
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   229
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   230
text {*
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   231
\noindent
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   232
The constructors are @{text "None :: 'a option"} and
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   233
@{text "Some :: 'a \<Rightarrow> 'a option"}.
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   234
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   235
The next example has three type parameters:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   236
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   237
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   238
    datatype_new ('a, 'b, 'c) triple = Triple 'a 'b 'c
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   239
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   240
text {*
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   241
\noindent
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   242
The constructor is
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   243
@{text "Triple :: 'a \<Rightarrow> 'b \<Rightarrow> 'c \<Rightarrow> ('a, 'b, 'c) triple"}.
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   244
Unlike in Standard ML, curried constructors are supported. The uncurried variant
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   245
is also possible:
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   246
*}
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   247
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   248
    datatype_new ('a, 'b, 'c) triple\<^sub>u = Triple\<^sub>u "'a * 'b * 'c"
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   249
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   250
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   251
subsubsection {* Simple Recursion
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   252
  \label{sssec:datatype-simple-recursion} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   253
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   254
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   255
Natural numbers are the simplest example of a recursive type:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   256
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   257
53332
c97a05a26dd6 Doc improvements
traytel
parents: 53331
diff changeset
   258
    datatype_new nat = Zero | Suc nat
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   259
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   260
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   261
\noindent
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   262
Lists were shown in the introduction. Terminated lists are a variant:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   263
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   264
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   265
(*<*)
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   266
    locale dummy_tlist
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   267
    begin
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   268
(*>*)
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   269
    datatype_new ('a, 'b) tlist = TNil 'b | TCons 'a "('a, 'b) tlist"
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   270
(*<*)
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   271
    end
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   272
(*>*)
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   273
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   274
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   275
\noindent
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   276
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
   277
enclosed in double quotes, as is customary in Isabelle.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   278
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   279
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   280
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   281
subsubsection {* Mutual Recursion
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   282
  \label{sssec:datatype-mutual-recursion} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   283
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   284
text {*
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   285
\emph{Mutually recursive} types are introduced simultaneously and may refer to
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   286
each other. The example below introduces a pair of types for even and odd
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   287
natural numbers:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   288
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   289
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   290
    datatype_new even_nat = Even_Zero | Even_Suc odd_nat
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   291
    and odd_nat = Odd_Suc even_nat
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   292
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   293
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   294
\noindent
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   295
Arithmetic expressions are defined via terms, terms via factors, and factors via
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   296
expressions:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   297
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   298
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   299
    datatype_new ('a, 'b) exp =
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   300
      Term "('a, 'b) trm" | Sum "('a, 'b) trm" "('a, 'b) exp"
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   301
    and ('a, 'b) trm =
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   302
      Factor "('a, 'b) fct" | Prod "('a, 'b) fct" "('a, 'b) trm"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   303
    and ('a, 'b) fct =
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   304
      Const 'a | Var 'b | Expr "('a, 'b) exp"
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   305
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   306
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   307
subsubsection {* Nested Recursion
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   308
  \label{sssec:datatype-nested-recursion} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   309
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   310
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   311
\emph{Nested recursion} occurs when recursive occurrences of a type appear under
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   312
a type constructor. The introduction showed some examples of trees with nesting
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   313
through lists. A more complex example, that reuses our @{text option} type,
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   314
follows:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   315
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   316
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   317
    datatype_new 'a btree =
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   318
      BNode 'a "'a btree option" "'a btree option"
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   319
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   320
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   321
\noindent
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   322
Not all nestings are admissible. For example, this command will fail:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   323
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   324
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   325
    datatype_new 'a wrong = Wrong (*<*)'a
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   326
    typ (*>*)"'a wrong \<Rightarrow> 'a"
52806
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   327
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   328
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   329
\noindent
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   330
The issue is that the function arrow @{text "\<Rightarrow>"} allows recursion
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   331
only through its right-hand side. This issue is inherited by polymorphic
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   332
datatypes defined in terms of~@{text "\<Rightarrow>"}:
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   333
*}
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   334
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   335
    datatype_new ('a, 'b) fn = Fn "'a \<Rightarrow> 'b"
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   336
    datatype_new 'a also_wrong = Also_Wrong (*<*)'a
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   337
    typ (*>*)"('a also_wrong, 'a) fn"
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   338
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   339
text {*
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   340
\noindent
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   341
This is legal:
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   342
*}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   343
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   344
    datatype_new 'a ftree = FTLeaf 'a | FTNode "'a \<Rightarrow> 'a ftree"
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   345
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   346
text {*
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   347
\noindent
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   348
In general, type constructors @{text "('a\<^sub>1, \<dots>, 'a\<^sub>m) t"}
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   349
allow recursion on a subset of their type arguments @{text 'a\<^sub>1}, \ldots,
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   350
@{text 'a\<^sub>m}. These type arguments are called \emph{live}; the remaining
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   351
type arguments are called \emph{dead}. In @{typ "'a \<Rightarrow> 'b"} and
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   352
@{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
   353
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   354
Type constructors must be registered as bounded natural functors (BNFs) to have
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   355
live arguments. This is done automatically for datatypes and codatatypes
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   356
introduced by the @{command datatype_new} and @{command codatatype} commands.
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   357
Section~\ref{sec:registering-bounded-natural-functors} explains how to register
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   358
arbitrary type constructors as BNFs.
52806
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   359
*}
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   360
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   361
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   362
subsubsection {* Custom Names and Syntaxes
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   363
  \label{sssec:datatype-custom-names-and-syntaxes} *}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   364
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   365
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   366
The @{command datatype_new} command introduces various constants in addition to
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   367
the constructors. With each datatype are associated set functions, a map
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   368
function, a relator, discriminators, and selectors, all of which can be given
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   369
custom names. In the example below, the traditional names
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   370
@{text set}, @{text map}, @{text list_all2}, @{text null}, @{text hd}, and
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   371
@{text tl} override the default names @{text list_set}, @{text list_map}, @{text
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   372
list_rel}, @{text is_Nil}, @{text un_Cons1}, and @{text un_Cons2}:
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   373
*}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   374
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   375
(*<*)
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   376
    no_translations
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   377
      "[x, xs]" == "x # [xs]"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   378
      "[x]" == "x # []"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   379
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   380
    no_notation
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   381
      Nil ("[]") and
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   382
      Cons (infixr "#" 65)
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   383
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   384
    hide_type list
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   385
    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
   386
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   387
    locale dummy_list
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   388
    begin
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   389
(*>*)
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   390
    datatype_new (set: 'a) list (map: map rel: list_all2) =
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   391
      null: Nil (defaults tl: Nil)
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   392
    | Cons (hd: 'a) (tl: "'a list")
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   393
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   394
text {*
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   395
\noindent
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   396
The command introduces a discriminator @{const null} and a pair of selectors
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   397
@{const hd} and @{const tl} characterized as follows:
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   398
%
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   399
\[@{thm list.collapse(1)[of xs, no_vars]}
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   400
  \qquad @{thm list.collapse(2)[of xs, no_vars]}\]
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   401
%
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   402
For two-constructor datatypes, a single discriminator constant suffices. The
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   403
discriminator associated with @{const Cons} is simply
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   404
@{term "\<lambda>xs. \<not> null xs"}.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   405
53553
d4191bf88529 avoid a keyword
blanchet
parents: 53552
diff changeset
   406
The @{text defaults} clause following the @{const Nil} constructor specifies a
d4191bf88529 avoid a keyword
blanchet
parents: 53552
diff changeset
   407
default value for selectors associated with other constructors. Here, it is used
d4191bf88529 avoid a keyword
blanchet
parents: 53552
diff changeset
   408
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
   409
unspecified).
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   410
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   411
Because @{const Nil} is nullary, it is also possible to use
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   412
@{term "\<lambda>xs. xs = Nil"} as a discriminator. This is specified by
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   413
entering ``@{text "="}'' instead of the identifier @{const null}. Although this
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   414
may look appealing, the mixture of constructors and selectors in the
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   415
characteristic theorems can lead Isabelle's automation to switch between the
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   416
constructor and the destructor view in surprising ways.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   417
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   418
The usual mixfix syntaxes are available for both types and constructors. For
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   419
example:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   420
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   421
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   422
(*<*)
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   423
    end
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   424
(*>*)
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   425
    datatype_new ('a, 'b) prod (infixr "*" 20) = Pair 'a 'b
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   426
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   427
text {* \blankline *}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   428
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   429
    datatype_new (set: 'a) list (map: map rel: list_all2) =
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   430
      null: Nil ("[]")
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   431
    | Cons (hd: 'a) (tl: "'a list") (infixr "#" 65)
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   432
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   433
text {*
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   434
\noindent
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   435
Incidentally, this is how the traditional syntaxes can be set up:
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   436
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   437
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   438
    syntax "_list" :: "args \<Rightarrow> 'a list" ("[(_)]")
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   439
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   440
text {* \blankline *}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   441
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   442
    translations
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   443
      "[x, xs]" == "x # [xs]"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   444
      "[x]" == "x # []"
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   445
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   446
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   447
subsection {* Command Syntax
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   448
  \label{ssec:datatype-command-syntax} *}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   449
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   450
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   451
subsubsection {* \keyw{datatype\_new}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   452
  \label{sssec:datatype-new} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   453
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   454
text {*
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   455
Datatype definitions have the following general syntax:
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   456
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   457
@{rail "
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   458
  @@{command_def datatype_new} target? @{syntax dt_options}? \\
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   459
    (@{syntax dt_name} '=' (@{syntax ctor} + '|') + @'and')
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   460
  ;
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   461
  @{syntax_def dt_options}: '(' (('no_discs_sels' | 'rep_compat') + ',') ')'
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   462
"}
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   463
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   464
The syntactic quantity \synt{target} can be used to specify a local
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   465
context---e.g., @{text "(in linorder)"}. It is documented in the Isar reference
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   466
manual \cite{isabelle-isar-ref}.
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   467
%
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   468
The optional target is optionally followed by datatype-specific options:
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   469
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   470
\begin{itemize}
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   471
\setlength{\itemsep}{0pt}
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   472
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   473
\item
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   474
The @{text "no_discs_sels"} option indicates that no discriminators or selectors
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   475
should be generated.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   476
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   477
\item
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   478
The @{text "rep_compat"} option indicates that the generated names should
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   479
contain optional (and normally not displayed) ``@{text "new."}'' components to
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   480
prevent clashes with a later call to \keyw{rep\_datatype}. See
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   481
Section~\ref{ssec:datatype-compatibility-issues} for details.
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   482
\end{itemize}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   483
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   484
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
   485
define, its type parameters, and additional information:
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   486
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   487
@{rail "
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   488
  @{syntax_def dt_name}: @{syntax tyargs}? name @{syntax map_rel}? mixfix?
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   489
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   490
  @{syntax_def tyargs}: typefree | '(' ((name ':')? typefree + ',') ')'
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   491
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   492
  @{syntax_def map_rel}: '(' ((('map' | 'rel') ':' name) +) ')'
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   493
"}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   494
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   495
\noindent
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   496
The syntactic quantity \synt{name} denotes an identifier, \synt{typefree}
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   497
denotes fixed type variable (@{typ 'a}, @{typ 'b}, \ldots), and \synt{mixfix}
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   498
denotes the usual parenthesized mixfix notation. They are documented in the Isar
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   499
reference manual \cite{isabelle-isar-ref}.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   500
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   501
The optional names preceding the type variables allow to override the default
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   502
names of the set functions (@{text t_set1}, \ldots, @{text t_setM}).
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   503
Inside a mutually recursive datatype specification, all defined datatypes must
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   504
specify exactly the same type variables in the same order.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   505
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   506
@{rail "
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   507
  @{syntax_def ctor}: (name ':')? name (@{syntax ctor_arg} * ) \\
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   508
    @{syntax dt_sel_defaults}? mixfix?
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   509
"}
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   510
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   511
\medskip
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   512
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   513
\noindent
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   514
The main constituents of a constructor specification is the name of the
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   515
constructor and the list of its argument types. An optional discriminator name
53554
78fe0002024d more (co)data docs
blanchet
parents: 53553
diff changeset
   516
can be supplied at the front to override the default name
78fe0002024d more (co)data docs
blanchet
parents: 53553
diff changeset
   517
(@{text t.is_C\<^sub>j}).
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
53554
78fe0002024d more (co)data docs
blanchet
parents: 53553
diff changeset
   528
(@{text un_C\<^sub>ji}). The same selector names can be reused for several
78fe0002024d more (co)data docs
blanchet
parents: 53553
diff changeset
   529
constructors as long as they share the same type.
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   530
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   531
@{rail "
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
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
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   545
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   546
subsubsection {* \keyw{datatype\_new\_compat}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   547
  \label{sssec:datatype-new-compat} *}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   548
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   549
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   550
The old datatype package provides some functionality that is not yet replicated
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   551
in the new package:
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   552
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   553
\begin{itemize}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   554
\item It is integrated with \keyw{fun} and \keyw{function}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   555
\cite{isabelle-function}, Nitpick \cite{isabelle-nitpick}, Quickcheck,
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   556
and other packages.
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   557
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   558
\item It is extended by various add-ons, notably to produce instances of the
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   559
@{const size} function.
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   560
\end{itemize}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   561
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   562
\noindent
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   563
New-style datatypes can in most case be registered as old-style datatypes using
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   564
the command
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   565
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   566
@{rail "
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   567
  @@{command_def datatype_new_compat} names
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   568
"}
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   569
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   570
\noindent
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   571
where the \textit{names} argument is simply a space-separated list of type names
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   572
that are mutually recursive. For example:
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   573
*}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   574
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   575
    datatype_new_compat even_nat odd_nat
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   576
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   577
text {* \blankline *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   578
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   579
    thm even_nat_odd_nat.size
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   580
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   581
text {* \blankline *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   582
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   583
    ML {* Datatype_Data.get_info @{theory} @{type_name even_nat} *}
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   584
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   585
text {*
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   586
For nested recursive datatypes, all types through which recursion takes place
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   587
must be new-style datatypes. In principle, it should be possible to support
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   588
old-style datatypes as well, but the command does not support this yet.
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   589
*}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   590
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   591
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   592
subsection {* Generated Constants
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   593
  \label{ssec:datatype-generated-constants} *}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   594
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   595
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   596
Given a datatype @{text "('a\<^sub>1, \<dots>, 'a\<^sub>m) t"}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   597
with $m > 0$ live type variables and $n$ constructors
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   598
@{text "t.C\<^sub>1"}, \ldots, @{text "t.C\<^sub>n"}, the
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   599
following auxiliary constants are introduced:
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   600
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   601
\begin{itemize}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   602
\setlength{\itemsep}{0pt}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   603
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   604
\item \relax{Case combinator}: @{text t_case} (rendered using the familiar
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   605
@{text case}--@{text of} syntax)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   606
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   607
\item \relax{Discriminators}: @{text "t.is_C\<^sub>1"}, \ldots,
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   608
@{text "t.is_C\<^sub>n"}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   609
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   610
\item \relax{Selectors}:
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   611
@{text t.un_C\<^sub>11}$, \ldots, @{text t.un_C\<^sub>1k\<^sub>1}, \\
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   612
\phantom{\relax{Selectors:}} \quad\vdots \\
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   613
\phantom{\relax{Selectors:}} @{text t.un_C\<^sub>n1}$, \ldots, @{text t.un_C\<^sub>nk\<^sub>n}.
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   614
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   615
\item \relax{Set functions} (or \relax{natural transformations}):
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   616
@{text t_set1}, \ldots, @{text t_setm}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   618
\item \relax{Map function} (or \relax{functorial action}): @{text t_map}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   619
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   620
\item \relax{Relator}: @{text t_rel}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   621
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   622
\item \relax{Iterator}: @{text t_fold}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   623
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   624
\item \relax{Recursor}: @{text t_rec}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   625
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   626
\end{itemize}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   627
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   628
\noindent
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   629
The case combinator, discriminators, and selectors are collectively called
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   630
\emph{destructors}. The prefix ``@{text "t."}'' is an optional component of the
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   631
name and is normally hidden. 
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   632
*}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   633
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   634
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
   635
subsection {* Generated Theorems
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
   636
  \label{ssec:datatype-generated-theorems} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   637
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   638
text {*
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   639
The characteristic theorems generated by @{command datatype_new} are grouped in
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   640
three broad categories:
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   641
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   642
\begin{itemize}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   643
\item The \emph{free constructor theorems} are properties about the constructors
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   644
and destructors that can be derived for any freely generated type. Internally,
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   645
the derivation is performed by @{command wrap_free_constructors}.
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   646
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   647
\item The \emph{functorial theorems} are properties of datatypes related to
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   648
their BNF nature.
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   649
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   650
\item The \emph{inductive theorems} are properties of datatypes related to
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   651
their inductive nature.
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   652
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   653
\end{itemize}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   654
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   655
\noindent
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   656
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
   657
command \keyw{print\_theorems} immediately after the datatype definition.
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   658
This list normally excludes low-level theorems that reveal internal
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   659
constructions. To make these accessible, add the line
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   660
*}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   661
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   662
    declare [[bnf_note_all]]
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   663
(*<*)
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   664
    declare [[bnf_note_all = false]]
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   665
(*>*)
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   666
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   667
text {*
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   668
\noindent
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   669
to the top of the theory file.
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   670
*}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   671
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   672
subsubsection {* Free Constructor Theorems
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   673
  \label{sssec:free-constructor-theorems} *}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   674
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   675
(*<*)
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   676
    consts is_Cons :: 'a
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   677
(*>*)
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   678
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   679
text {*
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   680
The first subgroup of properties are concerned with the constructors.
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   681
They are listed below for @{typ "'a list"}:
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   682
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   683
\begin{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   684
\begin{description}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   685
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   686
\item[@{text "t."}\hthm{inject} @{text "[iff, induct_simp]"}\rm:] ~ \\
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   687
@{thm list.inject[no_vars]}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   688
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   689
\item[@{text "t."}\hthm{distinct} @{text "[simp, induct_simp]"}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   690
@{thm list.distinct(1)[no_vars]} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   691
@{thm list.distinct(2)[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   692
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   693
\item[@{text "t."}\hthm{exhaust} @{text "[cases t, case_names C\<^sub>1 \<dots> C\<^sub>n]"}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   694
@{thm list.exhaust[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   695
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   696
\item[@{text "t."}\hthm{nchotomy}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   697
@{thm list.nchotomy[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   698
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   699
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   700
\end{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   701
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   702
\noindent
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   703
In addition, these nameless theorems are registered as safe elimination rules:
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   704
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   705
\begin{indentblock}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   706
\begin{description}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   707
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   708
\item[@{text "t."}\hthm{list.distinct {\upshape[}THEN notE}@{text ", elim!"}\hthm{\upshape]}\rm:] ~ \\
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   709
@{thm list.distinct(1)[THEN notE, elim!, no_vars]} \\
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   710
@{thm list.distinct(2)[THEN notE, elim!, no_vars]}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   711
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   712
\end{description}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   713
\end{indentblock}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   714
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   715
\noindent
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   716
The next subgroup is concerned with the case combinator:
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   717
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   718
\begin{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   719
\begin{description}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   720
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   721
\item[@{text "t."}\hthm{case} @{text "[simp]"}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   722
@{thm list.case(1)[no_vars]} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   723
@{thm list.case(2)[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   724
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   725
\item[@{text "t."}\hthm{case\_cong}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   726
@{thm list.case_cong[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   727
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   728
\item[@{text "t."}\hthm{weak\_case\_cong} @{text "[cong]"}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   729
@{thm list.weak_case_cong[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   730
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   731
\item[@{text "t."}\hthm{split}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   732
@{thm list.split[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   733
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   734
\item[@{text "t."}\hthm{split\_asm}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   735
@{thm list.split_asm[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   736
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   737
\item[@{text "t."}\hthm{splits} = @{text "split split_asm"}]
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   738
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   739
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   740
\end{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   741
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   742
\noindent
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   743
The third and last subgroup revolves around discriminators and selectors:
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   744
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   745
\begin{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   746
\begin{description}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   747
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   748
\item[@{text "t."}\hthm{discs} @{text "[simp]"}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   749
@{thm list.discs(1)[no_vars]} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   750
@{thm list.discs(2)[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   751
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   752
\item[@{text "t."}\hthm{sels} @{text "[simp]"}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   753
@{thm list.sels(1)[no_vars]} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   754
@{thm list.sels(2)[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   755
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   756
\item[@{text "t."}\hthm{collapse} @{text "[simp]"}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   757
@{thm list.collapse(1)[no_vars]} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   758
@{thm list.collapse(2)[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   759
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   760
\item[@{text "t."}\hthm{disc\_exclude}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   761
These properties are missing for @{typ "'a list"} because there is only one
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   762
proper discriminator. Had the datatype been introduced with a second
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   763
discriminator called @{const is_Cons}, they would have read thusly: \\[\jot]
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   764
@{prop "null list \<Longrightarrow> \<not> is_Cons list"} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   765
@{prop "is_Cons list \<Longrightarrow> \<not> null list"}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   766
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   767
\item[@{text "t."}\hthm{disc\_exhaust} @{text "[case_names C\<^sub>1 \<dots> C\<^sub>n]"}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   768
@{thm list.disc_exhaust[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   769
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   770
\item[@{text "t."}\hthm{expand}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   771
@{thm list.expand[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   772
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   773
\item[@{text "t."}\hthm{case\_conv}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   774
@{thm list.case_conv[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   775
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   776
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   777
\end{indentblock}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   778
*}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   779
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   780
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   781
subsubsection {* Functorial Theorems
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   782
  \label{sssec:functorial-theorems} *}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   783
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   784
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   785
The BNF-related theorem are as follows:
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   786
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   787
\begin{indentblock}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   788
\begin{description}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   789
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   790
\item[@{text "t."}\hthm{sets} @{text "[code]"}\rm:] ~ \\
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   791
@{thm list.sets(1)[no_vars]} \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   792
@{thm list.sets(2)[no_vars]}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   793
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   794
\item[@{text "t."}\hthm{map} @{text "[code]"}\rm:] ~ \\
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   795
@{thm list.map(1)[no_vars]} \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   796
@{thm list.map(2)[no_vars]}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   797
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   798
\item[@{text "t."}\hthm{rel\_inject} @{text "[code]"}\rm:] ~ \\
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   799
@{thm list.rel_inject(1)[no_vars]} \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   800
@{thm list.rel_inject(2)[no_vars]}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   801
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   802
\item[@{text "t."}\hthm{rel\_distinct} @{text "[code]"}\rm:] ~ \\
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   803
@{thm list.rel_distinct(1)[no_vars]} \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   804
@{thm list.rel_distinct(2)[no_vars]}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   805
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   806
\end{description}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   807
\end{indentblock}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   808
*}
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   809
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   810
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   811
subsubsection {* Inductive Theorems
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   812
  \label{sssec:inductive-theorems} *}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   813
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   814
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   815
The inductive theorems are as follows:
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   816
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   817
\begin{indentblock}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   818
\begin{description}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   819
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   820
\item[@{text "t."}\hthm{induct} @{text "[induct t, case_names C\<^sub>1 \<dots> C\<^sub>n]"}\rm:] ~ \\
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   821
@{thm list.induct[no_vars]}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   822
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   823
\item[@{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{induct} @{text "[case_names C\<^sub>1 \<dots> C\<^sub>n]"}\rm:] ~ \\
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   824
Given $m > 1$ mutually recursive datatypes, this induction rule can be used to
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   825
prove $m$ properties simultaneously.
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   826
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   827
\item[@{text "t."}\hthm{fold} @{text "[code]"}\rm:] ~ \\
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   828
@{thm list.fold(1)[no_vars]} \\
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   829
@{thm list.fold(2)[no_vars]}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   830
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   831
\item[@{text "t."}\hthm{rec} @{text "[code]"}\rm:] ~ \\
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   832
@{thm list.rec(1)[no_vars]} \\
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   833
@{thm list.rec(2)[no_vars]}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   834
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   835
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   836
\end{indentblock}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   837
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   838
\noindent
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   839
For convenience, @{command datatype_new} also provides the following collection:
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   840
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   841
\begin{indentblock}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   842
\begin{description}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   843
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   844
\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
   845
@{text t.rel_distinct} @{text t.sets}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   846
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   847
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   848
\end{indentblock}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   849
*}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   850
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   851
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   852
subsection {* Compatibility Issues
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   853
  \label{ssec:datatype-compatibility-issues} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   854
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   855
text {*
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   856
%  * main incompabilities between two packages
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   857
%    * differences in theorem names (e.g. singular vs. plural for some props?)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   858
%    * differences in "simps"?
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   859
%    * different recursor/induction in nested case
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   860
%        * discussed in Section~\ref{sec:defining-recursive-functions}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   861
%    * different ML interfaces / extension mechanisms
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   862
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   863
%  * register new datatype as old datatype
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   864
%    * motivation:
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   865
%      * do recursion through new datatype in old datatype
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   866
%        (e.g. useful when porting to the new package one type at a time)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   867
%      * use old primrec
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   868
%      * use fun
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   869
%      * use extensions like size (needed for fun), the AFP order, Quickcheck,
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   870
%        Nitpick
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   871
%      * provide exactly the same theorems with the same names (compatibility)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   872
%    * option 1
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   873
%      * @{text "rep_compat"}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   874
%      * \keyw{rep\_datatype}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   875
%      * has some limitations
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   876
%        * mutually recursive datatypes? (fails with rep_datatype?)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   877
%        * nested datatypes? (fails with datatype_new?)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   878
%    * option 2
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   879
%      * @{command datatype_new_compat}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   880
%      * not fully implemented yet?
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   881
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   882
%  * register old datatype as new datatype
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   883
%    * no clean way yet
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   884
%    * if the goal is to do recursion through old datatypes, can register it as
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   885
%      a BNF (Section XXX)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   886
%    * can also derive destructors etc. using @{command wrap_free_constructors}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   887
%      (Section XXX)
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   888
*}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   889
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
   890
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   891
section {* Defining Recursive Functions
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   892
  \label{sec:defining-recursive-functions} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   893
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   894
text {*
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   895
Recursive functions over datatypes can be specified using @{command
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   896
primrec_new}, which supports primitive recursion, or using the more general
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   897
\keyw{fun} and \keyw{function} commands. Here, the focus is on @{command
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   898
primrec_new}; the other two commands are described in a separate tutorial
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   899
\cite{isabelle-function}.
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   900
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   901
%%% TODO: partial_function
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   902
*}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
   903
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   904
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   905
subsection {* Introductory Examples
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   906
  \label{ssec:primrec-introductory-examples} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   907
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   908
text {*
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   909
Primitive recursion is illustrated through concrete examples based on the
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   910
datatypes defined in Section~\ref{ssec:datatype-introductory-examples}. More
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   911
examples can be found in the directory \verb|~~/src/HOL/BNF/Examples|.
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   912
*}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   913
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   914
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   915
subsubsection {* Nonrecursive Types
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   916
  \label{sssec:primrec-nonrecursive-types} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   917
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   918
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   919
Primitive recursion removes one layer of constructors on the left-hand side in
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   920
each equation. For example:
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   921
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   922
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   923
    primrec_new bool_of_trool :: "trool \<Rightarrow> bool" where
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   924
      "bool_of_trool Faalse \<longleftrightarrow> False" |
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   925
      "bool_of_trool Truue \<longleftrightarrow> True"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   926
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   927
text {* \blankline *}
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   928
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   929
    primrec_new the_list :: "'a option \<Rightarrow> 'a list" where
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   930
      "the_list None = []" |
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   931
      "the_list (Some a) = [a]"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   932
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   933
text {* \blankline *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   934
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   935
    primrec_new the_default :: "'a \<Rightarrow> 'a option \<Rightarrow> 'a" where
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   936
      "the_default d None = d" |
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   937
      "the_default _ (Some a) = a"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   938
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   939
text {* \blankline *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   940
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   941
    primrec_new mirrror :: "('a, 'b, 'c) triple \<Rightarrow> ('c, 'b, 'a) triple" where
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   942
      "mirrror (Triple a b c) = Triple c b a"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   943
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   944
text {*
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   945
\noindent
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   946
The equations can be specified in any order, and it is acceptable to leave out
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   947
some cases, which are then unspecified. Pattern matching on the left-hand side
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   948
is restricted to a single datatype, which must correspond to the same argument
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   949
in all equations.
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   950
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   951
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   952
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   953
subsubsection {* Simple Recursion
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   954
  \label{sssec:primrec-simple-recursion} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   955
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   956
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   957
For simple recursive types, recursive calls on a constructor argument are
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   958
allowed on the right-hand side:
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   959
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   960
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   961
(*<*)
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   962
    context dummy_tlist
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   963
    begin
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   964
(*>*)
53330
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
   965
    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
   966
      "replicate Zero _ = []" |
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   967
      "replicate (Suc n) x = x # replicate n x"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   968
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   969
text {* \blankline *}
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   970
53332
c97a05a26dd6 Doc improvements
traytel
parents: 53331
diff changeset
   971
    primrec_new at :: "'a list \<Rightarrow> nat \<Rightarrow> 'a" where
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   972
      "at (x # xs) j =
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   973
         (case j of
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   974
            Zero \<Rightarrow> x
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   975
          | Suc j' \<Rightarrow> at xs j')"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   976
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   977
text {* \blankline *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   978
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   979
    primrec_new tfold :: "('a \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> ('a, 'b) tlist \<Rightarrow> 'b" where
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   980
      "tfold _ (TNil y) = y" |
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   981
      "tfold f (TCons x xs) = f x (tfold f xs)"
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   982
(*<*)
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   983
    end
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   984
(*>*)
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   985
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   986
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   987
\noindent
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   988
The next example is not primitive recursive, but it can be defined easily using
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   989
\keyw{fun}. The @{command datatype_new_compat} command is needed to register
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   990
new-style datatypes for use with \keyw{fun} and \keyw{function}
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   991
(Section~\ref{sssec:datatype-new-compat}):
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   992
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   993
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   994
    datatype_new_compat nat
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   995
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   996
text {* \blankline *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   997
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   998
    fun at_least_two :: "nat \<Rightarrow> bool" where
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   999
      "at_least_two (Suc (Suc _)) \<longleftrightarrow> True" |
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1000
      "at_least_two _ \<longleftrightarrow> False"
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1001
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1002
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1003
subsubsection {* Mutual Recursion
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1004
  \label{sssec:primrec-mutual-recursion} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1005
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1006
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1007
The syntax for mutually recursive functions over mutually recursive datatypes
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1008
is straightforward:
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1009
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1010
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1011
    primrec_new
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1012
      nat_of_even_nat :: "even_nat \<Rightarrow> nat" and
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1013
      nat_of_odd_nat :: "odd_nat \<Rightarrow> nat"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1014
    where
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1015
      "nat_of_even_nat Even_Zero = Zero" |
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1016
      "nat_of_even_nat (Even_Suc n) = Suc (nat_of_odd_nat n)" |
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1017
      "nat_of_odd_nat (Odd_Suc n) = Suc (nat_of_even_nat n)"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1018
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1019
    primrec_new
53330
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
  1020
      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
  1021
      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
  1022
      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
  1023
    where
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1024
      "eval\<^sub>e \<gamma> \<xi> (Term t) = eval\<^sub>t \<gamma> \<xi> t" |
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1025
      "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
  1026
      "eval\<^sub>t \<gamma> \<xi> (Factor f) = eval\<^sub>f \<gamma> \<xi> f" |
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1027
      "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
  1028
      "eval\<^sub>f \<gamma> _ (Const a) = \<gamma> a" |
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1029
      "eval\<^sub>f _ \<xi> (Var b) = \<xi> b" |
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1030
      "eval\<^sub>f \<gamma> \<xi> (Expr e) = eval\<^sub>e \<gamma> \<xi> e"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1031
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1032
text {*
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1033
\noindent
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1034
Mutual recursion is be possible within a single type, using \keyw{fun}:
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1035
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1036
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1037
    fun
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1038
      even :: "nat \<Rightarrow> bool" and
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1039
      odd :: "nat \<Rightarrow> bool"
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1040
    where
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1041
      "even Zero = True" |
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1042
      "even (Suc n) = odd n" |
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1043
      "odd Zero = False" |
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1044
      "odd (Suc n) = even n"
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1045
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1046
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1047
subsubsection {* Nested Recursion
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1048
  \label{sssec:primrec-nested-recursion} *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1049
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1050
text {*
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1051
In a departure from the old datatype package, nested recursion is normally
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1052
handled via the map functions of the nesting type constructors. For example,
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1053
recursive calls are lifted to lists using @{const map}:
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1054
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1055
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1056
(*<*)
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1057
    datatype_new 'a tree\<^sub>f\<^sub>f = Node\<^sub>f\<^sub>f (lbl\<^sub>f\<^sub>f: 'a) (sub\<^sub>f\<^sub>f: "'a tree\<^sub>f\<^sub>f list")
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1058
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1059
    context dummy_tlist
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1060
    begin
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1061
(*>*)
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1062
    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
  1063
      "at\<^sub>f\<^sub>f (Node\<^sub>f\<^sub>f a ts) js =
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1064
         (case js of
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1065
            [] \<Rightarrow> a
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1066
          | j # js' \<Rightarrow> at (map (\<lambda>t. at\<^sub>f\<^sub>f t js') ts) j)"
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1067
(*<*)
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1068
    end
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1069
(*>*)
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1070
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1071
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1072
The next example features recursion through the @{text option} type. Although
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1073
@{text option} is not a new-style datatype, it is registered as a BNF with the
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1074
map function @{const option_map}:
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1075
*}
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1076
53335
585b2fee55e5 fixed bug in primrec_new (allow indirect recursion through constructor arguments other than the first)
panny
parents: 53332
diff changeset
  1077
(*<*)
585b2fee55e5 fixed bug in primrec_new (allow indirect recursion through constructor arguments other than the first)
panny
parents: 53332
diff changeset
  1078
    locale sum_btree_nested
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1079
    begin
53335
585b2fee55e5 fixed bug in primrec_new (allow indirect recursion through constructor arguments other than the first)
panny
parents: 53332
diff changeset
  1080
(*>*)
585b2fee55e5 fixed bug in primrec_new (allow indirect recursion through constructor arguments other than the first)
panny
parents: 53332
diff changeset
  1081
    primrec_new sum_btree :: "('a\<Colon>{zero,plus}) btree \<Rightarrow> 'a" where
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1082
      "sum_btree (BNode a lt rt) =
53330
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
  1083
         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
  1084
           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
  1085
(*<*)
585b2fee55e5 fixed bug in primrec_new (allow indirect recursion through constructor arguments other than the first)
panny
parents: 53332
diff changeset
  1086
    end
585b2fee55e5 fixed bug in primrec_new (allow indirect recursion through constructor arguments other than the first)
panny
parents: 53332
diff changeset
  1087
(*>*)
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1088
53136
98a2c33d5d1b ideas for (co)datatype docs
blanchet
parents: 53028
diff changeset
  1089
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1090
\noindent
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1091
The same principle applies for arbitrary type constructors through which
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1092
recursion is possible. Notably, the map function for the function type
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1093
(@{text \<Rightarrow>}) is simply composition (@{text "op \<circ>"}):
53136
98a2c33d5d1b ideas for (co)datatype docs
blanchet
parents: 53028
diff changeset
  1094
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1095
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1096
    primrec_new ftree_map :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a ftree \<Rightarrow> 'a ftree" where
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1097
      "ftree_map f (FTLeaf x) = FTLeaf (f x)" |
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1098
      "ftree_map f (FTNode g) = FTNode (ftree_map f \<circ> g)"
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1099
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1100
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1101
\noindent
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1102
(No such function is defined by the package because @{typ 'a} is dead in
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1103
@{typ "'a ftree"}, but we can easily do it ourselves.)
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1104
*}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1105
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1106
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1107
subsubsection {* Nested-as-Mutual Recursion
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1108
  \label{sssec:primrec-nested-as-mutual-recursion} *}
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1109
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1110
text {*
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1111
For compatibility with the old package, but also because it is sometimes
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1112
convenient in its own right, it is possible to treat nested recursive datatypes
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1113
as mutually recursive ones if the recursion takes place though new-style
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1114
datatypes. For example:
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1115
*}
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1116
53331
20440c789759 prove theorem in the right context (that knows about local variables)
traytel
parents: 53330
diff changeset
  1117
    primrec_new
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1118
      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
  1119
      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
  1120
    where
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1121
      "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
  1122
         (case js of
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1123
            [] \<Rightarrow> a
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1124
          | j # js' \<Rightarrow> at_trees\<^sub>f\<^sub>f ts j js')" |
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1125
      "at_trees\<^sub>f\<^sub>f (t # ts) j =
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1126
         (case j of
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1127
            Zero \<Rightarrow> at_tree\<^sub>f\<^sub>f t
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1128
          | Suc j' \<Rightarrow> at_trees\<^sub>f\<^sub>f ts j')"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1129
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1130
text {* \blankline *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1131
53331
20440c789759 prove theorem in the right context (that knows about local variables)
traytel
parents: 53330
diff changeset
  1132
    primrec_new
53330
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
  1133
      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
  1134
      sum_btree_option :: "'a btree option \<Rightarrow> 'a"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1135
    where
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1136
      "sum_btree (BNode a lt rt) =
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1137
         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
  1138
      "sum_btree_option None = 0" |
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1139
      "sum_btree_option (Some t) = sum_btree t"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1140
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1141
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1142
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1143
%  * can pretend a nested type is mutually recursive (if purely inductive)
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1144
%  * avoids the higher-order map
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1145
%  * e.g.
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1146
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1147
%  * this can always be avoided;
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1148
%     * e.g. in our previous example, we first mapped the recursive
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1149
%       calls, then we used a generic at function to retrieve the result
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1150
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1151
%  * there's no hard-and-fast rule of when to use one or the other,
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1152
%    just like there's no rule when to use fold and when to use
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1153
%    primrec_new
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1154
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1155
%  * higher-order approach, considering nesting as nesting, is more
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1156
%    compositional -- e.g. we saw how we could reuse an existing polymorphic
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1157
%    at or the_default, whereas @{const at_trees\<^sub>f\<^sub>f} is much more specific
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1158
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1159
%  * but:
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1160
%     * is perhaps less intuitive, because it requires higher-order thinking
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1161
%     * may seem inefficient, and indeed with the code generator the
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1162
%       mutually recursive version might be nicer
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1163
%     * is somewhat indirect -- must apply a map first, then compute a result
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1164
%       (cannot mix)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1165
%     * the auxiliary functions like @{const at_trees\<^sub>f\<^sub>f} are sometimes useful in own right
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1166
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1167
%  * impact on automation unclear
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1168
%
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1169
*}
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1170
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1171
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1172
subsection {* Command Syntax
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1173
  \label{ssec:primrec-command-syntax} *}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1174
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1175
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1176
subsubsection {* \keyw{primrec\_new}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1177
  \label{sssec:primrec-new} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1178
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1179
text {*
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1180
Primitive recursive functions have the following general syntax:
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1181
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1182
@{rail "
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1183
  @@{command_def primrec_new} target? fixes \\ @'where'
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1184
    (@{syntax primrec_equation} + '|')
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1185
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  1186
  @{syntax_def primrec_equation}: thmdecl? prop
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1187
"}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1188
*}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1189
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1190
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1191
(*
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1192
subsection {* Generated Theorems
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1193
  \label{ssec:primrec-generated-theorems} *}
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1194
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1195
text {*
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1196
%  * synthesized nonrecursive definition
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1197
%  * user specification is rederived from it, exactly as entered
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1198
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1199
%  * induct
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1200
%    * mutualized
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1201
%    * without some needless induction hypotheses if not used
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1202
%  * fold, rec
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1203
%    * mutualized
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1204
*}
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1205
*)
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1206
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1207
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1208
subsection {* Recursive Default Values for Selectors
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1209
  \label{ssec:primrec-recursive-default-values-for-selectors} *}
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1210
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1211
text {*
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1212
A datatype selector @{text un_D} can have a default value for each constructor
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1213
on which it is not otherwise specified. Occasionally, it is useful to have the
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1214
default value be defined recursively. This produces a chicken-and-egg situation
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1215
that may seem unsolvable, because the datatype is not introduced yet at the
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1216
moment when the selectors are introduced. Of course, we can always define the
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1217
selectors manually afterward, but we then have to state and prove all the
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1218
characteristic theorems ourselves instead of letting the package do it.
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1219
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1220
Fortunately, there is a fairly elegant workaround that relies on overloading and
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1221
that avoids the tedium of manual derivations:
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1222
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1223
\begin{enumerate}
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1224
\setlength{\itemsep}{0pt}
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1225
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1226
\item
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1227
Introduce a fully unspecified constant @{text "un_D\<^sub>0 \<Colon> 'a"} using
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1228
@{keyword consts}.
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1229
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1230
\item
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1231
Define the datatype, specifying @{text "un_D\<^sub>0"} as the selector's default
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1232
value.
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1233
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1234
\item
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1235
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
  1236
datatype using the \keyw{overloading} command.
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1237
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1238
\item
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1239
Derive the desired equation on @{text un_D} from the characteristic equations
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1240
for @{text "un_D\<^sub>0"}.
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1241
\end{enumerate}
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1242
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1243
\noindent
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1244
The following example illustrates this procedure:
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1245
*}
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1246
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1247
    consts termi\<^sub>0 :: 'a
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1248
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1249
text {* \blankline *}
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1250
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
  1251
    datatype_new ('a, 'b) tlist =
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1252
      TNil (termi: 'b) (defaults ttl: TNil)
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
  1253
    | 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
  1254
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1255
text {* \blankline *}
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1256
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1257
    overloading
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
  1258
      termi\<^sub>0 \<equiv> "termi\<^sub>0 \<Colon> ('a, 'b) tlist \<Rightarrow> 'b"
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1259
    begin
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
  1260
    primrec_new termi\<^sub>0 :: "('a, 'b) tlist \<Rightarrow> 'b" where
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1261
      "termi\<^sub>0 (TNil y) = y" |
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1262
      "termi\<^sub>0 (TCons x xs) = termi\<^sub>0 xs"
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1263
    end
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1264
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1265
text {* \blankline *}
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1266
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1267
    lemma terminal_TCons[simp]: "termi (TCons x xs) = termi xs"
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1268
    by (cases xs) auto
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1269
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1270
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1271
(*
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1272
subsection {* Compatibility Issues
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1273
  \label{ssec:primrec-compatibility-issues} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1274
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1275
text {*
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1276
%  * different induction in nested case
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1277
%    * solution: define nested-as-mutual functions with primrec,
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1278
%      and look at .induct
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1279
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1280
%  * different induction and recursor in nested case
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1281
%    * only matters to low-level users; they can define a dummy function to force
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1282
%      generation of mutualized recursor
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1283
*}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1284
*)
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1285
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1286
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1287
section {* Defining Codatatypes
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1288
  \label{sec:defining-codatatypes} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1289
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1290
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1291
Codatatypes can be specified using the @{command codatatype} command. The
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1292
command is first illustrated through concrete examples featuring different
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1293
flavors of corecursion. More examples can be found in the directory
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1294
\verb|~~/src/HOL/BNF/Examples|. The \emph{Archive of Formal Proofs} also
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1295
includes some useful codatatypes, notably for lazy lists \cite{lochbihler-2010}.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1296
*}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1297
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1298
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1299
subsection {* Introductory Examples
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1300
  \label{ssec:codatatype-introductory-examples} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1301
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1302
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1303
subsubsection {* Simple Corecursion
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1304
  \label{sssec:codatatype-simple-corecursion} *}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1305
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1306
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1307
Noncorecursive codatatypes coincide with the corresponding datatypes, so
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1308
they have no practical uses. \emph{Corecursive codatatypes} have the same syntax
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1309
as recursive datatypes, except for the command name. For example, here is the
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1310
definition of lazy lists:
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1311
*}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1312
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1313
    codatatype (lset: 'a) llist (map: lmap rel: llist_all2) =
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1314
      lnull: LNil (defaults ltl: LNil)
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1315
    | LCons (lhd: 'a) (ltl: "'a llist")
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1316
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1317
text {*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1318
\noindent
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1319
Lazy lists can be infinite, such as @{text "LCons 0 (LCons 0 (\<dots>))"} and
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1320
@{text "LCons 0 (LCons 1 (LCons 2 (\<dots>)))"}. Another interesting type that can
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1321
be defined as a codatatype is that of the extended natural numbers:
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1322
*}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1323
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1324
    codatatype enat = EZero | ESuc enat
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1325
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1326
text {*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1327
\noindent
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1328
This type has exactly one infinite element, @{text "ESuc (ESuc (ESuc (\<dots>)))"},
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1329
that represents $\infty$. In addition, it has finite values of the form
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1330
@{text "ESuc (\<dots> (ESuc EZero)\<dots>)"}.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1331
*}
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1332
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1333
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1334
subsubsection {* Mutual Corecursion
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1335
  \label{sssec:codatatype-mutual-corecursion} *}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1336
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1337
text {*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1338
\noindent
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1339
The example below introduces a pair of \emph{mutually corecursive} types:
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1340
*}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1341
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1342
    codatatype even_enat = Even_EZero | Even_ESuc odd_enat
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1343
    and odd_enat = Odd_ESuc even_enat
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1344
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1345
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1346
subsubsection {* Nested Corecursion
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1347
  \label{sssec:codatatype-nested-corecursion} *}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1348
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1349
text {*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1350
\noindent
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1351
The next two examples feature \emph{nested corecursion}:
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1352
*}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1353
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1354
    codatatype 'a tree\<^sub>i\<^sub>i = Node\<^sub>i\<^sub>i (lbl\<^sub>i\<^sub>i: 'a) (sub\<^sub>i\<^sub>i: "'a tree\<^sub>i\<^sub>i llist")
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1355
    codatatype 'a tree\<^sub>i\<^sub>s = Node\<^sub>i\<^sub>s (lbl\<^sub>i\<^sub>s: 'a) (sub\<^sub>i\<^sub>s: "'a tree\<^sub>i\<^sub>s fset")
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1356
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1357
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1358
subsection {* Command Syntax
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1359
  \label{ssec:codatatype-command-syntax} *}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1360
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1361
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1362
subsubsection {* \keyw{codatatype}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1363
  \label{sssec:codatatype} *}
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1364
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1365
text {*
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1366
Definitions of codatatypes have almost exactly the same syntax as for datatypes
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1367
(Section~\ref{ssec:datatype-command-syntax}), with two exceptions: The command
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1368
is called @{command codatatype}. The @{text "no_discs_sels"} option is not
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1369
available, because destructors are a crucial notion for codatatypes.
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1370
*}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1371
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1372
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1373
subsection {* Generated Constants
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1374
  \label{ssec:codatatype-generated-constants} *}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1375
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1376
text {*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1377
Given a codatatype @{text "('a\<^sub>1, \<dots>, 'a\<^sub>m) t"}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1378
with $m > 0$ live type variables and $n$ constructors @{text "t.C\<^sub>1"},
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1379
\ldots, @{text "t.C\<^sub>n"}, the same auxiliary constants are generated as for
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1380
datatypes (Section~\ref{ssec:datatype-generated-constants}), except that the
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1381
iterator and the recursor are replaced by dual concepts:
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1382
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1383
\begin{itemize}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1384
\setlength{\itemsep}{0pt}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1385
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1386
\item \relax{Coiterator}: @{text t_unfold}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1387
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1388
\item \relax{Corecursor}: @{text t_corec}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1389
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1390
\end{itemize}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1391
*}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1392
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1393
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1394
subsection {* Generated Theorems
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1395
  \label{ssec:codatatype-generated-theorems} *}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1396
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1397
text {*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1398
The characteristic theorems generated by @{command codatatype} are grouped in
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1399
three broad categories:
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1400
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1401
\begin{itemize}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1402
\item The \emph{free constructor theorems} are properties about the constructors
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1403
and destructors that can be derived for any freely generated type.
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1404
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1405
\item The \emph{functorial theorems} are properties of datatypes related to
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1406
their BNF nature.
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1407
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1408
\item The \emph{coinductive theorems} are properties of datatypes related to
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1409
their coinductive nature.
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1410
\end{itemize}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1411
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1412
\noindent
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1413
The first two categories are exactly as for datatypes and are described in
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
  1414
Sections
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
  1415
\ref{sssec:free-constructor-theorems}~and~\ref{sssec:functorial-theorems}.
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1416
*}
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1417
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1418
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1419
subsubsection {* Coinductive Theorems
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1420
  \label{sssec:coinductive-theorems} *}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1421
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1422
text {*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1423
The coinductive theorems are as follows:
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1424
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1425
\begin{indentblock}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1426
\begin{description}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1427
53643
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1428
\item[\begin{tabular}{@ {}l@ {}}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1429
  @{text "t."}\hthm{coinduct} @{text "[coinduct t, consumes m, case_names t\<^sub>1 \<dots> t\<^sub>m,"} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1430
  \phantom{@{text "t."}\hthm{coinduct} @{text "["}}@{text "case_conclusion D\<^sub>1 \<dots> D\<^sub>n]"}\rm:
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1431
\end{tabular}] ~ \\
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1432
@{thm llist.coinduct[no_vars]}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1433
53643
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1434
\item[\begin{tabular}{@ {}l@ {}}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1435
  @{text "t."}\hthm{strong\_coinduct} @{text "[consumes m, case_names t\<^sub>1 \<dots> t\<^sub>m,"} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1436
  \phantom{@{text "t."}\hthm{strong\_coinduct} @{text "["}}@{text "case_conclusion D\<^sub>1 \<dots> D\<^sub>n]"}\rm:
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1437
\end{tabular}] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1438
@{thm llist.strong_coinduct[no_vars]}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1439
53643
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1440
\item[\begin{tabular}{@ {}l@ {}}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1441
  @{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{coinduct} @{text "[case_names t\<^sub>1 \<dots> t\<^sub>m, case_conclusion D\<^sub>1 \<dots> D\<^sub>n]"} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1442
  @{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{strong\_coinduct} @{text "[case_names t\<^sub>1 \<dots> t\<^sub>m,"} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1443
  \phantom{@{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{strong\_coinduct} @{text "["}}@{text "case_conclusion D\<^sub>1 \<dots> D\<^sub>n]"}\rm:
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1444
\end{tabular}] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1445
Given $m > 1$ mutually corecursive codatatypes, these coinduction rules can be
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1446
used to prove $m$ properties simultaneously.
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1447
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1448
\item[@{text "t."}\hthm{unfold} \rm(@{text "[simp]"})\rm:] ~ \\
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1449
@{thm llist.unfold(1)[no_vars]} \\
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1450
@{thm llist.unfold(2)[no_vars]}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1451
53643
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1452
\item[@{text "t."}\hthm{corec} (@{text "[simp]"})\rm:] ~ \\
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1453
@{thm llist.corec(1)[no_vars]} \\
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1454
@{thm llist.corec(2)[no_vars]}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1455
53643
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1456
\item[@{text "t."}\hthm{disc\_unfold} @{text "[simp]"}\rm:] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1457
@{thm llist.disc_unfold(1)[no_vars]} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1458
@{thm llist.disc_unfold(2)[no_vars]}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1459
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1460
\item[@{text "t."}\hthm{disc\_corec} @{text "[simp]"}\rm:] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1461
@{thm llist.disc_corec(1)[no_vars]} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1462
@{thm llist.disc_corec(2)[no_vars]}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1463
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1464
\item[@{text "t."}\hthm{disc\_unfold\_iff} @{text "[simp]"}\rm:] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1465
@{thm llist.disc_unfold_iff(1)[no_vars]} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1466
@{thm llist.disc_unfold_iff(2)[no_vars]}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1467
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1468
\item[@{text "t."}\hthm{disc\_corec\_iff} @{text "[simp]"}\rm:] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1469
@{thm llist.disc_corec_iff(1)[no_vars]} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1470
@{thm llist.disc_corec_iff(2)[no_vars]}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1471
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1472
\item[@{text "t."}\hthm{sel\_unfold} @{text "[simp]"}\rm:] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1473
@{thm llist.sel_unfold(1)[no_vars]} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1474
@{thm llist.sel_unfold(2)[no_vars]}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1475
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1476
\item[@{text "t."}\hthm{sel\_corec} @{text "[simp]"}\rm:] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1477
@{thm llist.sel_corec(1)[no_vars]} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1478
@{thm llist.sel_corec(2)[no_vars]}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1479
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1480
\end{description}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1481
\end{indentblock}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1482
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1483
\noindent
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1484
For convenience, @{command codatatype} also provides the following collection:
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1485
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1486
\begin{indentblock}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1487
\begin{description}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1488
53643
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1489
\item[@{text "t."}\hthm{simps} = @{text t.inject} @{text t.distinct} @{text t.case} @{text t.corec}$^*$ @{text t.disc_corec}] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1490
@{text t.disc_corec_iff} @{text t.sel_corec} @{text t.unfold}$^*$ @{text t.disc_unfold} @{text t.disc_unfold_iff} ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1491
@{text t.sel_unfold} @{text t.map} @{text t.rel_inject} @{text t.rel_distinct} @{text t.sets}
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1492
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1493
\end{description}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1494
\end{indentblock}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1495
*}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1496
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1497
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1498
section {* Defining Corecursive Functions
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1499
  \label{sec:defining-corecursive-functions} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1500
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1501
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1502
Corecursive functions can be specified using the @{command primcorec} command.
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1503
Corecursive functions over codatatypes can be specified using @{command
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1504
primcorec}, which supports primitive corecursion, or using the more general
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1505
\keyw{partial\_function} command. Here, the focus is on @{command primcorec}.
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1506
More examples can be found in the directory \verb|~~/src/HOL/BNF/Examples|.
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1507
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1508
\begin{framed}
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1509
\noindent
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1510
\textbf{Warning:}\enskip The @{command primcorec} command is under heavy
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1511
development. Much of the functionality described here is vaporware. Until the
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1512
command is fully in place, it is recommended to define corecursive functions
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1513
directly using the generated @{text t_unfold} or @{text t_corec} combinators.
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1514
\end{framed}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1515
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1516
%%% TODO: partial_function? E.g. for defining tail recursive function on lazy
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1517
%%% lists (cf. terminal0 in TLList.thy)
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1518
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1519
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1520
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1521
subsection {* Introductory Examples
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1522
  \label{ssec:primcorec-introductory-examples} *}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1523
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1524
text {*
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1525
Primitive corecursion is illustrated through concrete examples based on the
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1526
codatatypes defined in Section~\ref{ssec:codatatype-introductory-examples}. More
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1527
examples can be found in the directory \verb|~~/src/HOL/BNF/Examples|.
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1528
*}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1529
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1530
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1531
subsubsection {* Simple Corecursion
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1532
  \label{sssec:primcorec-simple-corecursion} *}
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1533
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1534
text {*
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1535
Whereas recursive functions consume datatypes one constructor at a time,
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1536
corecursive functions construct codatatypes one constructor at a time.
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1537
Reflecting a lack of agreement among proponents of coalgebraic methods, Isabelle
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1538
supports two competing syntaxes for specifying a function $f$:
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1539
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1540
\begin{itemize}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1541
\abovedisplayskip=.5\abovedisplayskip
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1542
\belowdisplayskip=.5\belowdisplayskip
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1543
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1544
\item The \emph{constructor view} specifies $f$ by equations of the form
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1545
\[@{text "f x\<^sub>1 \<dots> x\<^sub>n = \<dots>"}\]
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1546
Haskell and other lazy functional programming languages support this style.
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1547
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1548
\item The \emph{destructor view} specifies $f$ by implications of the form
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1549
\[@{text "\<dots> \<Longrightarrow> is_C\<^sub>j (f x\<^sub>1 \<dots> x\<^sub>n)"}\] and
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1550
equations of the form
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1551
\[@{text "un_C\<^sub>ji (f x\<^sub>1 \<dots> x\<^sub>n) = \<dots>"}\].
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1552
This style is favored in the coalgebraic literature.
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1553
\end{itemize}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1554
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1555
\noindent
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1556
Both styles are available as input syntax to @{command primcorec}. Whichever
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1557
syntax is chosen, characteristic theorems following both styles are generated.
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1558
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1559
In the constructor view, corecursive calls are allowed on the right-hand side
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1560
as long as they occur under a constructor. The constructor itself normally
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1561
appears directly to the right of the equal sign:
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1562
*}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1563
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1564
    primcorec iterate :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a llist" where
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1565
      "iterate f x = LCons x (iterate f (f x))"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1566
    .
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1567
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1568
text {*
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1569
\noindent
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1570
The constructor ensures that progress is made---i.e., the function is
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1571
\emph{productive}. The above function computes the infinite list
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1572
@{text "[x, f x, f (f x), \<dots>]"}. Productivity guarantees that prefixes
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1573
@{text "[x, f x, f (f x), \<dots>, (f ^^ k) x]"} of arbitrary finite length
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1574
@{text k} can be computed by unfolding the equation a finite number of times.
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1575
The period (@{text "."}) at the end of the command discharges the zero proof
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1576
obligations associated with this definition.
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1577
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1578
The @{const iterate} function can be specified as follows in the destructor
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1579
view:
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1580
*}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1581
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1582
(*<*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1583
    locale dummy_dest_view
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1584
    begin
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1585
(*>*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1586
    primcorec iterate :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a llist" where
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1587
      "\<not> lnull (iterate _ x)" |
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1588
      "lhd (iterate _ x) = x" |
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1589
      "ltl (iterate f x) = iterate f (f x)"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1590
    .
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1591
(*<*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1592
    end
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1593
(*>*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1594
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1595
text {*
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1596
Corecursive calls may only appear directly to the right of the equal sign.
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1597
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1598
In the constructor view, constructs such as @{text "let"}---@{text "in"}, @{text
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1599
"if"}---@{text "then"}---@{text "else"}, and @{text "case"}---@{text "of"} may
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1600
appear around constructors that guard corecursive calls:
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1601
*}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1602
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1603
    primcorec_notyet lappend :: "'a llist \<Rightarrow> 'a llist \<Rightarrow> 'a llist" where
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1604
      "lappend xs ys =
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1605
         (case xs of
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1606
            LNil \<Rightarrow> ys
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1607
          | LCons x xs' \<Rightarrow> LCons x (lappend xs' ys))"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1608
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1609
text {*
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1610
\noindent
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1611
For this example, the destructor view is more cumbersome, because it requires us
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1612
to destroy the second argument @{term ys} (cf.\ @{term "lnull ys"}, @{term "lhd
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1613
ys"}, and @{term "ltl ys"}):
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1614
*}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1615
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1616
(*<*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1617
    context dummy_dest_view
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1618
    begin
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1619
(*>*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1620
    primcorec lappend :: "'a llist \<Rightarrow> 'a llist \<Rightarrow> 'a llist" where
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1621
      "lnull xs \<Longrightarrow> lnull ys \<Longrightarrow> lnull (lappend xs ys)" |
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1622
      "lhd (lappend xs ys) =
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1623
         (case xs of
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1624
            LNil \<Rightarrow> lhd ys
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1625
          | LCons x _ \<Rightarrow> x)" |
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1626
      "ltl (lappend xs ys) =
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1627
         (case xs of
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1628
            LNil \<Rightarrow> ltl ys
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1629
          | LCons _ xs \<Rightarrow> xs)"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1630
    .
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1631
(*<*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1632
    end
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1633
(*>*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1634
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1635
text {*
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1636
Corecursion is useful to specify not only functions but also infinite objects:
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1637
*}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1638
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1639
    primcorec infty :: enat where
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1640
      "infty = ESuc infty"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1641
    .
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1642
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1643
text {*
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1644
\noindent
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1645
The same example in the destructor view:
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1646
*}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1647
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1648
(*<*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1649
    context dummy_dest_view
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1650
    begin
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1651
(*>*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1652
    primcorec infty :: enat where
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1653
      "\<not> is_EZero infty" |
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1654
      "un_ESuc infty = infty"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1655
    .
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1656
(*<*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1657
    end
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1658
(*>*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1659
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1660
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1661
subsubsection {* Mutual Corecursion
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1662
  \label{sssec:primcorec-mutual-corecursion} *}
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1663
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1664
    primcorec
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1665
      even_infty :: even_enat and
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1666
      odd_infty :: odd_enat
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1667
    where
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1668
      "even_infty = Even_ESuc odd_infty" |
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1669
      "odd_infty = Odd_ESuc even_infty"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1670
    .
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1671
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1672
(*<*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1673
    context dummy_dest_view
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1674
    begin
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1675
(*>*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1676
    primcorec
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1677
      even_infty :: even_enat and
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1678
      odd_infty :: odd_enat
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1679
    where
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1680
      "\<not> is_Even_EZero even_infty" |
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1681
      "un_Even_ESuc even_infty = odd_infty" |
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1682
      "un_Odd_ESuc odd_infty = even_infty"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1683
    .
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1684
(*<*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1685
    end
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1686
(*>*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1687
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1688
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1689
subsubsection {* Nested Corecursion
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1690
  \label{sssec:primcorec-nested-corecursion} *}
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1691
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1692
    primcorec iterate\<^sub>i\<^sub>i :: "('a \<Rightarrow> 'a llist) \<Rightarrow> 'a \<Rightarrow> 'a tree\<^sub>i\<^sub>i" where
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1693
      "iterate\<^sub>i\<^sub>i f x = Node\<^sub>i\<^sub>i x (lmap (iterate\<^sub>i\<^sub>i f) (f x))"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1694
    .
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1695
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1696
    primcorec iterate\<^sub>i\<^sub>s :: "('a \<Rightarrow> 'a fset) \<Rightarrow> 'a \<Rightarrow> 'a tree\<^sub>i\<^sub>s" where
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1697
      "iterate\<^sub>i\<^sub>s f x = Node\<^sub>i\<^sub>s x (fmap (iterate\<^sub>i\<^sub>s f) (f x))"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1698
    .
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1699
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1700
text {*
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1701
Again, let us not forget our destructor-oriented passengers:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1702
*}
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1703
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1704
(*<*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1705
    context dummy_dest_view
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1706
    begin
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1707
(*>*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1708
    primcorec iterate\<^sub>i\<^sub>i :: "('a \<Rightarrow> 'a llist) \<Rightarrow> 'a \<Rightarrow> 'a tree\<^sub>i\<^sub>i" where
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1709
      "lbl\<^sub>i\<^sub>i (iterate\<^sub>i\<^sub>i f x) = x" |
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1710
      "sub\<^sub>i\<^sub>i (iterate\<^sub>i\<^sub>i f x) = lmap (iterate\<^sub>i\<^sub>i f) (f x)"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1711
    .
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1712
(*<*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1713
    end
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1714
(*>*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1715
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1716
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1717
subsubsection {* Nested-as-Mutual Corecursion
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1718
  \label{sssec:primcorec-nested-as-mutual-corecursion} *}
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1719
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1720
(*<*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1721
    locale dummy_iterate
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1722
    begin
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1723
(*>*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1724
    primcorec_notyet
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1725
      iterate\<^sub>i\<^sub>i :: "('a \<Rightarrow> 'a llist) \<Rightarrow> 'a \<Rightarrow> 'a tree\<^sub>i\<^sub>i" and
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1726
      iterates\<^sub>i\<^sub>i :: "('a \<Rightarrow> 'a llist) \<Rightarrow> 'a llist \<Rightarrow> 'a tree\<^sub>i\<^sub>i llist"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1727
    where
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1728
      "iterate\<^sub>i\<^sub>i f x = Node\<^sub>i\<^sub>i x (iterates\<^sub>i\<^sub>i f (f x))" |
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1729
      "iterates\<^sub>i\<^sub>i f xs =
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1730
         (case xs of
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1731
            LNil \<Rightarrow> LNil
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1732
          | LCons x xs' \<Rightarrow> LCons (iterate\<^sub>i\<^sub>i f x) (iterates\<^sub>i\<^sub>i f xs'))"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1733
(*<*)
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1734
    end
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1735
(*>*)
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1736
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1737
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1738
subsection {* Command Syntax
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1739
  \label{ssec:primcorec-command-syntax} *}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1740
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1741
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1742
subsubsection {* \keyw{primcorec}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1743
  \label{sssec:primcorec} *}
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1744
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1745
text {*
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1746
Primitive corecursive definitions have the following general syntax:
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1747
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1748
@{rail "
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1749
  @@{command_def primcorec} target? fixes \\ @'where'
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1750
    (@{syntax primcorec_formula} + '|')
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1751
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  1752
  @{syntax_def primcorec_formula}: thmdecl? prop (@'of' (term * ))?
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1753
"}
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1754
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1755
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1756
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1757
(*
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1758
subsection {* Generated Theorems
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1759
  \label{ssec:primcorec-generated-theorems} *}
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1760
*)
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1761
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1762
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1763
(*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1764
subsection {* Recursive Default Values for Selectors
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1765
  \label{ssec:primcorec-recursive-default-values-for-selectors} *}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1766
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1767
text {*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1768
partial_function to the rescue
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1769
*}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1770
*)
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1771
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1772
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1773
section {* Registering Bounded Natural Functors
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1774
  \label{sec:registering-bounded-natural-functors} *}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1775
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1776
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1777
The (co)datatype package can be set up to allow nested recursion through custom
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1778
well-behaved type constructors. The key concept is that of a bounded natural
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1779
functor (BNF).
52829
591e76f2651e minor doc fixes
blanchet
parents: 52828
diff changeset
  1780
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1781
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1782
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1783
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1784
(*
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1785
subsection {* Introductory Example
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1786
  \label{ssec:bnf-introductory-example} *}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1787
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1788
text {*
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1789
More examples in \verb|~~/src/HOL/BNF/Basic_BNFs.thy| and
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1790
\verb|~~/src/HOL/BNF/More_BNFs.thy|.
52806
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
  1791
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1792
%Mention distinction between live and dead type arguments;
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1793
%  * and existence of map, set for those
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1794
%mention =>.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1795
*}
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1796
*)
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1797
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1798
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1799
subsection {* Command Syntax
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1800
  \label{ssec:bnf-command-syntax} *}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1801
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1802
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1803
subsubsection {* \keyw{bnf}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1804
  \label{sssec:bnf} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1805
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1806
text {*
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1807
@{rail "
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1808
  @@{command_def bnf} target? (name ':')? term \\
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  1809
    term_list term term_list term?
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1810
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  1811
  X_list: '[' (X + ',') ']'
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1812
"}
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1813
*}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1814
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1815
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1816
subsubsection {* \keyw{print\_bnfs}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1817
  \label{sssec:print-bnfs} *}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1818
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1819
text {*
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1820
@{command print_bnfs}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1821
*}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1822
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1823
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1824
section {* Deriving Destructors and Theorems for Free Constructors
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1825
  \label{sec:deriving-destructors-and-theorems-for-free-constructors} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1826
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1827
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1828
The derivation of convenience theorems for types equipped with free constructors,
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1829
as performed internally by @{command datatype_new} and @{command codatatype},
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1830
is available as a stand-alone command called @{command wrap_free_constructors}.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1831
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1832
%  * need for this is rare but may arise if you want e.g. to add destructors to
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1833
%    a type not introduced by ...
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1834
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1835
%  * also useful for compatibility with old package, e.g. add destructors to
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1836
%    old \keyw{datatype}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1837
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1838
%  * @{command wrap_free_constructors}
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1839
%    * @{text "no_discs_sels"}, @{text "rep_compat"}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1840
%    * hack to have both co and nonco view via locale (cf. ext nats)
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1841
*}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1842
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1843
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1844
(*
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1845
subsection {* Introductory Example
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1846
  \label{ssec:ctors-introductory-example} *}
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1847
*)
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1848
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1849
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1850
subsection {* Command Syntax
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1851
  \label{ssec:ctors-command-syntax} *}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1852
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1853
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1854
subsubsection {* \keyw{wrap\_free\_constructors}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1855
    \label{sssec:wrap-free-constructors} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1856
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1857
text {*
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1858
Free constructor wrapping has the following general syntax:
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1859
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1860
@{rail "
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1861
  @@{command_def wrap_free_constructors} target? @{syntax dt_options} \\
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  1862
    term_list name @{syntax fc_discs_sels}?
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1863
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  1864
  @{syntax_def fc_discs_sels}: name_list (name_list_list name_term_list_list? )?
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1865
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  1866
  @{syntax_def name_term}: (name ':' term)
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1867
"}
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1868
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1869
% options: no_discs_sels rep_compat
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1870
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1871
% X_list is as for BNF
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1872
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
  1873
Section~\ref{ssec:datatype-generated-theorems} lists the generated theorems.
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  1874
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1875
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1876
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1877
(*
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1878
section {* Standard ML Interface
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1879
  \label{sec:standard-ml-interface} *}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1880
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1881
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1882
The package's programmatic interface.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1883
*}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1884
*)
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1885
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1886
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1887
(*
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1888
section {* Interoperability
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1889
  \label{sec:interoperability} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1890
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1891
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1892
The package's interaction with other Isabelle packages and tools, such as the
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1893
code generator and the counterexample generators.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1894
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1895
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1896
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1897
subsection {* Transfer and Lifting
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1898
  \label{ssec:transfer-and-lifting} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1899
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1900
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1901
subsection {* Code Generator
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1902
  \label{ssec:code-generator} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1903
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1904
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1905
subsection {* Quickcheck
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1906
  \label{ssec:quickcheck} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1907
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1908
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1909
subsection {* Nitpick
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1910
  \label{ssec:nitpick} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1911
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1912
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1913
subsection {* Nominal Isabelle
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1914
  \label{ssec:nominal-isabelle} *}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1915
*)
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1916
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1917
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1918
(*
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1919
section {* Known Bugs and Limitations
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1920
  \label{sec:known-bugs-and-limitations} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1921
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1922
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1923
Known open issues of the package.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1924
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1925
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1926
text {*
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1927
%* primcorec is unfinished
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1928
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1929
%* slow n-ary mutual (co)datatype, avoid as much as possible (e.g. using nesting)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1930
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1931
%* issues with HOL-Proofs?
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1932
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1933
%* partial documentation
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1934
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1935
%* no way to register "sum" and "prod" as (co)datatypes to enable N2M reduction for them
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1936
%  (for @{command datatype_new_compat} and prim(co)rec)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1937
%
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1938
%    * a fortiori, no way to register same type as both data- and codatatype
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1939
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1940
%* no recursion through unused arguments (unlike with the old package)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1941
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1942
%* in a locale, cannot use locally fixed types (because of limitation in typedef)?
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1943
%
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1944
% *names of variables suboptimal
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1945
*}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1946
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1947
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1948
section {* Acknowledgments
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1949
  \label{sec:acknowledgments} *}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1950
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  1951
text {*
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1952
Tobias Nipkow and Makarius Wenzel have encouraged us to implement the new
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1953
(co)datatype package. Andreas Lochbihler provided lots of comments on earlier
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1954
versions of the package, especially for the coinductive part. Brian Huffman
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1955
suggested major simplifications to the internal constructions, much of which has
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1956
yet to be implemented. Florian Haftmann and Christian Urban provided general
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1957
advice advice on Isabelle and package writing. Stefan Milius and Lutz Schr\"oder
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1958
suggested an elegant proof to eliminate one of the BNF assumptions.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1959
*}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1960
*)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1961
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1962
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1963
end