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