src/Doc/Datatypes/Datatypes.thy
author blanchet
Thu, 06 Feb 2014 23:42:36 +0100
changeset 55350 cf34abe28209
parent 55290 3951ced4156c
child 55351 8d7031a35991
permissions -rw-r--r--
docs about registering a BNF
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
55073
9b96fb4c8cfd reduced dependencies + updated docs
blanchet
parents: 55029
diff changeset
    11
imports
9b96fb4c8cfd reduced dependencies + updated docs
blanchet
parents: 55029
diff changeset
    12
  Setup
55075
b3d0a02a756d dissolved BNF session
blanchet
parents: 55073
diff changeset
    13
  "~~/src/HOL/Library/BNF_Decl"
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
    14
  "~~/src/HOL/Library/Cardinal_Notations"
55129
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
    15
  "~~/src/HOL/Library/FSet"
55073
9b96fb4c8cfd reduced dependencies + updated docs
blanchet
parents: 55029
diff changeset
    16
  "~~/src/HOL/Library/Simps_Case_Conv"
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    17
begin
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    18
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
    19
section {* Introduction
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
    20
  \label{sec:introduction} *}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    21
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    22
text {*
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    23
The 2013 edition of Isabelle introduced a new definitional package for freely
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    24
generated datatypes and codatatypes. The datatype support is similar to that
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    25
provided by the earlier package due to Berghofer and Wenzel
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    26
\cite{Berghofer-Wenzel:1999:TPHOL}, documented in the Isar reference manual
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
    27
\cite{isabelle-isar-ref}; indeed, replacing the keyword \keyw{datatype} by
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    28
@{command datatype_new} is usually all that is needed to port existing theories
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    29
to use the new package.
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    30
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
    31
Perhaps the main advantage of the new package is that it supports recursion
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
    32
through a large class of non-datatypes, such as finite sets:
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    33
*}
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    34
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
    35
    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
    36
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    37
text {*
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    38
\noindent
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
    39
Another strong point is the support for local definitions:
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    40
*}
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    41
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    42
    context linorder
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    43
    begin
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
    44
    datatype_new flag = Less | Eq | Greater
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    45
    end
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    46
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    47
text {*
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    48
\noindent
54187
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
    49
Furthermore, the package provides a lot of convenience, including automatically
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
    50
generated discriminators, selectors, and relators as well as a wealth of
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
    51
properties about them.
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
    52
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
    53
In addition to inductive datatypes, the new package supports coinductive
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
    54
datatypes, or \emph{codatatypes}, which allow infinite values. For example, the
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
    55
following command introduces the type of lazy lists, which comprises both finite
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
    56
and infinite values:
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    57
*}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    58
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
    59
(*<*)
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
    60
    locale early
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
    61
    locale late
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
    62
(*>*)
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
    63
    codatatype (*<*)(in early) (*>*)'a llist = LNil | LCons 'a "'a llist"
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    64
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    65
text {*
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    66
\noindent
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    67
Mixed inductive--coinductive recursion is possible via nesting. Compare the
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
    68
following four Rose tree examples:
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    69
*}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    70
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
    71
    datatype_new (*<*)(in early) (*>*)'a tree\<^sub>f\<^sub>f = Node\<^sub>f\<^sub>f 'a "'a tree\<^sub>f\<^sub>f list"
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
    72
    datatype_new (*<*)(in early) (*>*)'a tree\<^sub>f\<^sub>i = Node\<^sub>f\<^sub>i 'a "'a tree\<^sub>f\<^sub>i llist"
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
    73
    codatatype (*<*)(in early) (*>*)'a tree\<^sub>i\<^sub>f = Node\<^sub>i\<^sub>f 'a "'a tree\<^sub>i\<^sub>f list"
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
    74
    codatatype (*<*)(in early) (*>*)'a tree\<^sub>i\<^sub>i = Node\<^sub>i\<^sub>i 'a "'a tree\<^sub>i\<^sub>i llist"
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    75
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    76
text {*
54187
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
    77
The first two tree types allow only paths of finite length, whereas the last two
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
    78
allow infinite paths. Orthogonally, the nodes in the first and third types have
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
    79
finitely many direct subtrees, whereas those of the second and fourth may have
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
    80
infinite branching.
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
    81
55073
9b96fb4c8cfd reduced dependencies + updated docs
blanchet
parents: 55029
diff changeset
    82
The package is part of @{theory Main}. Additional functionality is provided by
55129
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
    83
the theory @{theory BNF_Decl}, located in the directory
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
    84
\verb|~~/src/HOL/Library|.
55073
9b96fb4c8cfd reduced dependencies + updated docs
blanchet
parents: 55029
diff changeset
    85
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    86
The package, like its predecessor, fully adheres to the LCF philosophy
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    87
\cite{mgordon79}: The characteristic theorems associated with the specified
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    88
(co)datatypes are derived rather than introduced axiomatically.%
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
    89
\footnote{If the @{text quick_and_dirty} option is enabled, some of the
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
    90
internal constructions and most of the internal proof obligations are skipped.}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    91
The package's metatheory is described in a pair of papers
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
    92
\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
    93
\emph{bounded natural functor} (BNF)---a well-behaved type constructor for which
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
    94
nested (co)recursion is supported.
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
    95
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    96
This tutorial is organized as follows:
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
    97
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
    98
\begin{itemize}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
    99
\setlength{\itemsep}{0pt}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   100
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   101
\item Section \ref{sec:defining-datatypes}, ``Defining Datatypes,''
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   102
describes how to specify datatypes using the @{command datatype_new} command.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   103
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
   104
\item Section \ref{sec:defining-recursive-functions}, ``Defining Recursive
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   105
Functions,'' describes how to specify recursive functions using
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   106
@{command primrec_new}, \keyw{fun}, and \keyw{function}.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   107
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   108
\item Section \ref{sec:defining-codatatypes}, ``Defining Codatatypes,''
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   109
describes how to specify codatatypes using the @{command codatatype} command.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   110
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
   111
\item Section \ref{sec:defining-corecursive-functions}, ``Defining Corecursive
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   112
Functions,'' describes how to specify corecursive functions using the
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
   113
@{command primcorec} and @{command primcorecursive} commands.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   114
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
   115
\item Section \ref{sec:registering-bounded-natural-functors}, ``Registering
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   116
Bounded Natural Functors,'' explains how to use the @{command bnf} command
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   117
to register arbitrary type constructors as BNFs.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   118
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   119
\item Section
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   120
\ref{sec:deriving-destructors-and-theorems-for-free-constructors},
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   121
``Deriving Destructors and Theorems for Free Constructors,'' explains how to
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   122
use the command @{command wrap_free_constructors} to derive destructor constants
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   123
and theorems for freely generated types, as performed internally by @{command
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   124
datatype_new} and @{command codatatype}.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   125
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   126
%\item Section \ref{sec:standard-ml-interface}, ``Standard ML Interface,''
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   127
%describes the package's programmatic interface.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   128
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   129
%\item Section \ref{sec:interoperability}, ``Interoperability,''
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   130
%is concerned with the packages' interaction with other Isabelle packages and
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   131
%tools, such as the code generator and the counterexample generators.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   132
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   133
%\item Section \ref{sec:known-bugs-and-limitations}, ``Known Bugs and
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   134
%Limitations,'' concludes with known open issues at the time of writing.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   135
\end{itemize}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   136
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   137
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   138
\newbox\boxA
54185
3fe3b5d33e41 more docs
blanchet
parents: 54184
diff changeset
   139
\setbox\boxA=\hbox{\texttt{NOSPAM}}
3fe3b5d33e41 more docs
blanchet
parents: 54184
diff changeset
   140
3fe3b5d33e41 more docs
blanchet
parents: 54184
diff changeset
   141
\newcommand\authoremaili{\texttt{blan{\color{white}NOSPAM}\kern-\wd\boxA{}chette@\allowbreak
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   142
in.\allowbreak tum.\allowbreak de}}
54185
3fe3b5d33e41 more docs
blanchet
parents: 54184
diff changeset
   143
\newcommand\authoremailii{\texttt{lore{\color{white}NOSPAM}\kern-\wd\boxA{}nz.panny@\allowbreak
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   144
\allowbreak tum.\allowbreak de}}
54185
3fe3b5d33e41 more docs
blanchet
parents: 54184
diff changeset
   145
\newcommand\authoremailiii{\texttt{pope{\color{white}NOSPAM}\kern-\wd\boxA{}scua@\allowbreak
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   146
in.\allowbreak tum.\allowbreak de}}
54185
3fe3b5d33e41 more docs
blanchet
parents: 54184
diff changeset
   147
\newcommand\authoremailiv{\texttt{tray{\color{white}NOSPAM}\kern-\wd\boxA{}tel@\allowbreak
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   148
in.\allowbreak tum.\allowbreak de}}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   149
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   150
The commands @{command datatype_new} and @{command primrec_new} are expected to
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   151
replace \keyw{datatype} and \keyw{primrec} in a future release. Authors of new
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   152
theories are encouraged to use the new commands, and maintainers of older
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   153
theories may want to consider upgrading.
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   154
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   155
Comments and bug reports concerning either the tool or this tutorial should be
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   156
directed to the authors at \authoremaili, \authoremailii, \authoremailiii,
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   157
and \authoremailiv.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   158
*}
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   159
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   160
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   161
section {* Defining Datatypes
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   162
  \label{sec:defining-datatypes} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   163
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   164
text {*
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   165
Datatypes can be specified using the @{command datatype_new} command.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   166
*}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
   167
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   168
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   169
subsection {* Introductory Examples
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   170
  \label{ssec:datatype-introductory-examples} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   171
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   172
text {*
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   173
Datatypes are illustrated through concrete examples featuring different flavors
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   174
of recursion. More examples can be found in the directory
54185
3fe3b5d33e41 more docs
blanchet
parents: 54184
diff changeset
   175
\verb|~~/src/HOL/|\allowbreak\verb|BNF/Examples|.
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
   176
*}
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   177
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   178
subsubsection {* Nonrecursive Types
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   179
  \label{sssec:datatype-nonrecursive-types} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   180
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   181
text {*
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   182
Datatypes are introduced by specifying the desired names and argument types for
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   183
their constructors. \emph{Enumeration} types are the simplest form of datatype.
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   184
All their constructors are nullary:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   185
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   186
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   187
    datatype_new trool = Truue | Faalse | Perhaaps
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   188
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   189
text {*
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   190
\noindent
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   191
Here, @{const Truue}, @{const Faalse}, and @{const Perhaaps} have the type @{typ trool}.
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   192
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   193
Polymorphic types are possible, such as the following option type, modeled after
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   194
its homologue from the @{theory Option} theory:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   195
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   196
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   197
(*<*)
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   198
    hide_const None Some
54958
4933165fd112 do not use wrong constructor in auto-generated proof goal
panny
parents: 54955
diff changeset
   199
    hide_type option
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   200
(*>*)
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   201
    datatype_new 'a option = None | Some 'a
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   202
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   203
text {*
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   204
\noindent
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   205
The constructors are @{text "None :: 'a option"} and
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   206
@{text "Some :: 'a \<Rightarrow> 'a option"}.
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   207
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   208
The next example has three type parameters:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   209
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   210
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   211
    datatype_new ('a, 'b, 'c) triple = Triple 'a 'b 'c
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   212
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   213
text {*
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   214
\noindent
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   215
The constructor is
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   216
@{text "Triple :: 'a \<Rightarrow> 'b \<Rightarrow> 'c \<Rightarrow> ('a, 'b, 'c) triple"}.
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   217
Unlike in Standard ML, curried constructors are supported. The uncurried variant
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   218
is also possible:
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   219
*}
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   220
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   221
    datatype_new ('a, 'b, 'c) triple\<^sub>u = Triple\<^sub>u "'a * 'b * 'c"
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
   222
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   223
text {*
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   224
\noindent
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   225
Occurrences of nonatomic types on the right-hand side of the equal sign must be
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   226
enclosed in double quotes, as is customary in Isabelle.
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   227
*}
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   228
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   229
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   230
subsubsection {* Simple Recursion
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   231
  \label{sssec:datatype-simple-recursion} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   232
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   233
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   234
Natural numbers are the simplest example of a recursive type:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   235
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   236
53332
c97a05a26dd6 Doc improvements
traytel
parents: 53331
diff changeset
   237
    datatype_new nat = Zero | Suc nat
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   238
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   239
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   240
\noindent
54187
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   241
Lists were shown in the introduction. Terminated lists are a variant that
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   242
stores a value of type @{typ 'b} at the very end:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   243
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   244
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
   245
    datatype_new (*<*)(in early) (*>*)('a, 'b) tlist = TNil 'b | TCons 'a "('a, 'b) tlist"
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   246
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   247
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   248
subsubsection {* Mutual Recursion
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   249
  \label{sssec:datatype-mutual-recursion} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   250
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   251
text {*
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   252
\emph{Mutually recursive} types are introduced simultaneously and may refer to
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   253
each other. The example below introduces a pair of types for even and odd
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   254
natural numbers:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   255
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   256
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   257
    datatype_new even_nat = Even_Zero | Even_Suc odd_nat
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   258
    and odd_nat = Odd_Suc even_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
Arithmetic expressions are defined via terms, terms via factors, and factors via
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   263
expressions:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   264
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   265
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   266
    datatype_new ('a, 'b) exp =
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   267
      Term "('a, 'b) trm" | Sum "('a, 'b) trm" "('a, 'b) exp"
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   268
    and ('a, 'b) trm =
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   269
      Factor "('a, 'b) fct" | Prod "('a, 'b) fct" "('a, 'b) trm"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   270
    and ('a, 'b) fct =
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   271
      Const 'a | Var 'b | Expr "('a, 'b) exp"
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   272
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   273
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   274
subsubsection {* Nested Recursion
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   275
  \label{sssec:datatype-nested-recursion} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   276
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   277
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   278
\emph{Nested recursion} occurs when recursive occurrences of a type appear under
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   279
a type constructor. The introduction showed some examples of trees with nesting
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
   280
through lists. A more complex example, that reuses our @{type option} type,
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   281
follows:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   282
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   283
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
   284
    datatype_new 'a btree =
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   285
      BNode 'a "'a btree option" "'a btree option"
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   286
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   287
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   288
\noindent
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   289
Not all nestings are admissible. For example, this command will fail:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   290
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   291
54187
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   292
    datatype_new 'a wrong = W1 | W2 (*<*)'a
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   293
    typ (*>*)"'a wrong \<Rightarrow> 'a"
52806
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   294
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   295
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   296
\noindent
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   297
The issue is that the function arrow @{text "\<Rightarrow>"} allows recursion
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   298
only through its right-hand side. This issue is inherited by polymorphic
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   299
datatypes defined in terms of~@{text "\<Rightarrow>"}:
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   300
*}
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   301
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
   302
    datatype_new ('a, 'b) fun_copy = Fun "'a \<Rightarrow> 'b"
54187
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   303
    datatype_new 'a also_wrong = W1 | W2 (*<*)'a
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
   304
    typ (*>*)"('a also_wrong, 'a) fun_copy"
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   305
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   306
text {*
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   307
\noindent
55129
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
   308
The following definition of @{typ 'a}-branching trees is legal:
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   309
*}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   310
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   311
    datatype_new 'a ftree = FTLeaf 'a | FTNode "'a \<Rightarrow> 'a ftree"
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   312
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   313
text {*
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   314
\noindent
55129
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
   315
And so is the definition of hereditarily finite sets:
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
   316
*}
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
   317
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
   318
    datatype_new hfset = HFSet "hfset fset"
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
   319
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
   320
text {*
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
   321
\noindent
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   322
In general, type constructors @{text "('a\<^sub>1, \<dots>, 'a\<^sub>m) t"}
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   323
allow recursion on a subset of their type arguments @{text 'a\<^sub>1}, \ldots,
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   324
@{text 'a\<^sub>m}. These type arguments are called \emph{live}; the remaining
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   325
type arguments are called \emph{dead}. In @{typ "'a \<Rightarrow> 'b"} and
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
   326
@{typ "('a, 'b) fun_copy"}, the type variable @{typ 'a} is dead and
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
   327
@{typ 'b} is live.
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   328
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   329
Type constructors must be registered as BNFs to have live arguments. This is
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   330
done automatically for datatypes and codatatypes introduced by the @{command
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   331
datatype_new} and @{command codatatype} commands.
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   332
Section~\ref{sec:registering-bounded-natural-functors} explains how to register
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   333
arbitrary type constructors as BNFs.
54187
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   334
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   335
Here is another example that fails:
52806
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   336
*}
146ce45c3619 more work on (co)datatype docs
blanchet
parents: 52805
diff changeset
   337
54187
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   338
    datatype_new 'a pow_list = PNil 'a (*<*)'a
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   339
    datatype_new 'a pow_list' = PNil' 'a (*>*)| PCons "('a * 'a) pow_list"
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   340
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   341
text {*
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   342
\noindent
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   343
This one features a different flavor of nesting, where the recursive call in the
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   344
type specification occurs around (rather than inside) another type constructor.
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   345
*}
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   346
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   347
subsubsection {* Auxiliary Constants and Properties
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   348
  \label{sssec:datatype-auxiliary-constants-and-properties} *}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   349
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   350
text {*
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   351
The @{command datatype_new} command introduces various constants in addition to
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   352
the constructors. With each datatype are associated set functions, a map
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   353
function, a relator, discriminators, and selectors, all of which can be given
54187
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   354
custom names. In the example below, the familiar names @{text null}, @{text hd},
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   355
@{text tl}, @{text set}, @{text map}, and @{text list_all2}, override the
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   356
default names @{text is_Nil}, @{text un_Cons1}, @{text un_Cons2},
54491
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54422
diff changeset
   357
@{text set_list}, @{text map_list}, and @{text rel_list}:
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   358
*}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   359
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   360
(*<*)
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   361
    no_translations
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   362
      "[x, xs]" == "x # [xs]"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   363
      "[x]" == "x # []"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   364
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   365
    no_notation
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   366
      Nil ("[]") and
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   367
      Cons (infixr "#" 65)
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   368
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   369
    hide_type list
54494
a220071f6708 updated docs
blanchet
parents: 54491
diff changeset
   370
    hide_const Nil Cons hd tl set map list_all2
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   371
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
   372
    context early begin
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   373
(*>*)
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   374
    datatype_new (set: 'a) list (map: map rel: list_all2) =
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   375
      null: Nil (defaults tl: Nil)
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   376
    | Cons (hd: 'a) (tl: "'a list")
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   377
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   378
text {*
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   379
\noindent
54187
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   380
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   381
\begin{tabular}{@ {}ll@ {}}
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   382
Constructors: &
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   383
  @{text "Nil \<Colon> 'a list"} \\
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   384
&
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   385
  @{text "Cons \<Colon> 'a \<Rightarrow> 'a list \<Rightarrow> 'a list"} \\
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   386
Discriminator: &
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   387
  @{text "null \<Colon> 'a list \<Rightarrow> bool"} \\
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   388
Selectors: &
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   389
  @{text "hd \<Colon> 'a list \<Rightarrow> 'a"} \\
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   390
&
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   391
  @{text "tl \<Colon> 'a list \<Rightarrow> 'a list"} \\
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   392
Set function: &
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   393
  @{text "set \<Colon> 'a list \<Rightarrow> 'a set"} \\
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   394
Map function: &
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   395
  @{text "map \<Colon> ('a \<Rightarrow> 'b) \<Rightarrow> 'a list \<Rightarrow> 'b list"} \\
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   396
Relator: &
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   397
  @{text "list_all2 \<Colon> ('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> 'a list \<Rightarrow> 'b list \<Rightarrow> bool"}
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   398
\end{tabular}
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   399
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   400
The discriminator @{const null} and the selectors @{const hd} and @{const tl}
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   401
are characterized as follows:
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   402
%
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   403
\[@{thm list.collapse(1)[of xs, no_vars]}
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   404
  \qquad @{thm list.collapse(2)[of xs, no_vars]}\]
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   405
%
54187
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   406
For two-constructor datatypes, a single discriminator constant is sufficient.
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
   407
The discriminator associated with @{const Cons} is simply
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   408
@{term "\<lambda>xs. \<not> null xs"}.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   409
53553
d4191bf88529 avoid a keyword
blanchet
parents: 53552
diff changeset
   410
The @{text defaults} clause following the @{const Nil} constructor specifies a
d4191bf88529 avoid a keyword
blanchet
parents: 53552
diff changeset
   411
default value for selectors associated with other constructors. Here, it is used
d4191bf88529 avoid a keyword
blanchet
parents: 53552
diff changeset
   412
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
   413
unspecified).
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   414
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   415
Because @{const Nil} is nullary, it is also possible to use
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
   416
@{term "\<lambda>xs. xs = Nil"} as a discriminator. This is specified by
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   417
entering ``@{text "="}'' instead of the identifier @{const null}. Although this
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   418
may look appealing, the mixture of constructors and selectors in the
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   419
characteristic theorems can lead Isabelle's automation to switch between the
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   420
constructor and the destructor view in surprising ways.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   421
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   422
The usual mixfix syntax annotations are available for both types and
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   423
constructors. For example:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
   424
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   425
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   426
(*<*)
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   427
    end
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
   428
(*>*)
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   429
    datatype_new ('a, 'b) prod (infixr "*" 20) = Pair 'a 'b
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   430
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   431
text {* \blankline *}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   432
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   433
    datatype_new (set: 'a) list (map: map rel: list_all2) =
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   434
      null: Nil ("[]")
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   435
    | Cons (hd: 'a) (tl: "'a list") (infixr "#" 65)
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   436
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   437
text {*
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   438
\noindent
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   439
Incidentally, this is how the traditional syntax can be set up:
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   440
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   441
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   442
    syntax "_list" :: "args \<Rightarrow> 'a list" ("[(_)]")
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   443
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   444
text {* \blankline *}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   445
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   446
    translations
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   447
      "[x, xs]" == "x # [xs]"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
   448
      "[x]" == "x # []"
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   449
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   450
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   451
subsection {* Command Syntax
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   452
  \label{ssec:datatype-command-syntax} *}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   453
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   454
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   455
subsubsection {* \keyw{datatype\_new}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   456
  \label{sssec:datatype-new} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   457
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   458
text {*
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   459
\begin{matharray}{rcl}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   460
  @{command_def "datatype_new"} & : & @{text "local_theory \<rightarrow> local_theory"}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   461
\end{matharray}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   462
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
   463
@{rail \<open>
55029
61a6bf7d4b02 clarified @{rail} syntax: prefer explicit \<newline> symbol;
wenzelm
parents: 54958
diff changeset
   464
  @@{command datatype_new} target? @{syntax dt_options}? \<newline>
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   465
    (@{syntax dt_name} '=' (@{syntax ctor} + '|') + @'and')
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   466
  ;
54626
8a5e82425e55 added 'no_code' option
blanchet
parents: 54624
diff changeset
   467
  @{syntax_def dt_options}: '(' (('no_discs_sels' | 'no_code' | 'rep_compat') + ',') ')'
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
   468
\<close>}
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   469
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   470
The syntactic entity \synt{target} can be used to specify a local
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   471
context---e.g., @{text "(in linorder)"}. It is documented in the Isar reference
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   472
manual \cite{isabelle-isar-ref}.
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   473
%
54832
789fbbc092d2 implemented 'exhaustive' option in tactic
blanchet
parents: 54626
diff changeset
   474
The optional target is potentially followed by datatype-specific options:
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   475
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   476
\begin{itemize}
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   477
\setlength{\itemsep}{0pt}
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   478
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   479
\item
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   480
The @{text "no_discs_sels"} option indicates that no discriminators or selectors
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   481
should be generated.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   482
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   483
\item
54626
8a5e82425e55 added 'no_code' option
blanchet
parents: 54624
diff changeset
   484
The @{text "no_code"} option indicates that the datatype should not be
8a5e82425e55 added 'no_code' option
blanchet
parents: 54624
diff changeset
   485
registered for code generation.
8a5e82425e55 added 'no_code' option
blanchet
parents: 54624
diff changeset
   486
8a5e82425e55 added 'no_code' option
blanchet
parents: 54624
diff changeset
   487
\item
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   488
The @{text "rep_compat"} option indicates that the generated names should
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   489
contain optional (and normally not displayed) ``@{text "new."}'' components to
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
   490
prevent clashes with a later call to \keyw{rep\_datatype}. See
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   491
Section~\ref{ssec:datatype-compatibility-issues} for details.
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   492
\end{itemize}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   493
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   494
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
   495
define, its type parameters, and additional information:
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   496
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
   497
@{rail \<open>
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   498
  @{syntax_def dt_name}: @{syntax tyargs}? name @{syntax map_rel}? mixfix?
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   499
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   500
  @{syntax_def tyargs}: typefree | '(' ((name ':')? typefree + ',') ')'
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   501
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   502
  @{syntax_def map_rel}: '(' ((('map' | 'rel') ':' name) +) ')'
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
   503
\<close>}
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   504
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   505
\noindent
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   506
The syntactic entity \synt{name} denotes an identifier, \synt{typefree}
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   507
denotes fixed type variable (@{typ 'a}, @{typ 'b}, \ldots), and \synt{mixfix}
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   508
denotes the usual parenthesized mixfix notation. They are documented in the Isar
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   509
reference manual \cite{isabelle-isar-ref}.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   510
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   511
The optional names preceding the type variables allow to override the default
54491
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54422
diff changeset
   512
names of the set functions (@{text set1_t}, \ldots, @{text setM_t}).
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   513
Inside a mutually recursive specification, all defined datatypes must
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   514
mention exactly the same type variables in the same order.
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   515
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
   516
@{rail \<open>
55029
61a6bf7d4b02 clarified @{rail} syntax: prefer explicit \<newline> symbol;
wenzelm
parents: 54958
diff changeset
   517
  @{syntax_def ctor}: (name ':')? name (@{syntax ctor_arg} * ) \<newline>
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   518
    @{syntax dt_sel_defaults}? mixfix?
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
   519
\<close>}
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   520
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   521
\medskip
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   522
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   523
\noindent
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   524
The main constituents of a constructor specification are the name of the
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   525
constructor and the list of its argument types. An optional discriminator name
53554
78fe0002024d more (co)data docs
blanchet
parents: 53553
diff changeset
   526
can be supplied at the front to override the default name
78fe0002024d more (co)data docs
blanchet
parents: 53553
diff changeset
   527
(@{text t.is_C\<^sub>j}).
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   528
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
   529
@{rail \<open>
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
   530
  @{syntax_def ctor_arg}: type | '(' name ':' type ')'
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
   531
\<close>}
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   532
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   533
\medskip
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   534
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   535
\noindent
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   536
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
   537
name for the corresponding selector to override the default name
53554
78fe0002024d more (co)data docs
blanchet
parents: 53553
diff changeset
   538
(@{text un_C\<^sub>ji}). The same selector names can be reused for several
78fe0002024d more (co)data docs
blanchet
parents: 53553
diff changeset
   539
constructors as long as they share the same type.
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   540
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
   541
@{rail \<open>
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   542
  @{syntax_def dt_sel_defaults}: '(' 'defaults' (name ':' term +) ')'
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
   543
\<close>}
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   544
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   545
\noindent
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   546
Given a constructor
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   547
@{text "C \<Colon> \<sigma>\<^sub>1 \<Rightarrow> \<dots> \<Rightarrow> \<sigma>\<^sub>p \<Rightarrow> \<sigma>"},
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   548
default values can be specified for any selector
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   549
@{text "un_D \<Colon> \<sigma> \<Rightarrow> \<tau>"}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   550
associated with other constructors. The specified default value must be of type
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   551
@{text "\<sigma>\<^sub>1 \<Rightarrow> \<dots> \<Rightarrow> \<sigma>\<^sub>p \<Rightarrow> \<tau>"}
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   552
(i.e., it may depend on @{text C}'s arguments).
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   553
*}
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
   554
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   555
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   556
subsubsection {* \keyw{datatype\_new\_compat}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   557
  \label{sssec:datatype-new-compat} *}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   558
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   559
text {*
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   560
\begin{matharray}{rcl}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   561
  @{command_def "datatype_new_compat"} & : & @{text "local_theory \<rightarrow> local_theory"}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   562
\end{matharray}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   563
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
   564
@{rail \<open>
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   565
  @@{command datatype_new_compat} names
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
   566
\<close>}
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   567
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   568
\noindent
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   569
The old datatype package provides some functionality that is not yet replicated
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   570
in the new package:
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   571
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   572
\begin{itemize}
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
   573
\setlength{\itemsep}{0pt}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
   574
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   575
\item It is integrated with \keyw{fun} and \keyw{function}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   576
\cite{isabelle-function}, Nitpick \cite{isabelle-nitpick}, Quickcheck,
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   577
and other packages.
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   578
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   579
\item It is extended by various add-ons, notably to produce instances of the
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   580
@{const size} function.
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   581
\end{itemize}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   582
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   583
\noindent
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   584
New-style datatypes can in most cases be registered as old-style datatypes using
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   585
@{command datatype_new_compat}. The \textit{names} argument is a space-separated
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
   586
list of type names that are mutually recursive. For example:
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   587
*}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   588
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   589
    datatype_new_compat even_nat odd_nat
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   590
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   591
text {* \blankline *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   592
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   593
    thm even_nat_odd_nat.size
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   594
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   595
text {* \blankline *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   596
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   597
    ML {* Datatype_Data.get_info @{theory} @{type_name even_nat} *}
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   598
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   599
text {*
53748
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   600
A few remarks concern nested recursive datatypes only:
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   601
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   602
\begin{itemize}
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
   603
\setlength{\itemsep}{0pt}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
   604
53748
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   605
\item The old-style, nested-as-mutual induction rule, iterator theorems, and
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   606
recursor theorems are generated under their usual names but with ``@{text
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   607
"compat_"}'' prefixed (e.g., @{text compat_tree.induct}).
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   608
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   609
\item All types through which recursion takes place must be new-style datatypes
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   610
or the function type. In principle, it should be possible to support old-style
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   611
datatypes as well, but the command does not support this yet (and there is
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   612
currently no way to register old-style datatypes as new-style datatypes).
54184
3fe73f3c84a2 more docs
blanchet
parents: 54183
diff changeset
   613
3fe73f3c84a2 more docs
blanchet
parents: 54183
diff changeset
   614
\item The recursor produced for types that recurse through functions has a
3fe73f3c84a2 more docs
blanchet
parents: 54183
diff changeset
   615
different signature than with the old package. This makes it impossible to use
3fe73f3c84a2 more docs
blanchet
parents: 54183
diff changeset
   616
the old \keyw{primrec} command.
53748
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   617
\end{itemize}
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   618
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   619
An alternative to @{command datatype_new_compat} is to use the old package's
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   620
\keyw{rep\_datatype} command. The associated proof obligations must then be
be0ddf3dd01b updated docs
blanchet
parents: 53722
diff changeset
   621
discharged manually.
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   622
*}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   623
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   624
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   625
subsection {* Generated Constants
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   626
  \label{ssec:datatype-generated-constants} *}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   627
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   628
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   629
Given a datatype @{text "('a\<^sub>1, \<dots>, 'a\<^sub>m) t"}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   630
with $m > 0$ live type variables and $n$ constructors
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   631
@{text "t.C\<^sub>1"}, \ldots, @{text "t.C\<^sub>n"}, the
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   632
following auxiliary constants are introduced:
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   633
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   634
\begin{itemize}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   635
\setlength{\itemsep}{0pt}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   636
54494
a220071f6708 updated docs
blanchet
parents: 54491
diff changeset
   637
\item \relax{Case combinator}: @{text t.case_t} (rendered using the familiar
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   638
@{text case}--@{text of} syntax)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   639
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   640
\item \relax{Discriminators}: @{text "t.is_C\<^sub>1"}, \ldots,
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   641
@{text "t.is_C\<^sub>n"}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   642
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   643
\item \relax{Selectors}:
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   644
@{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
   645
\phantom{\relax{Selectors:}} \quad\vdots \\
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   646
\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
   647
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   648
\item \relax{Set functions} (or \relax{natural transformations}):
54491
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54422
diff changeset
   649
@{text set1_t}, \ldots, @{text t.setm_t}
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54422
diff changeset
   650
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54422
diff changeset
   651
\item \relax{Map function} (or \relax{functorial action}): @{text t.map_t}
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54422
diff changeset
   652
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54422
diff changeset
   653
\item \relax{Relator}: @{text t.rel_t}
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54422
diff changeset
   654
54494
a220071f6708 updated docs
blanchet
parents: 54491
diff changeset
   655
\item \relax{Iterator}: @{text t.fold_t}
a220071f6708 updated docs
blanchet
parents: 54491
diff changeset
   656
a220071f6708 updated docs
blanchet
parents: 54491
diff changeset
   657
\item \relax{Recursor}: @{text t.rec_t}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   658
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   659
\end{itemize}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   660
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   661
\noindent
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   662
The case combinator, discriminators, and selectors are collectively called
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   663
\emph{destructors}. The prefix ``@{text "t."}'' is an optional component of the
54491
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54422
diff changeset
   664
names and is normally hidden.
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   665
*}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   666
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
   667
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
   668
subsection {* Generated Theorems
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
   669
  \label{ssec:datatype-generated-theorems} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   670
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   671
text {*
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   672
The characteristic theorems generated by @{command datatype_new} are grouped in
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   673
three broad categories:
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   674
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   675
\begin{itemize}
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
   676
\setlength{\itemsep}{0pt}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
   677
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   678
\item The \emph{free constructor theorems} are properties about the constructors
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   679
and destructors that can be derived for any freely generated type. Internally,
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   680
the derivation is performed by @{command wrap_free_constructors}.
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   681
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   682
\item The \emph{functorial theorems} are properties of datatypes related to
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   683
their BNF nature.
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   684
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   685
\item The \emph{inductive theorems} are properties of datatypes related to
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   686
their inductive nature.
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   687
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   688
\end{itemize}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   689
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   690
\noindent
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   691
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
   692
command \keyw{print\_theorems} immediately after the datatype definition.
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   693
This list normally excludes low-level theorems that reveal internal
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   694
constructions. To make these accessible, add the line
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   695
*}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   696
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   697
    declare [[bnf_note_all]]
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   698
(*<*)
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   699
    declare [[bnf_note_all = false]]
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
   700
(*>*)
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   701
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   702
text {*
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   703
\noindent
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   704
to the top of the theory file.
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   705
*}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   706
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   707
subsubsection {* Free Constructor Theorems
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   708
  \label{sssec:free-constructor-theorems} *}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   709
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   710
(*<*)
53837
65c775430caa updated docs
blanchet
parents: 53831
diff changeset
   711
    consts nonnull :: 'a
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   712
(*>*)
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   713
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   714
text {*
54621
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   715
The free constructor theorems are partitioned in three subgroups. The first
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   716
subgroup of properties is concerned with the constructors. They are listed below
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   717
for @{typ "'a list"}:
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   718
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   719
\begin{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   720
\begin{description}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   721
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   722
\item[@{text "t."}\hthm{inject} @{text "[iff, induct_simp]"}\rm:] ~ \\
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   723
@{thm list.inject[no_vars]}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   724
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   725
\item[@{text "t."}\hthm{distinct} @{text "[simp, induct_simp]"}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   726
@{thm list.distinct(1)[no_vars]} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   727
@{thm list.distinct(2)[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   728
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   729
\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
   730
@{thm list.exhaust[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   731
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   732
\item[@{text "t."}\hthm{nchotomy}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   733
@{thm list.nchotomy[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   734
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   735
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   736
\end{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   737
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   738
\noindent
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   739
In addition, these nameless theorems are registered as safe elimination rules:
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   740
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   741
\begin{indentblock}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   742
\begin{description}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   743
54386
3514fdfdf59b minor doc fix
blanchet
parents: 54287
diff changeset
   744
\item[@{text "t."}\hthm{distinct {\upshape[}THEN notE}@{text ", elim!"}\hthm{\upshape]}\rm:] ~ \\
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   745
@{thm list.distinct(1)[THEN notE, elim!, no_vars]} \\
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   746
@{thm list.distinct(2)[THEN notE, elim!, no_vars]}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   747
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   748
\end{description}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   749
\end{indentblock}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   750
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   751
\noindent
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   752
The next subgroup is concerned with the case combinator:
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   753
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   754
\begin{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   755
\begin{description}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   756
53798
6a4e3299dfd1 set [code] on case equations
blanchet
parents: 53753
diff changeset
   757
\item[@{text "t."}\hthm{case} @{text "[simp, code]"}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   758
@{thm list.case(1)[no_vars]} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   759
@{thm list.case(2)[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   760
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   761
\item[@{text "t."}\hthm{case\_cong}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   762
@{thm list.case_cong[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   763
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   764
\item[@{text "t."}\hthm{weak\_case\_cong} @{text "[cong]"}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   765
@{thm list.weak_case_cong[no_vars]}
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{split}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   768
@{thm list.split[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{split\_asm}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   771
@{thm list.split_asm[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   772
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   773
\item[@{text "t."}\hthm{splits} = @{text "split split_asm"}]
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   774
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   775
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   776
\end{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   777
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   778
\noindent
54621
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   779
The third subgroup revolves around discriminators and selectors:
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   780
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   781
\begin{indentblock}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   782
\begin{description}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   783
53694
7b453b619b5f use singular to avoid confusion
blanchet
parents: 53691
diff changeset
   784
\item[@{text "t."}\hthm{disc} @{text "[simp]"}\rm:] ~ \\
7b453b619b5f use singular to avoid confusion
blanchet
parents: 53691
diff changeset
   785
@{thm list.disc(1)[no_vars]} \\
7b453b619b5f use singular to avoid confusion
blanchet
parents: 53691
diff changeset
   786
@{thm list.disc(2)[no_vars]}
7b453b619b5f use singular to avoid confusion
blanchet
parents: 53691
diff changeset
   787
53703
0c565fec9c78 updated docs
blanchet
parents: 53694
diff changeset
   788
\item[@{text "t."}\hthm{discI}\rm:] ~ \\
0c565fec9c78 updated docs
blanchet
parents: 53694
diff changeset
   789
@{thm list.discI(1)[no_vars]} \\
0c565fec9c78 updated docs
blanchet
parents: 53694
diff changeset
   790
@{thm list.discI(2)[no_vars]}
0c565fec9c78 updated docs
blanchet
parents: 53694
diff changeset
   791
53805
4163160853fd added [code] to selectors
blanchet
parents: 53798
diff changeset
   792
\item[@{text "t."}\hthm{sel} @{text "[simp, code]"}\rm:] ~ \\
53694
7b453b619b5f use singular to avoid confusion
blanchet
parents: 53691
diff changeset
   793
@{thm list.sel(1)[no_vars]} \\
7b453b619b5f use singular to avoid confusion
blanchet
parents: 53691
diff changeset
   794
@{thm list.sel(2)[no_vars]}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   795
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   796
\item[@{text "t."}\hthm{collapse} @{text "[simp]"}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   797
@{thm list.collapse(1)[no_vars]} \\
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   798
@{thm list.collapse(2)[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   799
53837
65c775430caa updated docs
blanchet
parents: 53831
diff changeset
   800
\item[@{text "t."}\hthm{disc\_exclude} @{text "[dest]"}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   801
These properties are missing for @{typ "'a list"} because there is only one
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   802
proper discriminator. Had the datatype been introduced with a second
53837
65c775430caa updated docs
blanchet
parents: 53831
diff changeset
   803
discriminator called @{const nonnull}, they would have read thusly: \\[\jot]
65c775430caa updated docs
blanchet
parents: 53831
diff changeset
   804
@{prop "null list \<Longrightarrow> \<not> nonnull list"} \\
65c775430caa updated docs
blanchet
parents: 53831
diff changeset
   805
@{prop "nonnull list \<Longrightarrow> \<not> null list"}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   806
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   807
\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
   808
@{thm list.disc_exhaust[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   809
53916
37c31a619eee generate "sel_exhaust" theorem
blanchet
parents: 53863
diff changeset
   810
\item[@{text "t."}\hthm{sel\_exhaust} @{text "[case_names C\<^sub>1 \<dots> C\<^sub>n]"}\rm:] ~ \\
37c31a619eee generate "sel_exhaust" theorem
blanchet
parents: 53863
diff changeset
   811
@{thm list.sel_exhaust[no_vars]}
37c31a619eee generate "sel_exhaust" theorem
blanchet
parents: 53863
diff changeset
   812
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   813
\item[@{text "t."}\hthm{expand}\rm:] ~ \\
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   814
@{thm list.expand[no_vars]}
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   815
53917
bf74357f91f8 generate "sel_splits(_asm)" theorems
blanchet
parents: 53916
diff changeset
   816
\item[@{text "t."}\hthm{sel\_split}\rm:] ~ \\
bf74357f91f8 generate "sel_splits(_asm)" theorems
blanchet
parents: 53916
diff changeset
   817
@{thm list.sel_split[no_vars]}
bf74357f91f8 generate "sel_splits(_asm)" theorems
blanchet
parents: 53916
diff changeset
   818
bf74357f91f8 generate "sel_splits(_asm)" theorems
blanchet
parents: 53916
diff changeset
   819
\item[@{text "t."}\hthm{sel\_split\_asm}\rm:] ~ \\
bf74357f91f8 generate "sel_splits(_asm)" theorems
blanchet
parents: 53916
diff changeset
   820
@{thm list.sel_split_asm[no_vars]}
bf74357f91f8 generate "sel_splits(_asm)" theorems
blanchet
parents: 53916
diff changeset
   821
54491
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54422
diff changeset
   822
\item[@{text "t."}\hthm{case\_eq\_if}\rm:] ~ \\
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54422
diff changeset
   823
@{thm list.case_eq_if[no_vars]}
53543
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   824
c6c8dce7e9ab more (co)data docs
blanchet
parents: 53542
diff changeset
   825
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   826
\end{indentblock}
54152
f15bd1f81220 updated docs
blanchet
parents: 54146
diff changeset
   827
f15bd1f81220 updated docs
blanchet
parents: 54146
diff changeset
   828
\noindent
f15bd1f81220 updated docs
blanchet
parents: 54146
diff changeset
   829
In addition, equational versions of @{text t.disc} are registered with the @{text "[code]"}
f15bd1f81220 updated docs
blanchet
parents: 54146
diff changeset
   830
attribute.
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   831
*}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   832
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   833
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   834
subsubsection {* Functorial Theorems
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   835
  \label{sssec:functorial-theorems} *}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   836
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   837
text {*
54621
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   838
The functorial theorems are partitioned in two subgroups. The first subgroup
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   839
consists of properties involving the constructors and either a set function, the
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   840
map function, or the relator:
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   841
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   842
\begin{indentblock}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   843
\begin{description}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   844
53798
6a4e3299dfd1 set [code] on case equations
blanchet
parents: 53753
diff changeset
   845
\item[@{text "t."}\hthm{set} @{text "[simp, code]"}\rm:] ~ \\
53694
7b453b619b5f use singular to avoid confusion
blanchet
parents: 53691
diff changeset
   846
@{thm list.set(1)[no_vars]} \\
7b453b619b5f use singular to avoid confusion
blanchet
parents: 53691
diff changeset
   847
@{thm list.set(2)[no_vars]}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   848
53798
6a4e3299dfd1 set [code] on case equations
blanchet
parents: 53753
diff changeset
   849
\item[@{text "t."}\hthm{map} @{text "[simp, code]"}\rm:] ~ \\
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   850
@{thm list.map(1)[no_vars]} \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   851
@{thm list.map(2)[no_vars]}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   852
54146
97f69d44f732 doc fixes suggested by Andreas L.
blanchet
parents: 54072
diff changeset
   853
\item[@{text "t."}\hthm{rel\_inject} @{text "[simp]"}\rm:] ~ \\
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   854
@{thm list.rel_inject(1)[no_vars]} \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   855
@{thm list.rel_inject(2)[no_vars]}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   856
54146
97f69d44f732 doc fixes suggested by Andreas L.
blanchet
parents: 54072
diff changeset
   857
\item[@{text "t."}\hthm{rel\_distinct} @{text "[simp]"}\rm:] ~ \\
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   858
@{thm list.rel_distinct(1)[no_vars]} \\
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   859
@{thm list.rel_distinct(2)[no_vars]}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   860
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   861
\end{description}
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   862
\end{indentblock}
54146
97f69d44f732 doc fixes suggested by Andreas L.
blanchet
parents: 54072
diff changeset
   863
97f69d44f732 doc fixes suggested by Andreas L.
blanchet
parents: 54072
diff changeset
   864
\noindent
97f69d44f732 doc fixes suggested by Andreas L.
blanchet
parents: 54072
diff changeset
   865
In addition, equational versions of @{text t.rel_inject} and @{text
97f69d44f732 doc fixes suggested by Andreas L.
blanchet
parents: 54072
diff changeset
   866
rel_distinct} are registered with the @{text "[code]"} attribute.
54621
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   867
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   868
The second subgroup consists of more abstract properties of the set functions,
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   869
the map function, and the relator:
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   870
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   871
\begin{indentblock}
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   872
\begin{description}
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   873
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   874
\item[@{text "t."}\hthm{map\_comp}\rm:] ~ \\
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   875
@{thm list.map_cong0[no_vars]}
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   876
54624
36301c99ed26 revert making 'map_cong' a 'cong' -- it breaks too many proofs in the AFP
blanchet
parents: 54621
diff changeset
   877
\item[@{text "t."}\hthm{map\_cong} @{text "[fundef_cong]"}\rm:] ~ \\
54621
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   878
@{thm list.map_cong[no_vars]}
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   879
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   880
\item[@{text "t."}\hthm{map\_id}\rm:] ~ \\
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   881
@{thm list.map_id[no_vars]}
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   882
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   883
\item[@{text "t."}\hthm{rel\_compp}\rm:] ~ \\
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   884
@{thm list.rel_compp[no_vars]}
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   885
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   886
\item[@{text "t."}\hthm{rel\_conversep}\rm:] ~ \\
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   887
@{thm list.rel_conversep[no_vars]}
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   888
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   889
\item[@{text "t."}\hthm{rel\_eq}\rm:] ~ \\
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   890
@{thm list.rel_eq[no_vars]}
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   891
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   892
\item[@{text "t."}\hthm{rel\_flip}\rm:] ~ \\
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   893
@{thm list.rel_flip[no_vars]}
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   894
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   895
\item[@{text "t."}\hthm{rel\_mono}\rm:] ~ \\
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   896
@{thm list.rel_mono[no_vars]}
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   897
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   898
\item[@{text "t."}\hthm{set\_map}\rm:] ~ \\
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   899
@{thm list.set_map[no_vars]}
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   900
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   901
\end{description}
82a78bc9fa0d docs for forgotten BNF theorems
blanchet
parents: 54616
diff changeset
   902
\end{indentblock}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   903
*}
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   904
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   905
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   906
subsubsection {* Inductive Theorems
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
   907
  \label{sssec:inductive-theorems} *}
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   908
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
   909
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
   910
The inductive theorems are as follows:
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   911
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   912
\begin{indentblock}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   913
\begin{description}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   914
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   915
\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
   916
@{thm list.induct[no_vars]}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   917
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
   918
\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
   919
Given $m > 1$ mutually recursive datatypes, this induction rule can be used to
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   920
prove $m$ properties simultaneously.
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   921
53798
6a4e3299dfd1 set [code] on case equations
blanchet
parents: 53753
diff changeset
   922
\item[@{text "t."}\hthm{fold} @{text "[simp, code]"}\rm:] ~ \\
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   923
@{thm list.fold(1)[no_vars]} \\
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   924
@{thm list.fold(2)[no_vars]}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   925
53798
6a4e3299dfd1 set [code] on case equations
blanchet
parents: 53753
diff changeset
   926
\item[@{text "t."}\hthm{rec} @{text "[simp, code]"}\rm:] ~ \\
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   927
@{thm list.rec(1)[no_vars]} \\
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   928
@{thm list.rec(2)[no_vars]}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   929
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   930
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   931
\end{indentblock}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   932
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   933
\noindent
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   934
For convenience, @{command datatype_new} also provides the following collection:
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   935
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   936
\begin{indentblock}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   937
\begin{description}
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   938
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   939
\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}] ~ \\
53694
7b453b619b5f use singular to avoid confusion
blanchet
parents: 53691
diff changeset
   940
@{text t.rel_distinct} @{text t.set}
53544
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   941
2176a7e40786 more (co)data docs
blanchet
parents: 53543
diff changeset
   942
\end{description}
53552
eed6efba4e3f more (co)datatype docs
blanchet
parents: 53544
diff changeset
   943
\end{indentblock}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   944
*}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   945
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   946
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
   947
subsection {* Compatibility Issues
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
   948
  \label{ssec:datatype-compatibility-issues} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
   949
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   950
text {*
53997
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
   951
The command @{command datatype_new} has been designed to be highly compatible
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
   952
with the old \keyw{datatype}, to ease migration. There are nonetheless a few
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   953
incompatibilities that may arise when porting to the new package:
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   954
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   955
\begin{itemize}
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
   956
\setlength{\itemsep}{0pt}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
   957
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   958
\item \emph{The Standard ML interfaces are different.} Tools and extensions
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   959
written to call the old ML interfaces will need to be adapted to the new
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   960
interfaces. Little has been done so far in this direction. Whenever possible, it
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   961
is recommended to use @{command datatype_new_compat} or \keyw{rep\_datatype}
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   962
to register new-style datatypes as old-style datatypes.
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   963
54537
f37354a894a3 fixed LaTeX missing }
blanchet
parents: 54494
diff changeset
   964
\item \emph{The constants @{text t_case} and @{text t_rec} are now called
f37354a894a3 fixed LaTeX missing }
blanchet
parents: 54494
diff changeset
   965
@{text case_t} and @{text rec_t}.}
f37354a894a3 fixed LaTeX missing }
blanchet
parents: 54494
diff changeset
   966
f37354a894a3 fixed LaTeX missing }
blanchet
parents: 54494
diff changeset
   967
\item \emph{The recursor @{text rec_t} has a different signature for nested
54185
3fe3b5d33e41 more docs
blanchet
parents: 54184
diff changeset
   968
recursive datatypes.} In the old package, nested recursion through non-functions
3fe3b5d33e41 more docs
blanchet
parents: 54184
diff changeset
   969
was internally reduced to mutual recursion. This reduction was visible in the
3fe3b5d33e41 more docs
blanchet
parents: 54184
diff changeset
   970
type of the recursor, used by \keyw{primrec}. Recursion through functions was
3fe3b5d33e41 more docs
blanchet
parents: 54184
diff changeset
   971
handled specially. In the new package, nested recursion (for functions and
3fe3b5d33e41 more docs
blanchet
parents: 54184
diff changeset
   972
non-functions) is handled in a more modular fashion. The old-style recursor can
3fe3b5d33e41 more docs
blanchet
parents: 54184
diff changeset
   973
be generated on demand using @{command primrec_new}, as explained in
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   974
Section~\ref{sssec:primrec-nested-as-mutual-recursion}, if the recursion is via
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   975
new-style datatypes.
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   976
54287
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
   977
\item \emph{Accordingly, the induction rule is different for nested recursive
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
   978
datatypes.} Again, the old-style induction rule can be generated on demand using
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
   979
@{command primrec_new}, as explained in
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   980
Section~\ref{sssec:primrec-nested-as-mutual-recursion}, if the recursion is via
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   981
new-style datatypes.
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
   982
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
   983
\item \emph{The internal constructions are completely different.} Proof texts
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   984
that unfold the definition of constants introduced by \keyw{datatype} will be
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   985
difficult to port.
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   986
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   987
\item \emph{A few theorems have different names.}
53997
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
   988
The properties @{text t.cases} and @{text t.recs} have been renamed
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   989
@{text t.case} and @{text t.rec}. For non-mutually recursive datatypes,
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   990
@{text t.inducts} is available as @{text t.induct}.
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   991
For $m > 1$ mutually recursive datatypes,
53997
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
   992
@{text "t\<^sub>1_\<dots>_t\<^sub>m.inducts(i)"} has been renamed
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   993
@{text "t\<^sub>i.induct"}.
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   994
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   995
\item \emph{The @{text t.simps} collection has been extended.}
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   996
Previously available theorems are available at the same index.
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   997
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   998
\item \emph{Variables in generated properties have different names.} This is
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
   999
rarely an issue, except in proof texts that refer to variable names in the
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1000
@{text "[where \<dots>]"} attribute. The solution is to use the more robust
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1001
@{text "[of \<dots>]"} syntax.
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1002
\end{itemize}
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1003
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1004
In the other direction, there is currently no way to register old-style
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1005
datatypes as new-style datatypes. If the goal is to define new-style datatypes
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1006
with nested recursion through old-style datatypes, the old-style
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1007
datatypes can be registered as a BNF
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1008
(Section~\ref{sec:registering-bounded-natural-functors}). If the goal is
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1009
to derive discriminators and selectors, this can be achieved using @{command
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1010
wrap_free_constructors}
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1011
(Section~\ref{sec:deriving-destructors-and-theorems-for-free-constructors}).
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1012
*}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1013
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1014
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1015
section {* Defining Recursive Functions
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1016
  \label{sec:defining-recursive-functions} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1017
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1018
text {*
54183
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1019
Recursive functions over datatypes can be specified using the @{command
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1020
primrec_new} command, which supports primitive recursion, or using the more
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1021
general \keyw{fun} and \keyw{function} commands. Here, the focus is on @{command
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1022
primrec_new}; the other two commands are described in a separate tutorial
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1023
\cite{isabelle-function}.
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1024
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1025
%%% TODO: partial_function
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1026
*}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1027
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1028
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1029
subsection {* Introductory Examples
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1030
  \label{ssec:primrec-introductory-examples} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1031
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1032
text {*
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1033
Primitive recursion is illustrated through concrete examples based on the
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1034
datatypes defined in Section~\ref{ssec:datatype-introductory-examples}. More
55075
b3d0a02a756d dissolved BNF session
blanchet
parents: 55073
diff changeset
  1035
examples can be found in the directory \verb|~~/src/HOL/BNF_Examples|.
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1036
*}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1037
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1038
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1039
subsubsection {* Nonrecursive Types
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1040
  \label{sssec:primrec-nonrecursive-types} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1041
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1042
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1043
Primitive recursion removes one layer of constructors on the left-hand side in
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1044
each equation. For example:
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1045
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1046
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1047
    primrec_new bool_of_trool :: "trool \<Rightarrow> bool" where
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1048
      "bool_of_trool Faalse \<longleftrightarrow> False" |
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1049
      "bool_of_trool Truue \<longleftrightarrow> True"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1050
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1051
text {* \blankline *}
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1052
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1053
    primrec_new the_list :: "'a option \<Rightarrow> 'a list" where
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1054
      "the_list None = []" |
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1055
      "the_list (Some a) = [a]"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1056
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1057
text {* \blankline *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1058
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1059
    primrec_new the_default :: "'a \<Rightarrow> 'a option \<Rightarrow> 'a" where
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1060
      "the_default d None = d" |
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1061
      "the_default _ (Some a) = a"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1062
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1063
text {* \blankline *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1064
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1065
    primrec_new mirrror :: "('a, 'b, 'c) triple \<Rightarrow> ('c, 'b, 'a) triple" where
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1066
      "mirrror (Triple a b c) = Triple c b a"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1067
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1068
text {*
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1069
\noindent
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1070
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
  1071
some cases, which are then unspecified. Pattern matching on the left-hand side
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1072
is restricted to a single datatype, which must correspond to the same argument
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1073
in all equations.
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1074
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1075
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1076
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1077
subsubsection {* Simple Recursion
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1078
  \label{sssec:primrec-simple-recursion} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1079
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1080
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1081
For simple recursive types, recursive calls on a constructor argument are
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1082
allowed on the right-hand side:
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1083
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1084
53330
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
  1085
    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
  1086
      "replicate Zero _ = []" |
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1087
      "replicate (Suc n) x = x # replicate n x"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1088
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1089
text {* \blankline *}
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1090
53332
c97a05a26dd6 Doc improvements
traytel
parents: 53331
diff changeset
  1091
    primrec_new at :: "'a list \<Rightarrow> nat \<Rightarrow> 'a" where
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1092
      "at (x # xs) j =
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1093
         (case j of
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1094
            Zero \<Rightarrow> x
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1095
          | Suc j' \<Rightarrow> at xs j')"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1096
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1097
text {* \blankline *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1098
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1099
    primrec_new (*<*)(in early) (*>*)tfold :: "('a \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> ('a, 'b) tlist \<Rightarrow> 'b" where
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1100
      "tfold _ (TNil y) = y" |
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1101
      "tfold f (TCons x xs) = f x (tfold f xs)"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1102
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1103
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1104
\noindent
54402
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1105
Pattern matching is only available for the argument on which the recursion takes
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1106
place. Fortunately, it is easy to generate pattern-maching equations using the
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1107
\keyw{simps\_of\_case} command provided by the theory
55290
3951ced4156c searchable underscores
blanchet
parents: 55254
diff changeset
  1108
\verb|~~/src/HOL/|\allowbreak\verb|Library/|\allowbreak\verb|Simps_Case_Conv|.
54402
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1109
*}
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1110
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1111
    simps_of_case at_simps: at.simps
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1112
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1113
text {*
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1114
This generates the lemma collection @{thm [source] at_simps}:
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1115
%
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1116
\[@{thm at_simps(1)[no_vars]}
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1117
  \qquad @{thm at_simps(2)[no_vars]}\]
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1118
%
54184
3fe73f3c84a2 more docs
blanchet
parents: 54183
diff changeset
  1119
The next example is defined using \keyw{fun} to escape the syntactic
55254
2bc951e6761a 'primitive' is not an adverb
blanchet
parents: 55129
diff changeset
  1120
restrictions imposed on primitively recursive functions. The
54184
3fe73f3c84a2 more docs
blanchet
parents: 54183
diff changeset
  1121
@{command datatype_new_compat} command is needed to register new-style datatypes
3fe73f3c84a2 more docs
blanchet
parents: 54183
diff changeset
  1122
for use with \keyw{fun} and \keyw{function}
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1123
(Section~\ref{sssec:datatype-new-compat}):
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1124
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1125
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1126
    datatype_new_compat nat
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1127
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1128
text {* \blankline *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1129
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1130
    fun at_least_two :: "nat \<Rightarrow> bool" where
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1131
      "at_least_two (Suc (Suc _)) \<longleftrightarrow> True" |
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1132
      "at_least_two _ \<longleftrightarrow> False"
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1133
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1134
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1135
subsubsection {* Mutual Recursion
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1136
  \label{sssec:primrec-mutual-recursion} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1137
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1138
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1139
The syntax for mutually recursive functions over mutually recursive datatypes
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1140
is straightforward:
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1141
*}
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1142
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1143
    primrec_new
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1144
      nat_of_even_nat :: "even_nat \<Rightarrow> nat" and
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1145
      nat_of_odd_nat :: "odd_nat \<Rightarrow> nat"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1146
    where
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1147
      "nat_of_even_nat Even_Zero = Zero" |
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1148
      "nat_of_even_nat (Even_Suc n) = Suc (nat_of_odd_nat n)" |
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1149
      "nat_of_odd_nat (Odd_Suc n) = Suc (nat_of_even_nat n)"
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1150
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1151
text {* \blankline *}
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1152
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1153
    primrec_new
53330
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
  1154
      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
  1155
      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
  1156
      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
  1157
    where
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1158
      "eval\<^sub>e \<gamma> \<xi> (Term t) = eval\<^sub>t \<gamma> \<xi> t" |
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1159
      "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
  1160
      "eval\<^sub>t \<gamma> \<xi> (Factor f) = eval\<^sub>f \<gamma> \<xi> f" |
52841
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1161
      "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
  1162
      "eval\<^sub>f \<gamma> _ (Const a) = \<gamma> a" |
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1163
      "eval\<^sub>f _ \<xi> (Var b) = \<xi> b" |
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1164
      "eval\<^sub>f \<gamma> \<xi> (Expr e) = eval\<^sub>e \<gamma> \<xi> e"
87a66bad0796 more (co)datatype documentation
blanchet
parents: 52840
diff changeset
  1165
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1166
text {*
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1167
\noindent
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1168
Mutual recursion is possible within a single type, using \keyw{fun}:
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1169
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1170
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1171
    fun
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1172
      even :: "nat \<Rightarrow> bool" and
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1173
      odd :: "nat \<Rightarrow> bool"
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1174
    where
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1175
      "even Zero = True" |
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1176
      "even (Suc n) = odd n" |
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1177
      "odd Zero = False" |
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1178
      "odd (Suc n) = even n"
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1179
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1180
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1181
subsubsection {* Nested Recursion
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1182
  \label{sssec:primrec-nested-recursion} *}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1183
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1184
text {*
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1185
In a departure from the old datatype package, nested recursion is normally
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1186
handled via the map functions of the nesting type constructors. For example,
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1187
recursive calls are lifted to lists using @{const map}:
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1188
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1189
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1190
(*<*)
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1191
    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")
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1192
(*>*)
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1193
    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
  1194
      "at\<^sub>f\<^sub>f (Node\<^sub>f\<^sub>f a ts) js =
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1195
         (case js of
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1196
            [] \<Rightarrow> a
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  1197
          | j # js' \<Rightarrow> at (map (\<lambda>t. at\<^sub>f\<^sub>f t js') ts) j)"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1198
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1199
text {*
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1200
\noindent
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1201
The next example features recursion through the @{text option} type. Although
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1202
@{text option} is not a new-style datatype, it is registered as a BNF with the
54491
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54422
diff changeset
  1203
map function @{const map_option}:
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1204
*}
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1205
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1206
    primrec_new (*<*)(in early) (*>*)sum_btree :: "('a\<Colon>{zero,plus}) btree \<Rightarrow> 'a" where
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1207
      "sum_btree (BNode a lt rt) =
54491
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54422
diff changeset
  1208
         a + the_default 0 (map_option sum_btree lt) +
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54422
diff changeset
  1209
           the_default 0 (map_option sum_btree rt)"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1210
53136
98a2c33d5d1b ideas for (co)datatype docs
blanchet
parents: 53028
diff changeset
  1211
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1212
\noindent
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1213
The same principle applies for arbitrary type constructors through which
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1214
recursion is possible. Notably, the map function for the function type
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1215
(@{text \<Rightarrow>}) is simply composition (@{text "op \<circ>"}):
53136
98a2c33d5d1b ideas for (co)datatype docs
blanchet
parents: 53028
diff changeset
  1216
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1217
54182
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1218
    primrec_new (*<*)(in early) (*>*)relabel_ft :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a ftree \<Rightarrow> 'a ftree" where
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1219
      "relabel_ft f (FTLeaf x) = FTLeaf (f x)" |
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1220
      "relabel_ft f (FTNode g) = FTNode (relabel_ft f \<circ> g)"
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1221
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1222
text {*
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1223
\noindent
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1224
For convenience, recursion through functions can also be expressed using
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1225
$\lambda$-abstractions and function application rather than through composition.
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1226
For example:
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1227
*}
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1228
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1229
    primrec_new relabel_ft :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a ftree \<Rightarrow> 'a ftree" where
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1230
      "relabel_ft f (FTLeaf x) = FTLeaf (f x)" |
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1231
      "relabel_ft f (FTNode g) = FTNode (\<lambda>x. relabel_ft f (g x))"
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1232
54183
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1233
text {* \blankline *}
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1234
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1235
    primrec_new subtree_ft :: "'a \<Rightarrow> 'a ftree \<Rightarrow> 'a ftree" where
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1236
      "subtree_ft x (FTNode g) = g x"
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1237
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1238
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1239
\noindent
54182
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1240
For recursion through curried $n$-ary functions, $n$ applications of
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1241
@{term "op \<circ>"} are necessary. The examples below illustrate the case where
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1242
$n = 2$:
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1243
*}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1244
54182
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1245
    datatype_new 'a ftree2 = FTLeaf2 'a | FTNode2 "'a \<Rightarrow> 'a \<Rightarrow> 'a ftree2"
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1246
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1247
text {* \blankline *}
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1248
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1249
    primrec_new (*<*)(in early) (*>*)relabel_ft2 :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a ftree2 \<Rightarrow> 'a ftree2" where
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1250
      "relabel_ft2 f (FTLeaf2 x) = FTLeaf2 (f x)" |
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1251
      "relabel_ft2 f (FTNode2 g) = FTNode2 (op \<circ> (op \<circ> (relabel_ft2 f)) g)"
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1252
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1253
text {* \blankline *}
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1254
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1255
    primrec_new relabel_ft2 :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a ftree2 \<Rightarrow> 'a ftree2" where
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1256
      "relabel_ft2 f (FTLeaf2 x) = FTLeaf2 (f x)" |
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1257
      "relabel_ft2 f (FTNode2 g) = FTNode2 (\<lambda>x y. relabel_ft2 f (g x y))"
54031
a3281fbe6856 more (co)data docs
blanchet
parents: 54023
diff changeset
  1258
54183
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1259
text {* \blankline *}
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1260
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1261
    primrec_new subtree_ft2 :: "'a \<Rightarrow> 'a \<Rightarrow> 'a ftree2 \<Rightarrow> 'a ftree2" where
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1262
      "subtree_ft2 x y (FTNode2 g) = g x y"
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1263
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1264
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1265
subsubsection {* Nested-as-Mutual Recursion
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1266
  \label{sssec:primrec-nested-as-mutual-recursion} *}
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1267
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1268
(*<*)
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1269
    locale n2m begin
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1270
(*>*)
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1271
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1272
text {*
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1273
For compatibility with the old package, but also because it is sometimes
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1274
convenient in its own right, it is possible to treat nested recursive datatypes
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1275
as mutually recursive ones if the recursion takes place though new-style
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1276
datatypes. For example:
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1277
*}
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1278
53331
20440c789759 prove theorem in the right context (that knows about local variables)
traytel
parents: 53330
diff changeset
  1279
    primrec_new
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1280
      at\<^sub>f\<^sub>f :: "'a tree\<^sub>f\<^sub>f \<Rightarrow> nat list \<Rightarrow> 'a" and
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1281
      ats\<^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
  1282
    where
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1283
      "at\<^sub>f\<^sub>f (Node\<^sub>f\<^sub>f a ts) js =
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1284
         (case js of
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1285
            [] \<Rightarrow> a
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1286
          | j # js' \<Rightarrow> ats\<^sub>f\<^sub>f ts j js')" |
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1287
      "ats\<^sub>f\<^sub>f (t # ts) j =
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1288
         (case j of
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1289
            Zero \<Rightarrow> at\<^sub>f\<^sub>f t
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1290
          | Suc j' \<Rightarrow> ats\<^sub>f\<^sub>f ts j')"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1291
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1292
text {*
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1293
\noindent
54287
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  1294
Appropriate induction rules are generated as
54031
a3281fbe6856 more (co)data docs
blanchet
parents: 54023
diff changeset
  1295
@{thm [source] at\<^sub>f\<^sub>f.induct},
a3281fbe6856 more (co)data docs
blanchet
parents: 54023
diff changeset
  1296
@{thm [source] ats\<^sub>f\<^sub>f.induct}, and
54287
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  1297
@{thm [source] at\<^sub>f\<^sub>f_ats\<^sub>f\<^sub>f.induct}. The
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  1298
induction rules and the underlying recursors are generated on a per-need basis
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  1299
and are kept in a cache to speed up subsequent definitions.
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1300
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1301
Here is a second example:
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1302
*}
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1303
53331
20440c789759 prove theorem in the right context (that knows about local variables)
traytel
parents: 53330
diff changeset
  1304
    primrec_new
53330
77da8d3c46e0 fixed docs w.r.t. availability of "primrec_new" and friends
blanchet
parents: 53262
diff changeset
  1305
      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
  1306
      sum_btree_option :: "'a btree option \<Rightarrow> 'a"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1307
    where
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1308
      "sum_btree (BNode a lt rt) =
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1309
         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
  1310
      "sum_btree_option None = 0" |
53025
c820c9e9e8f4 more work on (co)datatype docs
blanchet
parents: 53018
diff changeset
  1311
      "sum_btree_option (Some t) = sum_btree t"
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1312
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1313
text {*
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1314
%  * can pretend a nested type is mutually recursive (if purely inductive)
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1315
%  * avoids the higher-order map
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1316
%  * e.g.
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1317
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1318
%  * this can always be avoided;
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1319
%     * e.g. in our previous example, we first mapped the recursive
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1320
%       calls, then we used a generic at function to retrieve the result
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1321
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1322
%  * 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
  1323
%    just like there's no rule when to use fold and when to use
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1324
%    primrec_new
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1325
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1326
%  * higher-order approach, considering nesting as nesting, is more
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1327
%    compositional -- e.g. we saw how we could reuse an existing polymorphic
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1328
%    at or the_default, whereas @{const ats\<^sub>f\<^sub>f} is much more specific
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1329
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1330
%  * but:
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1331
%     * is perhaps less intuitive, because it requires higher-order thinking
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1332
%     * may seem inefficient, and indeed with the code generator the
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1333
%       mutually recursive version might be nicer
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1334
%     * is somewhat indirect -- must apply a map first, then compute a result
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1335
%       (cannot mix)
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1336
%     * the auxiliary functions like @{const ats\<^sub>f\<^sub>f} are sometimes useful in own right
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1337
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1338
%  * impact on automation unclear
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1339
%
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1340
*}
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1341
(*<*)
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1342
    end
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1343
(*>*)
52843
ea95702328cf more (co)datatype docs
blanchet
parents: 52841
diff changeset
  1344
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1345
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1346
subsection {* Command Syntax
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1347
  \label{ssec:primrec-command-syntax} *}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1348
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1349
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1350
subsubsection {* \keyw{primrec\_new}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1351
  \label{sssec:primrec-new} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1352
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1353
text {*
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1354
\begin{matharray}{rcl}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1355
  @{command_def "primrec_new"} & : & @{text "local_theory \<rightarrow> local_theory"}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1356
\end{matharray}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1357
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
  1358
@{rail \<open>
55029
61a6bf7d4b02 clarified @{rail} syntax: prefer explicit \<newline> symbol;
wenzelm
parents: 54958
diff changeset
  1359
  @@{command primrec_new} target? fixes \<newline> @'where' (@{syntax pr_equation} + '|')
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1360
  ;
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1361
  @{syntax_def pr_equation}: thmdecl? prop
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
  1362
\<close>}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1363
*}
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1364
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1365
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1366
(*
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1367
subsection {* Generated Theorems
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1368
  \label{ssec:primrec-generated-theorems} *}
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1369
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1370
text {*
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1371
%  * synthesized nonrecursive definition
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1372
%  * user specification is rederived from it, exactly as entered
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1373
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1374
%  * induct
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1375
%    * mutualized
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1376
%    * without some needless induction hypotheses if not used
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1377
%  * fold, rec
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1378
%    * mutualized
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1379
*}
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1380
*)
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1381
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1382
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  1383
subsection {* Recursive Default Values for Selectors
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1384
  \label{ssec:primrec-recursive-default-values-for-selectors} *}
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1385
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1386
text {*
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1387
A datatype selector @{text un_D} can have a default value for each constructor
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1388
on which it is not otherwise specified. Occasionally, it is useful to have the
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1389
default value be defined recursively. This produces a chicken-and-egg situation
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1390
that may seem unsolvable, because the datatype is not introduced yet at the
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1391
moment when the selectors are introduced. Of course, we can always define the
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1392
selectors manually afterward, but we then have to state and prove all the
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1393
characteristic theorems ourselves instead of letting the package do it.
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1394
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1395
Fortunately, there is a fairly elegant workaround that relies on overloading and
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1396
that avoids the tedium of manual derivations:
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1397
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1398
\begin{enumerate}
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1399
\setlength{\itemsep}{0pt}
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1400
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1401
\item
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1402
Introduce a fully unspecified constant @{text "un_D\<^sub>0 \<Colon> 'a"} using
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1403
@{keyword consts}.
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1404
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1405
\item
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1406
Define the datatype, specifying @{text "un_D\<^sub>0"} as the selector's default
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1407
value.
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1408
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1409
\item
53535
d0c163c6c725 more (co)data docs
blanchet
parents: 53534
diff changeset
  1410
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
  1411
datatype using the \keyw{overloading} command.
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1412
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1413
\item
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1414
Derive the desired equation on @{text un_D} from the characteristic equations
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1415
for @{text "un_D\<^sub>0"}.
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1416
\end{enumerate}
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1417
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1418
\noindent
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1419
The following example illustrates this procedure:
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1420
*}
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1421
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1422
    consts termi\<^sub>0 :: 'a
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1423
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1424
text {* \blankline *}
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1425
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
  1426
    datatype_new ('a, 'b) tlist =
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1427
      TNil (termi: 'b) (defaults ttl: TNil)
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
  1428
    | 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
  1429
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1430
text {* \blankline *}
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1431
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1432
    overloading
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
  1433
      termi\<^sub>0 \<equiv> "termi\<^sub>0 \<Colon> ('a, 'b) tlist \<Rightarrow> 'b"
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1434
    begin
53491
2479b39d9d09 more docs
blanchet
parents: 53335
diff changeset
  1435
    primrec_new termi\<^sub>0 :: "('a, 'b) tlist \<Rightarrow> 'b" where
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1436
      "termi\<^sub>0 (TNil y) = y" |
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1437
      "termi\<^sub>0 (TCons x xs) = termi\<^sub>0 xs"
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1438
    end
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1439
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1440
text {* \blankline *}
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1441
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1442
    lemma terminal_TCons[simp]: "termi (TCons x xs) = termi xs"
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1443
    by (cases xs) auto
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1444
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1445
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1446
subsection {* Compatibility Issues
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1447
  \label{ssec:primrec-compatibility-issues} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1448
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1449
text {*
53997
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
  1450
The command @{command primrec_new} has been designed to be highly compatible
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
  1451
with the old \keyw{primrec}, to ease migration. There is nonetheless at least
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
  1452
one incompatibility that may arise when porting to the new package:
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
  1453
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
  1454
\begin{itemize}
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
  1455
\setlength{\itemsep}{0pt}
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
  1456
54185
3fe3b5d33e41 more docs
blanchet
parents: 54184
diff changeset
  1457
\item \emph{Some theorems have different names.}
53997
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
  1458
For $m > 1$ mutually recursive functions,
54023
cede3c1d2417 minor doc fix (there is no guarantee that the equations for a given f_i are contiguous in the collection)
blanchet
parents: 54014
diff changeset
  1459
@{text "f\<^sub>1_\<dots>_f\<^sub>m.simps"} has been broken down into separate
cede3c1d2417 minor doc fix (there is no guarantee that the equations for a given f_i are contiguous in the collection)
blanchet
parents: 54014
diff changeset
  1460
subcollections @{text "f\<^sub>i.simps"}.
53997
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
  1461
\end{itemize}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1462
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1463
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1464
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1465
section {* Defining Codatatypes
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1466
  \label{sec:defining-codatatypes} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1467
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1468
text {*
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1469
Codatatypes can be specified using the @{command codatatype} command. The
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1470
command is first illustrated through concrete examples featuring different
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1471
flavors of corecursion. More examples can be found in the directory
53997
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
  1472
\verb|~~/src/HOL/|\allowbreak\verb|BNF/Examples|. The
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
  1473
\emph{Archive of Formal Proofs} also includes some useful codatatypes, notably
8ff43f638da2 more "primrec_new" documentation
blanchet
parents: 53917
diff changeset
  1474
for lazy lists \cite{lochbihler-2010}.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1475
*}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  1476
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1477
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1478
subsection {* Introductory Examples
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1479
  \label{ssec:codatatype-introductory-examples} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  1480
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1481
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1482
subsubsection {* Simple Corecursion
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1483
  \label{sssec:codatatype-simple-corecursion} *}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1484
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1485
text {*
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
  1486
Noncorecursive codatatypes coincide with the corresponding datatypes, so they
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
  1487
are useless in practice. \emph{Corecursive codatatypes} have the same syntax
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1488
as recursive datatypes, except for the command name. For example, here is the
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1489
definition of lazy lists:
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1490
*}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1491
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1492
    codatatype (lset: 'a) llist (map: lmap rel: llist_all2) =
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1493
      lnull: LNil (defaults ltl: LNil)
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1494
    | LCons (lhd: 'a) (ltl: "'a llist")
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1495
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1496
text {*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1497
\noindent
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1498
Lazy lists can be infinite, such as @{text "LCons 0 (LCons 0 (\<dots>))"} and
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1499
@{text "LCons 0 (LCons 1 (LCons 2 (\<dots>)))"}. Here is a related type, that of
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1500
infinite streams:
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1501
*}
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1502
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1503
    codatatype (sset: 'a) stream (map: smap rel: stream_all2) =
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1504
      SCons (shd: 'a) (stl: "'a stream")
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1505
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1506
text {*
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1507
\noindent
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1508
Another interesting type that can
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1509
be defined as a codatatype is that of the extended natural numbers:
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1510
*}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1511
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1512
    codatatype enat = EZero | ESuc enat
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1513
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1514
text {*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1515
\noindent
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1516
This type has exactly one infinite element, @{text "ESuc (ESuc (ESuc (\<dots>)))"},
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1517
that represents $\infty$. In addition, it has finite values of the form
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1518
@{text "ESuc (\<dots> (ESuc EZero)\<dots>)"}.
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1519
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1520
Here is an example with many constructors:
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1521
*}
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1522
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1523
    codatatype 'a process =
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1524
      Fail
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1525
    | Skip (cont: "'a process")
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1526
    | Action (prefix: 'a) (cont: "'a process")
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1527
    | Choice (left: "'a process") (right: "'a process")
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1528
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  1529
text {*
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1530
\noindent
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  1531
Notice that the @{const cont} selector is associated with both @{const Skip}
54146
97f69d44f732 doc fixes suggested by Andreas L.
blanchet
parents: 54072
diff changeset
  1532
and @{const Action}.
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  1533
*}
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  1534
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1535
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1536
subsubsection {* Mutual Corecursion
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1537
  \label{sssec:codatatype-mutual-corecursion} *}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1538
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1539
text {*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1540
\noindent
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1541
The example below introduces a pair of \emph{mutually corecursive} types:
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1542
*}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1543
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1544
    codatatype even_enat = Even_EZero | Even_ESuc odd_enat
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1545
    and odd_enat = Odd_ESuc even_enat
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1546
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1547
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1548
subsubsection {* Nested Corecursion
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1549
  \label{sssec:codatatype-nested-corecursion} *}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1550
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1551
text {*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1552
\noindent
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1553
The next examples feature \emph{nested corecursion}:
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1554
*}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1555
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1556
    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")
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1557
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1558
text {* \blankline *}
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1559
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1560
    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
  1561
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1562
text {* \blankline *}
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1563
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1564
    codatatype 'a sm = SM (accept: bool) (trans: "'a \<Rightarrow> 'a sm")
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1565
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1566
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1567
subsection {* Command Syntax
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1568
  \label{ssec:codatatype-command-syntax} *}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1569
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1570
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1571
subsubsection {* \keyw{codatatype}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  1572
  \label{sssec:codatatype} *}
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  1573
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1574
text {*
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1575
\begin{matharray}{rcl}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1576
  @{command_def "codatatype"} & : & @{text "local_theory \<rightarrow> local_theory"}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1577
\end{matharray}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1578
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
  1579
@{rail \<open>
55029
61a6bf7d4b02 clarified @{rail} syntax: prefer explicit \<newline> symbol;
wenzelm
parents: 54958
diff changeset
  1580
  @@{command codatatype} target? \<newline>
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1581
    (@{syntax dt_name} '=' (@{syntax ctor} + '|') + @'and')
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
  1582
\<close>}
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1583
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1584
\noindent
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1585
Definitions of codatatypes have almost exactly the same syntax as for datatypes
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1586
(Section~\ref{ssec:datatype-command-syntax}). The @{text "no_discs_sels"} option
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1587
is not available, because destructors are a crucial notion for codatatypes.
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1588
*}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1589
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1590
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1591
subsection {* Generated Constants
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1592
  \label{ssec:codatatype-generated-constants} *}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1593
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1594
text {*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1595
Given a codatatype @{text "('a\<^sub>1, \<dots>, 'a\<^sub>m) t"}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1596
with $m > 0$ live type variables and $n$ constructors @{text "t.C\<^sub>1"},
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1597
\ldots, @{text "t.C\<^sub>n"}, the same auxiliary constants are generated as for
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1598
datatypes (Section~\ref{ssec:datatype-generated-constants}), except that the
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1599
iterator and the recursor are replaced by dual concepts:
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1600
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1601
\begin{itemize}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1602
\setlength{\itemsep}{0pt}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1603
54494
a220071f6708 updated docs
blanchet
parents: 54491
diff changeset
  1604
\item \relax{Coiterator}: @{text unfold_t}
a220071f6708 updated docs
blanchet
parents: 54491
diff changeset
  1605
a220071f6708 updated docs
blanchet
parents: 54491
diff changeset
  1606
\item \relax{Corecursor}: @{text corec_t}
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1607
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1608
\end{itemize}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1609
*}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1610
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1611
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1612
subsection {* Generated Theorems
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1613
  \label{ssec:codatatype-generated-theorems} *}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1614
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1615
text {*
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1616
The characteristic theorems generated by @{command codatatype} are grouped in
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1617
three broad categories:
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1618
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1619
\begin{itemize}
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1620
\setlength{\itemsep}{0pt}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1621
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1622
\item The \emph{free constructor theorems} are properties about the constructors
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1623
and destructors that can be derived for any freely generated type.
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1624
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1625
\item The \emph{functorial theorems} are properties of datatypes related to
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1626
their BNF nature.
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1627
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1628
\item The \emph{coinductive theorems} are properties of datatypes related to
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1629
their coinductive nature.
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1630
\end{itemize}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1631
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1632
\noindent
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1633
The first two categories are exactly as for datatypes and are described in
53642
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
  1634
Sections
05ca82603671 more (co)data docs
blanchet
parents: 53623
diff changeset
  1635
\ref{sssec:free-constructor-theorems}~and~\ref{sssec:functorial-theorems}.
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1636
*}
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1637
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1638
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1639
subsubsection {* Coinductive Theorems
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1640
  \label{sssec:coinductive-theorems} *}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1641
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1642
text {*
54031
a3281fbe6856 more (co)data docs
blanchet
parents: 54023
diff changeset
  1643
The coinductive theorems are listed below for @{typ "'a llist"}:
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1644
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1645
\begin{indentblock}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1646
\begin{description}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1647
53643
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1648
\item[\begin{tabular}{@ {}l@ {}}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1649
  @{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
  1650
  \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
  1651
\end{tabular}] ~ \\
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1652
@{thm llist.coinduct[no_vars]}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1653
53643
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1654
\item[\begin{tabular}{@ {}l@ {}}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1655
  @{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
  1656
  \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
  1657
\end{tabular}] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1658
@{thm llist.strong_coinduct[no_vars]}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1659
53643
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1660
\item[\begin{tabular}{@ {}l@ {}}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1661
  @{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
  1662
  @{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
  1663
  \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
  1664
\end{tabular}] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1665
Given $m > 1$ mutually corecursive codatatypes, these coinduction rules can be
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1666
used to prove $m$ properties simultaneously.
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1667
54031
a3281fbe6856 more (co)data docs
blanchet
parents: 54023
diff changeset
  1668
\item[@{text "t."}\hthm{unfold}\rm:] ~ \\
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1669
@{thm llist.unfold(1)[no_vars]} \\
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1670
@{thm llist.unfold(2)[no_vars]}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1671
54031
a3281fbe6856 more (co)data docs
blanchet
parents: 54023
diff changeset
  1672
\item[@{text "t."}\hthm{corec}\rm:] ~ \\
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1673
@{thm llist.corec(1)[no_vars]} \\
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1674
@{thm llist.corec(2)[no_vars]}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1675
53703
0c565fec9c78 updated docs
blanchet
parents: 53694
diff changeset
  1676
\item[@{text "t."}\hthm{disc\_unfold}\rm:] ~ \\
53643
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1677
@{thm llist.disc_unfold(1)[no_vars]} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1678
@{thm llist.disc_unfold(2)[no_vars]}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1679
53703
0c565fec9c78 updated docs
blanchet
parents: 53694
diff changeset
  1680
\item[@{text "t."}\hthm{disc\_corec}\rm:] ~ \\
53643
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1681
@{thm llist.disc_corec(1)[no_vars]} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1682
@{thm llist.disc_corec(2)[no_vars]}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1683
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1684
\item[@{text "t."}\hthm{disc\_unfold\_iff} @{text "[simp]"}\rm:] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1685
@{thm llist.disc_unfold_iff(1)[no_vars]} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1686
@{thm llist.disc_unfold_iff(2)[no_vars]}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1687
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1688
\item[@{text "t."}\hthm{disc\_corec\_iff} @{text "[simp]"}\rm:] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1689
@{thm llist.disc_corec_iff(1)[no_vars]} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1690
@{thm llist.disc_corec_iff(2)[no_vars]}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1691
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1692
\item[@{text "t."}\hthm{sel\_unfold} @{text "[simp]"}\rm:] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1693
@{thm llist.sel_unfold(1)[no_vars]} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1694
@{thm llist.sel_unfold(2)[no_vars]}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1695
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1696
\item[@{text "t."}\hthm{sel\_corec} @{text "[simp]"}\rm:] ~ \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1697
@{thm llist.sel_corec(1)[no_vars]} \\
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1698
@{thm llist.sel_corec(2)[no_vars]}
673cb2c9d695 more (co)data docs
blanchet
parents: 53642
diff changeset
  1699
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1700
\end{description}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1701
\end{indentblock}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1702
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1703
\noindent
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  1704
For convenience, @{command codatatype} also provides the following collection:
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1705
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1706
\begin{indentblock}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1707
\begin{description}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1708
54031
a3281fbe6856 more (co)data docs
blanchet
parents: 54023
diff changeset
  1709
\item[@{text "t."}\hthm{simps} = @{text t.inject} @{text t.distinct} @{text t.case} @{text t.disc_corec} @{text t.disc_corec_iff}] ~ \\
a3281fbe6856 more (co)data docs
blanchet
parents: 54023
diff changeset
  1710
@{text t.sel_corec} @{text t.disc_unfold} @{text t.disc_unfold_iff} @{text t.sel_unfold} @{text t.map} \\
a3281fbe6856 more (co)data docs
blanchet
parents: 54023
diff changeset
  1711
@{text t.rel_inject} @{text t.rel_distinct} @{text t.set}
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1712
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1713
\end{description}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1714
\end{indentblock}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  1715
*}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1716
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1717
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  1718
section {* Defining Corecursive Functions
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1719
  \label{sec:defining-corecursive-functions} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1720
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1721
text {*
54183
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1722
Corecursive functions can be specified using the @{command primcorec} and
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1723
\keyw{prim\-corec\-ursive} commands, which support primitive corecursion, or
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1724
using the more general \keyw{partial\_function} command. Here, the focus is on
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1725
the first two. More examples can be found in the directory
55075
b3d0a02a756d dissolved BNF session
blanchet
parents: 55073
diff changeset
  1726
\verb|~~/src/HOL/BNF_Examples|.
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1727
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1728
Whereas recursive functions consume datatypes one constructor at a time,
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1729
corecursive functions construct codatatypes one constructor at a time.
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1730
Partly reflecting a lack of agreement among proponents of coalgebraic methods,
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1731
Isabelle supports three competing syntaxes for specifying a function $f$:
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1732
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1733
\begin{itemize}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1734
\setlength{\itemsep}{0pt}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1735
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1736
\abovedisplayskip=.5\abovedisplayskip
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1737
\belowdisplayskip=.5\belowdisplayskip
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1738
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1739
\item The \emph{destructor view} specifies $f$ by implications of the form
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1740
\[@{text "\<dots> \<Longrightarrow> is_C\<^sub>j (f x\<^sub>1 \<dots> x\<^sub>n)"}\] and
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1741
equations of the form
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1742
\[@{text "un_C\<^sub>ji (f x\<^sub>1 \<dots> x\<^sub>n) = \<dots>"}\]
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1743
This style is popular in the coalgebraic literature.
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1744
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1745
\item The \emph{constructor view} specifies $f$ by equations of the form
54183
8a6a49385122 more docs
blanchet
parents: 54182
diff changeset
  1746
\[@{text "\<dots> \<Longrightarrow> f x\<^sub>1 \<dots> x\<^sub>n = C\<^sub>j \<dots>"}\]
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1747
This style is often more concise than the previous one.
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1748
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1749
\item The \emph{code view} specifies $f$ by a single equation of the form
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1750
\[@{text "f x\<^sub>1 \<dots> x\<^sub>n = \<dots>"}\]
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1751
with restrictions on the format of the right-hand side. Lazy functional
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1752
programming languages such as Haskell support a generalized version of this
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1753
style.
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1754
\end{itemize}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1755
53753
ae7f50e70c09 renamed "primcorec" to "primcorecursive", to open the door to a 'theory -> theory' command called "primcorec" (cf. "fun" vs. "function")
blanchet
parents: 53752
diff changeset
  1756
All three styles are available as input syntax. Whichever syntax is chosen,
ae7f50e70c09 renamed "primcorec" to "primcorecursive", to open the door to a 'theory -> theory' command called "primcorec" (cf. "fun" vs. "function")
blanchet
parents: 53752
diff changeset
  1757
characteristic theorems for all three styles are generated.
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1758
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1759
%%% TODO: partial_function? E.g. for defining tail recursive function on lazy
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  1760
%%% lists (cf. terminal0 in TLList.thy)
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1761
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1762
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  1763
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1764
subsection {* Introductory Examples
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  1765
  \label{ssec:primcorec-introductory-examples} *}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1766
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1767
text {*
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1768
Primitive corecursion is illustrated through concrete examples based on the
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1769
codatatypes defined in Section~\ref{ssec:codatatype-introductory-examples}. More
55075
b3d0a02a756d dissolved BNF session
blanchet
parents: 55073
diff changeset
  1770
examples can be found in the directory \verb|~~/src/HOL/BNF_Examples|. The code
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1771
view is favored in the examples below. Sections
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1772
\ref{ssec:primrec-constructor-view} and \ref{ssec:primrec-destructor-view}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1773
present the same examples expressed using the constructor and destructor views.
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1774
*}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1775
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1776
subsubsection {* Simple Corecursion
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1777
  \label{sssec:primcorec-simple-corecursion} *}
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1778
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1779
text {*
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1780
Following the code view, corecursive calls are allowed on the right-hand side as
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1781
long as they occur under a constructor, which itself appears either directly to
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1782
the right of the equal sign or in a conditional expression:
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1783
*}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1784
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  1785
    primcorec literate :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a llist" where
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1786
      "literate g x = LCons x (literate g (g x))"
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1787
53677
b51ebeda414d more (co)data docs
blanchet
parents: 53675
diff changeset
  1788
text {* \blankline *}
b51ebeda414d more (co)data docs
blanchet
parents: 53675
diff changeset
  1789
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  1790
    primcorec siterate :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a stream" where
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1791
      "siterate g x = SCons x (siterate g (g x))"
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1792
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1793
text {*
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1794
\noindent
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1795
The constructor ensures that progress is made---i.e., the function is
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1796
\emph{productive}. The above functions compute the infinite lazy list or stream
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1797
@{text "[x, g x, g (g x), \<dots>]"}. Productivity guarantees that prefixes
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1798
@{text "[x, g x, g (g x), \<dots>, (g ^^ k) x]"} of arbitrary finite length
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1799
@{text k} can be computed by unfolding the code equation a finite number of
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
  1800
times.
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1801
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1802
Corecursive functions construct codatatype values, but nothing prevents them
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
  1803
from also consuming such values. The following function drops every second
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1804
element in a stream:
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1805
*}
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1806
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  1807
    primcorec every_snd :: "'a stream \<Rightarrow> 'a stream" where
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1808
      "every_snd s = SCons (shd s) (stl (stl s))"
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1809
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1810
text {*
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1811
\noindent
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1812
Constructs such as @{text "let"}---@{text "in"}, @{text
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1813
"if"}---@{text "then"}---@{text "else"}, and @{text "case"}---@{text "of"} may
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1814
appear around constructors that guard corecursive calls:
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1815
*}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1816
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1817
    primcorec lappend :: "'a llist \<Rightarrow> 'a llist \<Rightarrow> 'a llist" where
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1818
      "lappend xs ys =
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1819
         (case xs of
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1820
            LNil \<Rightarrow> ys
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1821
          | LCons x xs' \<Rightarrow> LCons x (lappend xs' ys))"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1822
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1823
text {*
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1824
\noindent
54402
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1825
Pattern matching is not supported by @{command primcorec}. Fortunately, it is
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1826
easy to generate pattern-maching equations using the \keyw{simps\_of\_case}
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1827
command provided by the theory \verb|~~/src/HOL/Library/Simps_Case_Conv|.
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1828
*}
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1829
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1830
    simps_of_case lappend_simps: lappend.code
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1831
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1832
text {*
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1833
This generates the lemma collection @{thm [source] lappend_simps}:
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1834
%
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1835
\[@{thm lappend_simps(1)[no_vars]}
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1836
  \qquad @{thm lappend_simps(2)[no_vars]}\]
5d1b7ee6070e document idiomatic use of 'simps_of_case'
blanchet
parents: 54386
diff changeset
  1837
%
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1838
Corecursion is useful to specify not only functions but also infinite objects:
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1839
*}
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1840
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  1841
    primcorec infty :: enat where
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1842
      "infty = ESuc infty"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1843
53646
ac6e0a28489f more (co)data docs
blanchet
parents: 53644
diff changeset
  1844
text {*
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1845
\noindent
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1846
The example below constructs a pseudorandom process value. It takes a stream of
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1847
actions (@{text s}), a pseudorandom function generator (@{text f}), and a
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1848
pseudorandom seed (@{text n}):
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1849
*}
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1850
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1851
    primcorec
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1852
      random_process :: "'a stream \<Rightarrow> (int \<Rightarrow> int) \<Rightarrow> int \<Rightarrow> 'a process"
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1853
    where
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1854
      "random_process s f n =
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1855
         (if n mod 4 = 0 then
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1856
            Fail
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1857
          else if n mod 4 = 1 then
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1858
            Skip (random_process s f (f n))
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1859
          else if n mod 4 = 2 then
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1860
            Action (shd s) (random_process (stl s) f (f n))
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1861
          else
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1862
            Choice (random_process (every_snd s) (f \<circ> f) (f n))
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1863
              (random_process (every_snd (stl s)) (f \<circ> f) (f (f n))))"
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1864
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1865
text {*
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1866
\noindent
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1867
The main disadvantage of the code view is that the conditions are tested
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1868
sequentially. This is visible in the generated theorems. The constructor and
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1869
destructor views offer nonsequential alternatives.
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1870
*}
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1871
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1872
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1873
subsubsection {* Mutual Corecursion
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1874
  \label{sssec:primcorec-mutual-corecursion} *}
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1875
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1876
text {*
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1877
The syntax for mutually corecursive functions over mutually corecursive
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  1878
datatypes is unsurprising:
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1879
*}
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1880
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  1881
    primcorec
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1882
      even_infty :: even_enat and
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1883
      odd_infty :: odd_enat
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1884
    where
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1885
      "even_infty = Even_ESuc odd_infty" |
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1886
      "odd_infty = Odd_ESuc even_infty"
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1887
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1888
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1889
subsubsection {* Nested Corecursion
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1890
  \label{sssec:primcorec-nested-corecursion} *}
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1891
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1892
text {*
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1893
The next pair of examples generalize the @{const literate} and @{const siterate}
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1894
functions (Section~\ref{sssec:primcorec-nested-corecursion}) to possibly
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1895
infinite trees in which subnodes are organized either as a lazy list (@{text
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1896
tree\<^sub>i\<^sub>i}) or as a finite set (@{text tree\<^sub>i\<^sub>s}). They rely on the map functions of
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1897
the nesting type constructors to lift the corecursive calls:
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1898
*}
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  1899
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  1900
    primcorec iterate\<^sub>i\<^sub>i :: "('a \<Rightarrow> 'a llist) \<Rightarrow> 'a \<Rightarrow> 'a tree\<^sub>i\<^sub>i" where
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1901
      "iterate\<^sub>i\<^sub>i g x = Node\<^sub>i\<^sub>i x (lmap (iterate\<^sub>i\<^sub>i g) (g x))"
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1902
53677
b51ebeda414d more (co)data docs
blanchet
parents: 53675
diff changeset
  1903
text {* \blankline *}
b51ebeda414d more (co)data docs
blanchet
parents: 53675
diff changeset
  1904
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  1905
    primcorec iterate\<^sub>i\<^sub>s :: "('a \<Rightarrow> 'a fset) \<Rightarrow> 'a \<Rightarrow> 'a tree\<^sub>i\<^sub>s" where
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1906
      "iterate\<^sub>i\<^sub>s g x = Node\<^sub>i\<^sub>s x (fimage (iterate\<^sub>i\<^sub>s g) (g x))"
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1907
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  1908
text {*
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1909
\noindent
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1910
Both examples follow the usual format for constructor arguments associated
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1911
with nested recursive occurrences of the datatype. Consider
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1912
@{const iterate\<^sub>i\<^sub>i}. The term @{term "g x"} constructs an @{typ "'a llist"}
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1913
value, which is turned into an @{typ "'a tree\<^sub>i\<^sub>i llist"} value using
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1914
@{const lmap}.
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1915
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1916
This format may sometimes feel artificial. The following function constructs
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1917
a tree with a single, infinite branch from a stream:
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1918
*}
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1919
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1920
    primcorec tree\<^sub>i\<^sub>i_of_stream :: "'a stream \<Rightarrow> 'a tree\<^sub>i\<^sub>i" where
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1921
      "tree\<^sub>i\<^sub>i_of_stream s =
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1922
         Node\<^sub>i\<^sub>i (shd s) (lmap tree\<^sub>i\<^sub>i_of_stream (LCons (stl s) LNil))"
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1923
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1924
text {*
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1925
\noindent
54955
cf8d429dc24e reintroduce recursive calls under constructors, taken out in 8dd0e0316881 mainly and in subsequent changes
blanchet
parents: 54832
diff changeset
  1926
A more natural syntax, also supported by Isabelle, is to move corecursive calls
cf8d429dc24e reintroduce recursive calls under constructors, taken out in 8dd0e0316881 mainly and in subsequent changes
blanchet
parents: 54832
diff changeset
  1927
under constructors:
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1928
*}
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1929
54955
cf8d429dc24e reintroduce recursive calls under constructors, taken out in 8dd0e0316881 mainly and in subsequent changes
blanchet
parents: 54832
diff changeset
  1930
    primcorec (*<*)(in late) (*>*)tree\<^sub>i\<^sub>i_of_stream :: "'a stream \<Rightarrow> 'a tree\<^sub>i\<^sub>i" where
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1931
      "tree\<^sub>i\<^sub>i_of_stream s =
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1932
         Node\<^sub>i\<^sub>i (shd s) (LCons (tree\<^sub>i\<^sub>i_of_stream (stl s)) LNil)"
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1933
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1934
text {*
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1935
The next example illustrates corecursion through functions, which is a bit
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1936
special. Deterministic finite automata (DFAs) are traditionally defined as
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  1937
5-tuples @{text "(Q, \<Sigma>, \<delta>, q\<^sub>0, F)"}, where @{text Q} is a finite set of states,
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1938
@{text \<Sigma>} is a finite alphabet, @{text \<delta>} is a transition function, @{text q\<^sub>0}
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1939
is an initial state, and @{text F} is a set of final states. The following
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1940
function translates a DFA into a state machine:
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1941
*}
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1942
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1943
    primcorec (*<*)(in early) (*>*)sm_of_dfa :: "('q \<Rightarrow> 'a \<Rightarrow> 'q) \<Rightarrow> 'q set \<Rightarrow> 'q \<Rightarrow> 'a sm" where
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1944
      "sm_of_dfa \<delta> F q = SM (q \<in> F) (sm_of_dfa \<delta> F \<circ> \<delta> q)"
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  1945
53751
7a994dc08cea added primcorec examples with lambdas
blanchet
parents: 53750
diff changeset
  1946
text {*
7a994dc08cea added primcorec examples with lambdas
blanchet
parents: 53750
diff changeset
  1947
\noindent
7a994dc08cea added primcorec examples with lambdas
blanchet
parents: 53750
diff changeset
  1948
The map function for the function type (@{text \<Rightarrow>}) is composition
54181
66edcd52daeb updated doc
blanchet
parents: 54152
diff changeset
  1949
(@{text "op \<circ>"}). For convenience, corecursion through functions can
54182
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1950
also be expressed using $\lambda$-abstractions and function application rather
54031
a3281fbe6856 more (co)data docs
blanchet
parents: 54023
diff changeset
  1951
than through composition. For example:
53751
7a994dc08cea added primcorec examples with lambdas
blanchet
parents: 53750
diff changeset
  1952
*}
7a994dc08cea added primcorec examples with lambdas
blanchet
parents: 53750
diff changeset
  1953
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1954
    primcorec sm_of_dfa :: "('q \<Rightarrow> 'a \<Rightarrow> 'q) \<Rightarrow> 'q set \<Rightarrow> 'q \<Rightarrow> 'a sm" where
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1955
      "sm_of_dfa \<delta> F q = SM (q \<in> F) (\<lambda>a. sm_of_dfa \<delta> F (\<delta> q a))"
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1956
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1957
text {* \blankline *}
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1958
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1959
    primcorec empty_sm :: "'a sm" where
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1960
      "empty_sm = SM False (\<lambda>_. empty_sm)"
53751
7a994dc08cea added primcorec examples with lambdas
blanchet
parents: 53750
diff changeset
  1961
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1962
text {* \blankline *}
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1963
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1964
    primcorec not_sm :: "'a sm \<Rightarrow> 'a sm" where
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1965
      "not_sm M = SM (\<not> accept M) (\<lambda>a. not_sm (trans M a))"
53751
7a994dc08cea added primcorec examples with lambdas
blanchet
parents: 53750
diff changeset
  1966
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1967
text {* \blankline *}
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  1968
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1969
    primcorec or_sm :: "'a sm \<Rightarrow> 'a sm \<Rightarrow> 'a sm" where
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1970
      "or_sm M N =
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1971
         SM (accept M \<or> accept N) (\<lambda>a. or_sm (trans M a) (trans N a))"
53751
7a994dc08cea added primcorec examples with lambdas
blanchet
parents: 53750
diff changeset
  1972
54182
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1973
text {*
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1974
\noindent
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1975
For recursion through curried $n$-ary functions, $n$ applications of
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1976
@{term "op \<circ>"} are necessary. The examples below illustrate the case where
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1977
$n = 2$:
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1978
*}
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1979
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1980
    codatatype ('a, 'b) sm2 =
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1981
      SM2 (accept2: bool) (trans2: "'a \<Rightarrow> 'b \<Rightarrow> ('a, 'b) sm2")
54182
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1982
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1983
text {* \blankline *}
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1984
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1985
    primcorec
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1986
      (*<*)(in early) (*>*)sm2_of_dfa :: "('q \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> 'q) \<Rightarrow> 'q set \<Rightarrow> 'q \<Rightarrow> ('a, 'b) sm2"
54182
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1987
    where
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1988
      "sm2_of_dfa \<delta> F q = SM2 (q \<in> F) (op \<circ> (op \<circ> (sm2_of_dfa \<delta> F)) (\<delta> q))"
54182
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1989
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1990
text {* \blankline *}
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1991
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1992
    primcorec
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1993
      sm2_of_dfa :: "('q \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> 'q) \<Rightarrow> 'q set \<Rightarrow> 'q \<Rightarrow> ('a, 'b) sm2"
54182
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1994
    where
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  1995
      "sm2_of_dfa \<delta> F q = SM2 (q \<in> F) (\<lambda>a b. sm2_of_dfa \<delta> F (\<delta> q a b))"
54182
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  1996
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1997
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1998
subsubsection {* Nested-as-Mutual Corecursion
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  1999
  \label{sssec:primcorec-nested-as-mutual-corecursion} *}
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  2000
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  2001
text {*
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  2002
Just as it is possible to recurse over nested recursive datatypes as if they
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  2003
were mutually recursive
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  2004
(Section~\ref{sssec:primrec-nested-as-mutual-recursion}), it is possible to
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2005
pretend that nested codatatypes are mutually corecursive. For example:
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  2006
*}
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  2007
54287
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2008
(*<*)
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2009
    context late
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2010
    begin
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2011
(*>*)
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  2012
    primcorec
54287
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2013
      iterate\<^sub>i\<^sub>i :: "('a \<Rightarrow> 'a llist) \<Rightarrow> 'a \<Rightarrow> 'a tree\<^sub>i\<^sub>i" and
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  2014
      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
  2015
    where
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  2016
      "iterate\<^sub>i\<^sub>i g x = Node\<^sub>i\<^sub>i x (iterates\<^sub>i\<^sub>i g (g x))" |
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  2017
      "iterates\<^sub>i\<^sub>i g xs =
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  2018
         (case xs of
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  2019
            LNil \<Rightarrow> LNil
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  2020
          | LCons x xs' \<Rightarrow> LCons (iterate\<^sub>i\<^sub>i g x) (iterates\<^sub>i\<^sub>i g xs'))"
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2021
54287
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2022
text {*
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2023
\noindent
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2024
Coinduction rules are generated as
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2025
@{thm [source] iterate\<^sub>i\<^sub>i.coinduct},
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2026
@{thm [source] iterates\<^sub>i\<^sub>i.coinduct}, and
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2027
@{thm [source] iterate\<^sub>i\<^sub>i_iterates\<^sub>i\<^sub>i.coinduct}
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2028
and analogously for @{text strong_coinduct}. These rules and the
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2029
underlying corecursors are generated on a per-need basis and are kept in a cache
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2030
to speed up subsequent definitions.
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2031
*}
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2032
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2033
(*<*)
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2034
    end
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2035
(*>*)
7f096d8eb3d0 more docs
blanchet
parents: 54278
diff changeset
  2036
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2037
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2038
subsubsection {* Constructor View
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2039
  \label{ssec:primrec-constructor-view} *}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2040
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2041
(*<*)
54182
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  2042
    locale ctr_view
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2043
    begin
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2044
(*>*)
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2045
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2046
text {*
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2047
The constructor view is similar to the code view, but there is one separate
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2048
conditional equation per constructor rather than a single unconditional
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2049
equation. Examples that rely on a single constructor, such as @{const literate}
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2050
and @{const siterate}, are identical in both styles.
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2051
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2052
Here is an example where there is a difference:
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2053
*}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2054
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2055
    primcorec lappend :: "'a llist \<Rightarrow> 'a llist \<Rightarrow> 'a llist" where
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2056
      "lnull xs \<Longrightarrow> lnull ys \<Longrightarrow> lappend xs ys = LNil" |
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2057
      "_ \<Longrightarrow> lappend xs ys = LCons (lhd (if lnull xs then ys else xs))
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2058
         (if xs = LNil then ltl ys else lappend (ltl xs) ys)"
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2059
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2060
text {*
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2061
\noindent
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2062
With the constructor view, we must distinguish between the @{const LNil} and
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2063
the @{const LCons} case. The condition for @{const LCons} is
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2064
left implicit, as the negation of that for @{const LNil}.
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2065
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2066
For this example, the constructor view is slighlty more involved than the
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2067
code equation. Recall the code view version presented in
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2068
Section~\ref{sssec:primcorec-simple-corecursion}.
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2069
% TODO: \[{thm code_view.lappend.code}\]
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2070
The constructor view requires us to analyze the second argument (@{term ys}).
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2071
The code equation generated from the constructor view also suffers from this.
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2072
% TODO: \[{thm lappend.code}\]
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2073
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2074
In contrast, the next example is arguably more naturally expressed in the
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2075
constructor view:
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2076
*}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2077
53831
80423b9080cf support "of" syntax to disambiguate selector equations
panny
parents: 53829
diff changeset
  2078
    primcorec
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2079
      random_process :: "'a stream \<Rightarrow> (int \<Rightarrow> int) \<Rightarrow> int \<Rightarrow> 'a process"
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2080
    where
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2081
      "n mod 4 = 0 \<Longrightarrow> random_process s f n = Fail" |
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2082
      "n mod 4 = 1 \<Longrightarrow>
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2083
         random_process s f n = Skip (random_process s f (f n))" |
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2084
      "n mod 4 = 2 \<Longrightarrow>
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2085
         random_process s f n = Action (shd s) (random_process (stl s) f (f n))" |
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2086
      "n mod 4 = 3 \<Longrightarrow>
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2087
         random_process s f n = Choice (random_process (every_snd s) f (f n))
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2088
           (random_process (every_snd (stl s)) f (f n))"
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2089
(*<*)
53644
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  2090
    end
eb8362530715 more (co)data docs
blanchet
parents: 53643
diff changeset
  2091
(*>*)
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2092
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2093
text {*
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2094
\noindent
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2095
Since there is no sequentiality, we can apply the equation for @{const Choice}
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2096
without having first to discharge @{term "n mod (4\<Colon>int) \<noteq> 0"},
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2097
@{term "n mod (4\<Colon>int) \<noteq> 1"}, and
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2098
@{term "n mod (4\<Colon>int) \<noteq> 2"}.
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2099
The price to pay for this elegance is that we must discharge exclusivity proof
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2100
obligations, one for each pair of conditions
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2101
@{term "(n mod (4\<Colon>int) = i, n mod (4\<Colon>int) = j)"}
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2102
with @{term "i < j"}. If we prefer not to discharge any obligations, we can
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2103
enable the @{text "sequential"} option. This pushes the problem to the users of
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2104
the generated properties.
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2105
%Here are more examples to conclude:
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2106
*}
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2107
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  2108
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2109
subsubsection {* Destructor View
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2110
  \label{ssec:primrec-destructor-view} *}
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2111
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2112
(*<*)
54182
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  2113
    locale dtr_view
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2114
    begin
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2115
(*>*)
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2116
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2117
text {*
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2118
The destructor view is in many respects dual to the constructor view. Conditions
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2119
determine which constructor to choose, and these conditions are interpreted
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2120
sequentially or not depending on the @{text "sequential"} option.
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2121
Consider the following examples:
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2122
*}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2123
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2124
    primcorec literate :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a llist" where
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2125
      "\<not> lnull (literate _ x)" |
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2126
      "lhd (literate _ x) = x" |
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  2127
      "ltl (literate g x) = literate g (g x)"
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2128
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2129
text {* \blankline *}
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2130
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2131
    primcorec siterate :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a stream" where
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2132
      "shd (siterate _ x) = x" |
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  2133
      "stl (siterate g x) = siterate g (g x)"
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2134
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2135
text {* \blankline *}
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2136
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2137
    primcorec every_snd :: "'a stream \<Rightarrow> 'a stream" where
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2138
      "shd (every_snd s) = shd s" |
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2139
      "stl (every_snd s) = stl (stl s)"
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2140
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2141
text {*
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2142
\noindent
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2143
The first formula in the @{const literate} specification indicates which
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2144
constructor to choose. For @{const siterate} and @{const every_snd}, no such
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2145
formula is necessary, since the type has only one constructor. The last two
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2146
formulas are equations specifying the value of the result for the relevant
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2147
selectors. Corecursive calls appear directly to the right of the equal sign.
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2148
Their arguments are unrestricted.
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2149
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2150
The next example shows how to specify functions that rely on more than one
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2151
constructor:
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2152
*}
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2153
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2154
    primcorec lappend :: "'a llist \<Rightarrow> 'a llist \<Rightarrow> 'a llist" where
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2155
      "lnull xs \<Longrightarrow> lnull ys \<Longrightarrow> lnull (lappend xs ys)" |
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2156
      "lhd (lappend xs ys) = lhd (if lnull xs then ys else xs)" |
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2157
      "ltl (lappend xs ys) = (if xs = LNil then ltl ys else lappend (ltl xs) ys)"
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2158
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2159
text {*
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2160
\noindent
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2161
For a codatatype with $n$ constructors, it is sufficient to specify $n - 1$
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2162
discriminator formulas. The command will then assume that the remaining
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2163
constructor should be taken otherwise. This can be made explicit by adding
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2164
*}
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2165
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2166
(*<*)
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2167
    end
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2168
54182
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  2169
    locale dtr_view2
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  2170
    begin
e3759cbde221 expand doc a bit
blanchet
parents: 54181
diff changeset
  2171
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2172
    primcorec lappend :: "'a llist \<Rightarrow> 'a llist \<Rightarrow> 'a llist" where
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2173
      "lnull xs \<Longrightarrow> lnull ys \<Longrightarrow> lnull (lappend xs ys)" |
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2174
      "lhd (lappend xs ys) = lhd (if lnull xs then ys else xs)" |
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2175
      "ltl (lappend xs ys) = (if xs = LNil then ltl ys else lappend (ltl xs) ys)" |
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2176
(*>*)
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2177
      "_ \<Longrightarrow> \<not> lnull (lappend xs ys)"
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2178
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2179
text {*
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2180
\noindent
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2181
to the specification. The generated selector theorems are conditional.
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2182
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2183
The next example illustrates how to cope with selectors defined for several
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2184
constructors:
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2185
*}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2186
53831
80423b9080cf support "of" syntax to disambiguate selector equations
panny
parents: 53829
diff changeset
  2187
    primcorec
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2188
      random_process :: "'a stream \<Rightarrow> (int \<Rightarrow> int) \<Rightarrow> int \<Rightarrow> 'a process"
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2189
    where
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2190
      "n mod 4 = 0 \<Longrightarrow> is_Fail (random_process s f n)" |
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2191
      "n mod 4 = 1 \<Longrightarrow> is_Skip (random_process s f n)" |
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2192
      "n mod 4 = 2 \<Longrightarrow> is_Action (random_process s f n)" |
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2193
      "n mod 4 = 3 \<Longrightarrow> is_Choice (random_process s f n)" |
53831
80423b9080cf support "of" syntax to disambiguate selector equations
panny
parents: 53829
diff changeset
  2194
      "cont (random_process s f n) = random_process s f (f n)" of Skip |
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2195
      "prefix (random_process s f n) = shd s" |
53831
80423b9080cf support "of" syntax to disambiguate selector equations
panny
parents: 53829
diff changeset
  2196
      "cont (random_process s f n) = random_process (stl s) f (f n)" of Action |
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2197
      "left (random_process s f n) = random_process (every_snd s) f (f n)" |
53831
80423b9080cf support "of" syntax to disambiguate selector equations
panny
parents: 53829
diff changeset
  2198
      "right (random_process s f n) = random_process (every_snd (stl s)) f (f n)"
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2199
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2200
text {*
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2201
\noindent
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2202
Using the @{text "of"} keyword, different equations are specified for @{const
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2203
cont} depending on which constructor is selected.
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2204
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2205
Here are more examples to conclude:
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2206
*}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2207
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2208
    primcorec
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2209
      even_infty :: even_enat and
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2210
      odd_infty :: odd_enat
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2211
    where
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2212
      "\<not> is_Even_EZero even_infty" |
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2213
      "un_Even_ESuc even_infty = odd_infty" |
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2214
      "un_Odd_ESuc odd_infty = even_infty"
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2215
53752
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2216
text {* \blankline *}
1a883094fbe0 more primcorec docs
blanchet
parents: 53751
diff changeset
  2217
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2218
    primcorec iterate\<^sub>i\<^sub>i :: "('a \<Rightarrow> 'a llist) \<Rightarrow> 'a \<Rightarrow> 'a tree\<^sub>i\<^sub>i" where
54072
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  2219
      "lbl\<^sub>i\<^sub>i (iterate\<^sub>i\<^sub>i g x) = x" |
7bee26d970f0 more primcorec docs
blanchet
parents: 54071
diff changeset
  2220
      "sub\<^sub>i\<^sub>i (iterate\<^sub>i\<^sub>i g x) = lmap (iterate\<^sub>i\<^sub>i g) (g x)"
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2221
(*<*)
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2222
    end
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2223
(*>*)
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2224
53750
03c5c2db3a47 more primcorec docs
blanchet
parents: 53749
diff changeset
  2225
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2226
subsection {* Command Syntax
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2227
  \label{ssec:primcorec-command-syntax} *}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2228
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2229
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2230
subsubsection {* \keyw{primcorec} and \keyw{primcorecursive}
53753
ae7f50e70c09 renamed "primcorec" to "primcorecursive", to open the door to a 'theory -> theory' command called "primcorec" (cf. "fun" vs. "function")
blanchet
parents: 53752
diff changeset
  2231
  \label{sssec:primcorecursive-and-primcorec} *}
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  2232
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  2233
text {*
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2234
\begin{matharray}{rcl}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2235
  @{command_def "primcorec"} & : & @{text "local_theory \<rightarrow> local_theory"} \\
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2236
  @{command_def "primcorecursive"} & : & @{text "local_theory \<rightarrow> proof(prove)"}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2237
\end{matharray}
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  2238
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
  2239
@{rail \<open>
55029
61a6bf7d4b02 clarified @{rail} syntax: prefer explicit \<newline> symbol;
wenzelm
parents: 54958
diff changeset
  2240
  (@@{command primcorec} | @@{command primcorecursive}) target? \<newline>
61a6bf7d4b02 clarified @{rail} syntax: prefer explicit \<newline> symbol;
wenzelm
parents: 54958
diff changeset
  2241
    @{syntax pcr_option}? fixes @'where'
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2242
    (@{syntax pcr_formula} + '|')
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2243
  ;
53828
408c9a3617e3 improved rail diagram
blanchet
parents: 53826
diff changeset
  2244
  @{syntax_def pcr_option}: '(' ('sequential' | 'exhaustive') ')'
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  2245
  ;
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2246
  @{syntax_def pcr_formula}: thmdecl? prop (@'of' (term * ))?
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
  2247
\<close>}
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2248
54832
789fbbc092d2 implemented 'exhaustive' option in tactic
blanchet
parents: 54626
diff changeset
  2249
The optional target is potentially followed by a corecursion-specific option:
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2250
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2251
\begin{itemize}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2252
\setlength{\itemsep}{0pt}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2253
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2254
\item
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2255
The @{text "sequential"} option indicates that the conditions in specifications
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2256
expressed using the constructor or destructor view are to be interpreted
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2257
sequentially.
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2258
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2259
\item
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2260
The @{text "exhaustive"} option indicates that the conditions in specifications
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2261
expressed using the constructor or destructor view cover all possible cases.
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2262
\end{itemize}
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2263
53826
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2264
\noindent
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2265
The @{command primcorec} command is an abbreviation for @{command primcorecursive} with
92a8ae172242 use "primcorec" in doc
blanchet
parents: 53822
diff changeset
  2266
@{text "by auto?"} to discharge any emerging proof obligations.
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  2267
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2268
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  2269
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  2270
(*
52840
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  2271
subsection {* Generated Theorems
a0da63cec918 more (co)datatype documentation
blanchet
parents: 52829
diff changeset
  2272
  \label{ssec:primcorec-generated-theorems} *}
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  2273
*)
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2274
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2275
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2276
(*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2277
subsection {* Recursive Default Values for Selectors
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2278
  \label{ssec:primcorec-recursive-default-values-for-selectors} *}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2279
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2280
text {*
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2281
partial_function to the rescue
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2282
*}
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2283
*)
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2284
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2285
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  2286
section {* Registering Bounded Natural Functors
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2287
  \label{sec:registering-bounded-natural-functors} *}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  2288
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2289
text {*
53647
e78ebb290dd6 more (co)data docs
blanchet
parents: 53646
diff changeset
  2290
The (co)datatype package can be set up to allow nested recursion through
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2291
arbitrary type constructors, as long as they adhere to the BNF requirements
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2292
and are registered as BNFs. It is also possible to declare a BNF abstractly
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2293
without specifying its internal structure.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2294
*}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2295
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  2296
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2297
subsection {* Bounded Natural Functors
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2298
  \label{ssec:bounded-natural-functors} *}
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2299
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2300
text {*
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2301
Bounded natural functors (BNFs) are a semantic criterion for where
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2302
(co)re\-cur\-sion may appear on the right-hand side of an equation
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2303
\cite{traytel-et-al-2012,blanchette-et-al-wit}.
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2304
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2305
An $n$-ary BNF is a type constructor equipped with a map function
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2306
(functorial action), $n$ set functions (natural transformations),
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2307
and an infinite cardinal bound that satisfy certain properties.
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2308
For example, @{typ "'a llist"} is a unary BNF.
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2309
Its relator @{text "llist_all2 \<Colon>
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2310
  ('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow>
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2311
  'a llist \<Rightarrow> 'b llist \<Rightarrow> bool"}
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2312
extends binary predicates over elements to binary predicates over parallel
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2313
lazy lists. The cardinal bound limits the number of elements returned by the
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2314
set function; it may not depend on the cardinality of @{typ 'a}.
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2315
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2316
The type constructors introduced by @{command datatype_new} and
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2317
@{command codatatype} are automatically registered as BNFs. In addition, a
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2318
number of old-style datatypes and non-free types are preregistered.
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2319
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2320
Given an $n$-ary BNF, the $n$ type variables associated with set functions,
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2321
and on which the map function acts, are \emph{live}; any other variables are
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2322
\emph{dead}. Nested (co)recursion can only take place through live variables.
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2323
*}
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2324
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2325
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2326
subsection {* Introductory Examples
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2327
  \label{ssec:bnf-introductory-examples} *}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2328
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2329
text {*
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2330
The example below shows how to register a type as a BNF using the @{command bnf}
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2331
command. Some of the proof obligations are best viewed with the theory
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2332
@{theory Cardinal_Notations}, located in \verb|~~/src/HOL/Library|,
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2333
imported.
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2334
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2335
The type is simply a copy of the function space @{typ "'d \<Rightarrow> 'a"}, where @{typ 'a}
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2336
is live and @{typ 'd} is dead. We introduce it together with its map function,
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2337
set function, and relator.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2338
*}
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2339
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2340
    typedef ('d, 'a) fn = "UNIV \<Colon> ('d \<Rightarrow> 'a) set"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2341
    by simp
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2342
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2343
text {* \blankline *}
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2344
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2345
    lemmas Abs_Rep_thms[simp] =
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2346
      Abs_fn_inverse[OF UNIV_I] Rep_fn_inverse
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2347
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2348
text {* \blankline *}
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2349
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2350
    definition map_fn :: "('a \<Rightarrow> 'b) \<Rightarrow> ('d, 'a) fn \<Rightarrow> ('d, 'b) fn" where
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2351
      "map_fn f F = Abs_fn (\<lambda>x. f (Rep_fn F x))"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2352
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2353
text {* \blankline *}
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2354
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2355
    definition set_fn :: "('d, 'a) fn \<Rightarrow> 'a set" where
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2356
      "set_fn F = range (Rep_fn F)"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2357
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2358
text {* \blankline *}
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2359
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2360
    definition
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2361
      rel_fn :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> ('d, 'a) fn \<Rightarrow> ('d, 'b) fn \<Rightarrow> bool"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2362
    where
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2363
      "rel_fn R F G = fun_rel (op =) R (Rep_fn F) (Rep_fn G)"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2364
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2365
text {* \blankline *}
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2366
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2367
    axiomatization where cheat: "P"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2368
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2369
text {* \blankline *}
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2370
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2371
    bnf "('d, 'a) fn"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2372
      map: map_fn
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2373
      sets: set_fn
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2374
      bd: "natLeq +c |UNIV :: 'd set|"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2375
      rel: rel_fn
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2376
    proof -
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2377
      show "map_fn id = id"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2378
        by (auto simp add: map_fn_def[abs_def] id_comp)
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2379
    next
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2380
      fix F G show "map_fn (G \<circ> F) = map_fn G \<circ> map_fn F"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2381
        by (simp add: map_fn_def[abs_def] comp_def[abs_def])
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2382
    next
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2383
      fix F f g
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2384
      assume "\<And>x. x \<in> set_fn F \<Longrightarrow> f x = g x"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2385
      thus "map_fn f F = map_fn g F"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2386
        by (auto simp add: map_fn_def set_fn_def)
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2387
    next
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2388
      fix f show "set_fn \<circ> map_fn f = op ` f \<circ> set_fn"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2389
        by (auto simp add: set_fn_def map_fn_def comp_def)
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2390
    next
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2391
      show "card_order (natLeq +c |UNIV \<Colon> 'd set| )"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2392
        apply (rule card_order_csum)
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2393
        apply (rule natLeq_card_order)
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2394
        by (rule card_of_card_order_on)
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2395
    next
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2396
      show "cinfinite (natLeq +c |UNIV \<Colon> 'd set| )"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2397
        apply (rule cinfinite_csum)
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2398
        apply (rule disjI1)
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2399
        by (rule natLeq_cinfinite)
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2400
    next
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2401
      fix F :: "('d, 'a) fn"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2402
      have "|set_fn F| \<le>o |UNIV \<Colon> 'd set|" (is "_ \<le>o ?U")
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2403
        unfolding set_fn_def by (rule card_of_image)
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2404
      also have "?U \<le>o natLeq +c ?U"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2405
        by (rule ordLeq_csum2) (rule card_of_Card_order)
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2406
      finally show "|set_fn F| \<le>o natLeq +c |UNIV \<Colon> 'd set|" .
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2407
    next
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2408
      fix R S
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2409
      show "rel_fn R OO rel_fn S \<le> rel_fn (R OO S)"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2410
        by (auto simp add: rel_fn_def[abs_def] fun_rel_def)
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2411
    next
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2412
      fix R
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2413
      show "rel_fn R =
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2414
            (BNF_Util.Grp {x. set_fn x \<subseteq> Collect (split R)} (map_fn fst))\<inverse>\<inverse> OO
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2415
             BNF_Util.Grp {x. set_fn x \<subseteq> Collect (split R)} (map_fn snd)"
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2416
        unfolding set_fn_def rel_fn_def[abs_def] fun_rel_def Grp_def
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2417
          fun_eq_iff relcompp.simps conversep.simps subset_iff image_iff
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2418
        by (rule cheat)
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2419
    qed
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2420
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2421
text {* \blankline *}
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2422
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2423
    print_theorems
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2424
    print_bnfs
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2425
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2426
text {*
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2427
\noindent
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2428
Using \keyw{print\_theorems} and @{keyword print_bnfs}, we can contemplate and
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2429
show the world what we have achieved.
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2430
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2431
This particular example does not need any nonemptiness witness, because the
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2432
one generated by default is good enough, but in general this would be
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2433
necessary. See \verb|~~/src/HOL/Basic_BNFs.thy|,
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2434
\verb|~~/src/HOL/Library/FSet.thy|, and \verb|~~/src/HOL/Library/Multiset.thy|
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2435
for further examples of BNF registration, some of which feature custom
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2436
witnesses.
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2437
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2438
The next example declares a BNF axiomatically. The @{command bnf_decl} command
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2439
introduces a type @{text "('a, 'b, 'c) F"}, three set constants, a map
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2440
function, a relator, and a nonemptiness witness that depends only on
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2441
@{typ 'a}. (The type @{text "'a \<Rightarrow> ('a, 'b, 'c) F"} of
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2442
the witness can be read as an implication: If we have a witness for @{typ 'a},
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2443
we can construct a witness for @{text "('a, 'b, 'c) F"}.) The BNF
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2444
properties are postulated as axioms.
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2445
*}
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2446
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2447
    bnf_decl (setA: 'a, setB: 'b, setC: 'c) F [wits: "'a \<Rightarrow> ('a, 'b, 'c) F"]
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2448
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2449
text {* \blankline *}
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2450
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2451
    print_theorems
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2452
    print_bnfs
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2453
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  2454
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2455
subsection {* Command Syntax
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2456
  \label{ssec:bnf-command-syntax} *}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2457
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2458
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  2459
subsubsection {* \keyw{bnf}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  2460
  \label{sssec:bnf} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2461
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  2462
text {*
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2463
\begin{matharray}{rcl}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2464
  @{command_def "bnf"} & : & @{text "local_theory \<rightarrow> proof(prove)"}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2465
\end{matharray}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2466
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
  2467
@{rail \<open>
55029
61a6bf7d4b02 clarified @{rail} syntax: prefer explicit \<newline> symbol;
wenzelm
parents: 54958
diff changeset
  2468
  @@{command bnf} target? (name ':')? typ \<newline>
61a6bf7d4b02 clarified @{rail} syntax: prefer explicit \<newline> symbol;
wenzelm
parents: 54958
diff changeset
  2469
    'map:' term ('sets:' (term +))? 'bd:' term \<newline>
54421
632be352a5a3 more explicit syntax for defining a bnf
traytel
parents: 54402
diff changeset
  2470
    ('wits:' (term +))? ('rel:' term)?
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
  2471
\<close>}
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  2472
*}
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2473
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2474
54187
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
  2475
subsubsection {* \keyw{bnf\_decl}
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
  2476
  \label{sssec:bnf-decl} *}
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
  2477
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
  2478
text {*
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
  2479
\begin{matharray}{rcl}
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2480
  @{command_def "bnf_decl"} & : & @{text "local_theory \<rightarrow> local_theory"}
54187
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
  2481
\end{matharray}
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
  2482
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
  2483
@{rail \<open>
54602
168790252038 some documentation
traytel
parents: 54537
diff changeset
  2484
  @@{command bnf_decl} target? @{syntax dt_name}
168790252038 some documentation
traytel
parents: 54537
diff changeset
  2485
  ;
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2486
  @{syntax_def dt_name}: @{syntax tyargs}? name @{syntax map_rel}? \<newline>
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2487
    @{syntax wit_types}? mixfix?
54602
168790252038 some documentation
traytel
parents: 54537
diff changeset
  2488
  ;
168790252038 some documentation
traytel
parents: 54537
diff changeset
  2489
  @{syntax_def tyargs}: typefree | '(' (((name | '-') ':')? typefree + ',') ')'
168790252038 some documentation
traytel
parents: 54537
diff changeset
  2490
  ;
168790252038 some documentation
traytel
parents: 54537
diff changeset
  2491
  @{syntax_def map_rel}: '(' ((('map' | 'rel') ':' name) +) ')'
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2492
  ;
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2493
  @{syntax_def wit_types}: '[' 'wits' ':' types ']'
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
  2494
\<close>}
54602
168790252038 some documentation
traytel
parents: 54537
diff changeset
  2495
55350
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2496
\noindent
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2497
The @{command bnf_decl} command declares a new type and associated constants
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2498
(map, set, relator, and cardinal bound) and asserts the BNF properties for
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2499
these constants as axioms. Type arguments are live by default; they can be
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2500
marked as dead by entering \texttt{-} (hyphen) instead of a name for the
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2501
corresponding set function. Witnesses can be specified by their types.
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2502
Otherwise, the syntax of @{command bnf_decl} is
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2503
identical to the left-hand side of a @{command datatype_new} or @{command
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2504
codatatype} definition.
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2505
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2506
The command is useful to reason abstractly about BNFs. The axioms are safe
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2507
because there exists BNFs of arbitrary large arities. Applications must import
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2508
the theory @{theory BNF_Decl}, located in the directory
cf34abe28209 docs about registering a BNF
blanchet
parents: 55290
diff changeset
  2509
\verb|~~/src/HOL/Library|, to use this functionality.
54187
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
  2510
*}
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
  2511
80259d79a81e more doc -- feedback from Andrei P.
blanchet
parents: 54185
diff changeset
  2512
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  2513
subsubsection {* \keyw{print\_bnfs}
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  2514
  \label{sssec:print-bnfs} *}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2515
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2516
text {*
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2517
\begin{matharray}{rcl}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2518
  @{command_def "print_bnfs"} & : & @{text "local_theory \<rightarrow>"}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2519
\end{matharray}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2520
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
  2521
@{rail \<open>
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2522
  @@{command print_bnfs}
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
  2523
\<close>}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2524
*}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2525
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2526
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2527
section {* Deriving Destructors and Theorems for Free Constructors
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2528
  \label{sec:deriving-destructors-and-theorems-for-free-constructors} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2529
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2530
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2531
The derivation of convenience theorems for types equipped with free constructors,
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2532
as performed internally by @{command datatype_new} and @{command codatatype},
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2533
is available as a stand-alone command called @{command wrap_free_constructors}.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2534
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2535
%  * 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
  2536
%    a type not introduced by ...
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2537
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2538
%  * also useful for compatibility with old package, e.g. add destructors to
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2539
%    old \keyw{datatype}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2540
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2541
%  * @{command wrap_free_constructors}
54626
8a5e82425e55 added 'no_code' option
blanchet
parents: 54624
diff changeset
  2542
%    * @{text "no_discs_sels"}, @{text "no_code"}, @{text "rep_compat"}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2543
%    * hack to have both co and nonco view via locale (cf. ext nats)
54616
a21a2223c02b minor doc update
blanchet
parents: 54602
diff changeset
  2544
%  * code generator
a21a2223c02b minor doc update
blanchet
parents: 54602
diff changeset
  2545
%     * eq, refl, simps
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2546
*}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  2547
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  2548
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  2549
(*
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2550
subsection {* Introductory Example
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2551
  \label{ssec:ctors-introductory-example} *}
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  2552
*)
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2553
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  2554
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2555
subsection {* Command Syntax
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2556
  \label{ssec:ctors-command-syntax} *}
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2557
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2558
53621
9c3a80af72ff more (co)data doc
blanchet
parents: 53619
diff changeset
  2559
subsubsection {* \keyw{wrap\_free\_constructors}
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  2560
  \label{sssec:wrap-free-constructors} *}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  2561
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  2562
text {*
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2563
\begin{matharray}{rcl}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2564
  @{command_def "wrap_free_constructors"} & : & @{text "local_theory \<rightarrow> proof(prove)"}
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2565
\end{matharray}
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  2566
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
  2567
@{rail \<open>
55029
61a6bf7d4b02 clarified @{rail} syntax: prefer explicit \<newline> symbol;
wenzelm
parents: 54958
diff changeset
  2568
  @@{command wrap_free_constructors} target? @{syntax dt_options} \<newline>
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
  2569
    term_list name @{syntax wfc_discs_sels}?
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  2570
  ;
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
  2571
  @{syntax_def wfc_discs_sels}: name_list (name_list_list name_term_list_list? )?
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  2572
  ;
53534
de2027f9aff3 more (co)datatype documentation
blanchet
parents: 53491
diff changeset
  2573
  @{syntax_def name_term}: (name ':' term)
54421
632be352a5a3 more explicit syntax for defining a bnf
traytel
parents: 54402
diff changeset
  2574
  ;
632be352a5a3 more explicit syntax for defining a bnf
traytel
parents: 54402
diff changeset
  2575
  X_list: '[' (X + ',') ']'
55112
b1a5d603fd12 prefer rail cartouche -- avoid back-slashed quotes;
wenzelm
parents: 55029
diff changeset
  2576
\<close>}
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  2577
54626
8a5e82425e55 added 'no_code' option
blanchet
parents: 54624
diff changeset
  2578
% options: no_discs_sels no_code rep_compat
53028
a1e64c804c35 more (co)datatype documentation
blanchet
parents: 53025
diff changeset
  2579
53829
92e71eb22ebe more (co)data docs
blanchet
parents: 53828
diff changeset
  2580
\noindent
53542
14000a283ce0 more (co)data docs
blanchet
parents: 53535
diff changeset
  2581
Section~\ref{ssec:datatype-generated-theorems} lists the generated theorems.
53018
11ebef554439 added rail diagram
blanchet
parents: 52969
diff changeset
  2582
*}
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  2583
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2584
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2585
(*
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  2586
section {* Standard ML Interface
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2587
  \label{sec:standard-ml-interface} *}
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  2588
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2589
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2590
The package's programmatic interface.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2591
*}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2592
*)
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2593
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2594
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2595
(*
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  2596
section {* Interoperability
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2597
  \label{sec:interoperability} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2598
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2599
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2600
The package's interaction with other Isabelle packages and tools, such as the
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2601
code generator and the counterexample generators.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2602
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2603
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  2604
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  2605
subsection {* Transfer and Lifting
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  2606
  \label{ssec:transfer-and-lifting} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2607
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  2608
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  2609
subsection {* Code Generator
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  2610
  \label{ssec:code-generator} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2611
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  2612
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  2613
subsection {* Quickcheck
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  2614
  \label{ssec:quickcheck} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2615
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  2616
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  2617
subsection {* Nitpick
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  2618
  \label{ssec:nitpick} *}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2619
52824
b7a83845bc93 more (co)datatype documentation
blanchet
parents: 52822
diff changeset
  2620
52828
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  2621
subsection {* Nominal Isabelle
e1c6fa322d96 more (co)datatype docs
blanchet
parents: 52827
diff changeset
  2622
  \label{ssec:nominal-isabelle} *}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2623
*)
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2624
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2625
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2626
(*
52827
395d3df496ed more (co)datatype documentation
blanchet
parents: 52824
diff changeset
  2627
section {* Known Bugs and Limitations
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2628
  \label{sec:known-bugs-and-limitations} *}
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2629
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2630
text {*
53623
501e2091182b more (co)data docs
blanchet
parents: 53621
diff changeset
  2631
Known open issues of the package.
52805
7f2f42046361 more (co)datatype documentation
blanchet
parents: 52795
diff changeset
  2632
*}
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2633
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2634
text {*
53753
ae7f50e70c09 renamed "primcorec" to "primcorecursive", to open the door to a 'theory -> theory' command called "primcorec" (cf. "fun" vs. "function")
blanchet
parents: 53752
diff changeset
  2635
%* primcorecursive and primcorec is unfinished
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2636
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2637
%* 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
  2638
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2639
%* issues with HOL-Proofs?
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2640
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2641
%* partial documentation
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2642
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2643
%* 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
  2644
%  (for @{command datatype_new_compat} and prim(co)rec)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2645
%
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  2646
%    * a fortiori, no way to register same type as both data- and codatatype
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2647
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2648
%* no recursion through unused arguments (unlike with the old package)
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2649
%
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2650
%* in a locale, cannot use locally fixed types (because of limitation in typedef)?
53619
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  2651
%
27d2c98d9d9f more (co)data docs
blanchet
parents: 53617
diff changeset
  2652
% *names of variables suboptimal
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  2653
*}
53675
d4a4b32038eb more (co)data docs
blanchet
parents: 53654
diff changeset
  2654
*)
52822
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  2655
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  2656
ae938ac9a721 more (co)datatype docs
blanchet
parents: 52806
diff changeset
  2657
text {*
53863
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
  2658
\section*{Acknowledgment}
c7364dca96f2 textual improvements following Christian Sternagel's feedback
blanchet
parents: 53857
diff changeset
  2659
53749
b37db925b663 adapted primcorec documentation to reflect the three views
blanchet
parents: 53748
diff changeset
  2660
Tobias Nipkow and Makarius Wenzel encouraged us to implement the new
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2661
(co)datatype package. Andreas Lochbihler provided lots of comments on earlier
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2662
versions of the package, especially for the coinductive part. Brian Huffman
55129
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
  2663
suggested major simplifications to the internal constructions, many of which
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
  2664
have yet to be implemented. Florian Haftmann and Christian Urban provided
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
  2665
general advice on Isabelle and package writing. Stefan Milius and Lutz
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
  2666
Schr\"oder found an elegant proof that eliminated one of the BNF proof
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
  2667
obligations. Andreas Lochbihler and Christian Sternagel suggested many textual
26bd1cba3ab5 killed 'More_BNFs' by moving its various bits where they (now) belong
blanchet
parents: 55114
diff changeset
  2668
improvements to this tutorial.
52794
aae782070611 more (co)datatype documentation
blanchet
parents: 52792
diff changeset
  2669
*}
53617
da5e1887d7a7 more (co)data doc
blanchet
parents: 53565
diff changeset
  2670
52792
3e651be14fcd sketched documentation for new (co)datatype package
blanchet
parents:
diff changeset
  2671
end