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
8 Tutorial for (co)datatype definitions with the new package.
14 "~~/src/HOL/Library/BNF_Axiomatization"
15 "~~/src/HOL/Library/Cardinal_Notations"
16 "~~/src/HOL/Library/FSet"
17 "~~/src/HOL/Library/Simps_Case_Conv"
20 section {* Introduction
21 \label{sec:introduction} *}
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.
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:
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")
40 Another strong point is the support for local definitions:
45 datatype_new flag = Less | Eq | Greater
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.
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
64 codatatype (*<*)(in early) (*>*)'a llist = LNil | LCons 'a "'a llist"
68 Mixed inductive--coinductive recursion is possible via nesting. Compare the
69 following four Rose tree examples:
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"
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
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|.
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.
97 This tutorial is organized as follows:
100 \setlength{\itemsep}{0pt}
102 \item Section \ref{sec:defining-datatypes}, ``Defining Datatypes,''
103 describes how to specify datatypes using the @{command datatype_new} command.
105 \item Section \ref{sec:defining-recursive-functions}, ``Defining Recursive
106 Functions,'' describes how to specify recursive functions using
109 \item Section \ref{sec:defining-codatatypes}, ``Defining Codatatypes,''
110 describes how to specify codatatypes using the @{command codatatype} command.
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.
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.
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}.
127 %\item Section \ref{sec:standard-ml-interface}, ``Standard ML Interface,''
128 %describes the package's programmatic interface.
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.
134 %\item Section \ref{sec:known-bugs-and-limitations}, ``Known Bugs and
135 %Limitations,'' concludes with known open issues at the time of writing.
140 \setbox\boxA=\hbox{\texttt{NOSPAM}}
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}}
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.
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.
163 section {* Defining Datatypes
164 \label{sec:defining-datatypes} *}
167 Datatypes can be specified using the @{command datatype_new} command.
171 subsection {* Introductory Examples
172 \label{ssec:datatype-introductory-examples} *}
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|.
180 subsubsection {* Nonrecursive Types
181 \label{sssec:datatype-nonrecursive-types} *}
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:
189 datatype_new trool = Truue | Faalse | Perhaaps
193 Here, @{const Truue}, @{const Faalse}, and @{const Perhaaps} have the type @{typ trool}.
195 Polymorphic types are possible, such as the following option type, modeled after
196 its homologue from the @{theory Option} theory:
200 hide_const None Some map_option
203 datatype_new 'a option = None | Some 'a
207 The constructors are @{text "None :: 'a option"} and
208 @{text "Some :: 'a \<Rightarrow> 'a option"}.
210 The next example has three type parameters:
213 datatype_new ('a, 'b, 'c) triple = Triple 'a 'b 'c
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
223 datatype_new ('a, 'b, 'c) triple\<^sub>u = Triple\<^sub>u "'a * 'b * 'c"
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.
232 subsubsection {* Simple Recursion
233 \label{sssec:datatype-simple-recursion} *}
236 Natural numbers are the simplest example of a recursive type:
239 datatype_new nat = Zero | Suc nat
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:
247 datatype_new (*<*)(in early) (*>*)('a, 'b) tlist = TNil 'b | TCons 'a "('a, 'b) tlist"
250 subsubsection {* Mutual Recursion
251 \label{sssec:datatype-mutual-recursion} *}
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
259 datatype_new even_nat = Even_Zero | Even_Suc odd_nat
260 and odd_nat = Odd_Suc even_nat
264 Arithmetic expressions are defined via terms, terms via factors, and factors via
268 datatype_new ('a, 'b) exp =
269 Term "('a, 'b) trm" | Sum "('a, 'b) trm" "('a, 'b) exp"
271 Factor "('a, 'b) fct" | Prod "('a, 'b) fct" "('a, 'b) trm"
273 Const 'a | Var 'b | Expr "('a, 'b) exp"
276 subsubsection {* Nested Recursion
277 \label{sssec:datatype-nested-recursion} *}
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,
286 datatype_new 'a btree =
287 BNode 'a "'a btree option" "'a btree option"
291 Not all nestings are admissible. For example, this command will fail:
294 datatype_new 'a wrong = W1 | W2 (*<*)'a
295 typ (*>*)"'a wrong \<Rightarrow> 'a"
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>"}:
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"
310 The following definition of @{typ 'a}-branching trees is legal:
313 datatype_new 'a ftree = FTLeaf 'a | FTNode "'a \<Rightarrow> 'a ftree"
317 And so is the definition of hereditarily finite sets:
320 datatype_new hfset = HFSet "hfset fset"
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
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.
337 Here is another example that fails:
340 datatype_new 'a pow_list = PNil 'a (*<*)'a
341 datatype_new 'a pow_list' = PNil' 'a (*>*)| PCons "('a * 'a) pow_list"
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.
350 subsubsection {* Auxiliary Constants and Properties
351 \label{sssec:datatype-auxiliary-constants-and-properties} *}
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}:
365 "[x, xs]" == "x # [xs]"
373 hide_const Nil Cons hd tl set map list_all2 rec_list size_list
377 datatype_new (set: 'a) list =
379 | Cons (hd: 'a) (tl: "'a list")
388 The types of the constants that appear in the specification are listed below.
392 \begin{tabular}{@ {}ll@ {}}
394 @{text "Nil \<Colon> 'a list"} \\
396 @{text "Cons \<Colon> 'a \<Rightarrow> 'a list \<Rightarrow> 'a list"} \\
398 @{text "null \<Colon> 'a list \<Rightarrow> bool"} \\
400 @{text "hd \<Colon> 'a list \<Rightarrow> 'a"} \\
402 @{text "tl \<Colon> 'a list \<Rightarrow> 'a list"} \\
404 @{text "set \<Colon> 'a list \<Rightarrow> 'a set"} \\
406 @{text "map \<Colon> ('a \<Rightarrow> 'b) \<Rightarrow> 'a list \<Rightarrow> 'b list"} \\
408 @{text "list_all2 \<Colon> ('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> 'a list \<Rightarrow> 'b list \<Rightarrow> bool"}
413 The discriminator @{const null} and the selectors @{const hd} and @{const tl}
414 are characterized by the following conditional equations:
416 \[@{thm list.collapse(1)[of xs, no_vars]}
417 \qquad @{thm list.collapse(2)[of xs, no_vars]}\]
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"}.
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).
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.
435 The usual mixfix syntax annotations are available for both types and
436 constructors. For example:
442 datatype_new ('a, 'b) prod (infixr "*" 20) = Pair 'a 'b
444 text {* \blankline *}
446 datatype_new (set: 'a) list =
448 | Cons (hd: 'a) (tl: "'a list") (infixr "#" 65)
455 Incidentally, this is how the traditional syntax can be set up:
458 syntax "_list" :: "args \<Rightarrow> 'a list" ("[(_)]")
460 text {* \blankline *}
463 "[x, xs]" == "x # [xs]"
467 subsection {* Command Syntax
468 \label{ssec:datatype-command-syntax} *}
471 subsubsection {* \keyw{datatype\_new}
472 \label{sssec:datatype-new} *}
475 \begin{matharray}{rcl}
476 @{command_def "datatype_new"} & : & @{text "local_theory \<rightarrow> local_theory"}
480 @@{command datatype_new} target? @{syntax dt_options}? \<newline>
481 (@{syntax dt_name} '=' (@{syntax dt_ctor} + '|') \<newline>
482 @{syntax map_rel}? (@'where' (prop + '|'))? + @'and')
484 @{syntax_def dt_options}: '(' (('discs_sels' | 'no_code') + ',') ')'
486 @{syntax_def map_rel}: @'for' ((('map' | 'rel') ':' name) +)
492 The @{command datatype_new} command introduces a set of mutually recursive
493 datatypes specified by their constructors.
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.
499 The optional target is optionally followed by one or both of the following
503 \setlength{\itemsep}{0pt}
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.
511 The @{text "no_code"} option indicates that the datatype should not be
512 registered for code generation.
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.
520 The left-hand sides of the datatype equations specify the name of the type to
521 define, its type parameters, and additional information:
524 @{syntax_def dt_name}: @{syntax tyargs}? name mixfix?
526 @{syntax_def tyargs}: typefree | '(' (('dead' | name ':')? typefree + ',') ')'
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}.
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
545 Inside a mutually recursive specification, all defined datatypes must
546 mention exactly the same type variables in the same order.
549 @{syntax_def dt_ctor}: (name ':')? name (@{syntax dt_ctor_arg} * ) mixfix?
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.
562 @{syntax_def dt_ctor_arg}: type | '(' name ':' type ')'
568 The syntactic entity \synt{type} denotes a HOL type \cite{isabelle-isar-ref}.
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.
577 subsubsection {* \keyw{datatype\_compat}
578 \label{sssec:datatype-compat} *}
581 \begin{matharray}{rcl}
582 @{command_def "datatype_compat"} & : & @{text "local_theory \<rightarrow> local_theory"}
586 @@{command datatype_compat} (name +)
592 The @{command datatype_compat} command registers new-style datatypes as
593 old-style datatypes. For example:
596 datatype_compat even_nat odd_nat
598 text {* \blankline *}
600 ML {* Datatype_Data.get_info @{theory} @{type_name even_nat} *}
603 The syntactic entity \synt{name} denotes an identifier \cite{isabelle-isar-ref}.
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.
609 A few remarks concern nested recursive datatypes:
612 \setlength{\itemsep}{0pt}
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}).
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).
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.
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
634 subsection {* Generated Constants
635 \label{ssec:datatype-generated-constants} *}
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:
645 \begin{tabular}{@ {}ll@ {}}
647 @{text t.case_t} (rendered using the familiar @{text case}--@{text of} syntax) \\
649 @{text "t.is_C\<^sub>1"}$, \ldots, $@{text "t.is_C\<^sub>n"} \\
651 @{text t.un_C\<^sub>11}$, \ldots, $@{text t.un_C\<^sub>1k\<^sub>1} \\
653 & @{text t.un_C\<^sub>n1}$, \ldots, $@{text t.un_C\<^sub>nk\<^sub>n} \\
655 @{text t.set1_t}, \ldots, @{text t.setm_t} \\
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.
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}.
678 subsection {* Generated Theorems
679 \label{ssec:datatype-generated-theorems} *}
682 The characteristic theorems generated by @{command datatype_new} are grouped in
683 three broad categories:
686 \setlength{\itemsep}{0pt}
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}.
693 \item The \emph{functorial theorems} (Section~\ref{sssec:functorial-theorems})
694 are properties of datatypes related to their BNF nature.
696 \item The \emph{inductive theorems} (Section~\ref{sssec:inductive-theorems})
697 are properties of datatypes related to their inductive nature.
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
708 declare [[bnf_note_all]]
710 declare [[bnf_note_all = false]]
715 to the top of the theory file.
718 subsubsection {* Free Constructor Theorems
719 \label{sssec:free-constructor-theorems} *}
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"}:
733 \item[@{text "t."}\hthm{inject} @{text "[iff, induct_simp]"}\rm:] ~ \\
734 @{thm list.inject[no_vars]}
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]}
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]}
743 \item[@{text "t."}\hthm{nchotomy}\rm:] ~ \\
744 @{thm list.nchotomy[no_vars]}
750 In addition, these nameless theorems are registered as safe elimination rules:
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]}
763 The next subgroup is concerned with the case combinator:
768 \item[@{text "t."}\hthm{case} @{text "[simp, code]"}\rm:] ~ \\
769 @{thm list.case(1)[no_vars]} \\
770 @{thm list.case(2)[no_vars]}
772 \item[@{text "t."}\hthm{case\_cong} @{text "[fundef_cong]"}\rm:] ~ \\
773 @{thm list.case_cong[no_vars]}
775 \item[@{text "t."}\hthm{weak\_case\_cong} @{text "[cong]"}\rm:] ~ \\
776 @{thm list.weak_case_cong[no_vars]}
778 \item[@{text "t."}\hthm{split}\rm:] ~ \\
779 @{thm list.split[no_vars]}
781 \item[@{text "t."}\hthm{split\_asm}\rm:] ~ \\
782 @{thm list.split_asm[no_vars]}
784 \item[@{text "t."}\hthm{splits} = @{text "split split_asm"}]
790 The third subgroup revolves around discriminators and selectors:
795 \item[@{text "t."}\hthm{disc} @{text "[simp]"}\rm:] ~ \\
796 @{thm list.disc(1)[no_vars]} \\
797 @{thm list.disc(2)[no_vars]}
799 \item[@{text "t."}\hthm{discI}\rm:] ~ \\
800 @{thm list.discI(1)[no_vars]} \\
801 @{thm list.discI(2)[no_vars]}
803 \item[@{text "t."}\hthm{sel} @{text "[simp, code]"}\rm:] ~ \\
804 @{thm list.sel(1)[no_vars]} \\
805 @{thm list.sel(2)[no_vars]}
807 \item[@{text "t."}\hthm{collapse} @{text "[simp]"}\rm:] ~ \\
808 @{thm list.collapse(1)[no_vars]} \\
809 @{thm list.collapse(2)[no_vars]}
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"}
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]}
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]}
824 \item[@{text "t."}\hthm{expand}\rm:] ~ \\
825 @{thm list.expand[no_vars]}
827 \item[@{text "t."}\hthm{sel\_split}\rm:] ~ \\
828 @{thm list.sel_split[no_vars]}
830 \item[@{text "t."}\hthm{sel\_split\_asm}\rm:] ~ \\
831 @{thm list.sel_split_asm[no_vars]}
833 \item[@{text "t."}\hthm{case\_eq\_if}\rm:] ~ \\
834 @{thm list.case_eq_if[no_vars]}
840 In addition, equational versions of @{text t.disc} are registered with the @{text "[code]"}
845 subsubsection {* Functorial Theorems
846 \label{sssec:functorial-theorems} *}
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:
856 \item[@{text "t."}\hthm{set} @{text "[simp, code]"}\rm:] ~ \\
857 @{thm list.set(1)[no_vars]} \\
858 @{thm list.set(2)[no_vars]}
860 \item[@{text "t."}\hthm{set\_empty}\rm:] ~ \\
861 @{thm list.set_empty[no_vars]}
863 \item[@{text "t."}\hthm{sel\_set}\rm:] ~ \\
864 @{thm list.sel_set[no_vars]}
866 \item[@{text "t."}\hthm{map} @{text "[simp, code]"}\rm:] ~ \\
867 @{thm list.map(1)[no_vars]} \\
868 @{thm list.map(2)[no_vars]}
870 \item[@{text "t."}\hthm{disc\_map\_iff} @{text "[simp]"}\rm:] ~ \\
871 @{thm list.disc_map_iff[no_vars]}
873 \item[@{text "t."}\hthm{sel\_map}\rm:] ~ \\
874 @{thm list.sel_map[no_vars]}
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]}
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]}
888 In addition, equational versions of @{text t.rel_inject} and @{text
889 rel_distinct} are registered with the @{text "[code]"} attribute.
891 The second subgroup consists of more abstract properties of the set functions,
892 the map function, and the relator:
897 \item[@{text "t."}\hthm{set\_map}\rm:] ~ \\
898 @{thm list.set_map[no_vars]}
900 \item[@{text "t."}\hthm{map\_comp}\rm:] ~ \\
901 @{thm list.map_cong0[no_vars]}
903 \item[@{text "t."}\hthm{map\_cong} @{text "[fundef_cong]"}\rm:] ~ \\
904 @{thm list.map_cong[no_vars]}
906 \item[@{text "t."}\hthm{map\_id}\rm:] ~ \\
907 @{thm list.map_id[no_vars]}
909 \item[@{text "t."}\hthm{map\_id0}\rm:] ~ \\
910 @{thm list.map_id0[no_vars]}
912 \item[@{text "t."}\hthm{map\_ident}\rm:] ~ \\
913 @{thm list.map_ident[no_vars]}
915 \item[@{text "t."}\hthm{rel\_compp}\rm:] ~ \\
916 @{thm list.rel_compp[no_vars]}
918 \item[@{text "t."}\hthm{rel\_conversep}\rm:] ~ \\
919 @{thm list.rel_conversep[no_vars]}
921 \item[@{text "t."}\hthm{rel\_eq}\rm:] ~ \\
922 @{thm list.rel_eq[no_vars]}
924 \item[@{text "t."}\hthm{rel\_flip}\rm:] ~ \\
925 @{thm list.rel_flip[no_vars]}
927 \item[@{text "t."}\hthm{rel\_mono}\rm:] ~ \\
928 @{thm list.rel_mono[no_vars]}
935 subsubsection {* Inductive Theorems
936 \label{sssec:inductive-theorems} *}
939 The inductive theorems are as follows:
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]}
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.
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]}
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.
958 \item[@{text "t."}\hthm{rec} @{text "[simp, code]"}\rm:] ~ \\
959 @{thm list.rec(1)[no_vars]} \\
960 @{thm list.rec(2)[no_vars]}
962 \item[@{text "t."}\hthm{rec\_o\_map}\rm:] ~ \\
963 @{thm list.rec_o_map[no_vars]}
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]}
971 \item[@{text "t."}\hthm{size\_o\_map}\rm:] ~ \\
972 @{thm list.size_o_map[no_vars]}
978 For convenience, @{command datatype_new} also provides the following collection:
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}
991 subsection {* Compatibility Issues
992 \label{ssec:datatype-compatibility-issues} *}
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:
1000 \setlength{\itemsep}{0pt}
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.
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}.}
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}.
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}.
1026 \item \emph{The internal constructions are completely different.} Proof texts
1027 that unfold the definition of constants introduced by \keyw{datatype} will be
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"}.
1039 \item \emph{The @{text t.simps} collection has been extended.}
1040 Previously available theorems are available at the same index.
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.
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}).
1059 section {* Defining Recursive Functions
1060 \label{sec:defining-recursive-functions} *}
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}.
1069 %%% TODO: partial_function
1073 subsection {* Introductory Examples
1074 \label{ssec:primrec-introductory-examples} *}
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|.
1083 subsubsection {* Nonrecursive Types
1084 \label{sssec:primrec-nonrecursive-types} *}
1087 Primitive recursion removes one layer of constructors on the left-hand side in
1088 each equation. For example:
1091 primrec bool_of_trool :: "trool \<Rightarrow> bool" where
1092 "bool_of_trool Faalse \<longleftrightarrow> False" |
1093 "bool_of_trool Truue \<longleftrightarrow> True"
1095 text {* \blankline *}
1097 primrec the_list :: "'a option \<Rightarrow> 'a list" where
1098 "the_list None = []" |
1099 "the_list (Some a) = [a]"
1101 text {* \blankline *}
1103 primrec the_default :: "'a \<Rightarrow> 'a option \<Rightarrow> 'a" where
1104 "the_default d None = d" |
1105 "the_default _ (Some a) = a"
1107 text {* \blankline *}
1109 primrec mirrror :: "('a, 'b, 'c) triple \<Rightarrow> ('c, 'b, 'a) triple" where
1110 "mirrror (Triple a b c) = Triple c b a"
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
1121 subsubsection {* Simple Recursion
1122 \label{sssec:primrec-simple-recursion} *}
1125 For simple recursive types, recursive calls on a constructor argument are
1126 allowed on the right-hand side:
1129 primrec replicate :: "nat \<Rightarrow> 'a \<Rightarrow> 'a list" where
1130 "replicate Zero _ = []" |
1131 "replicate (Suc n) x = x # replicate n x"
1133 text {* \blankline *}
1135 primrec at :: "'a list \<Rightarrow> nat \<Rightarrow> 'a" where
1138 Zero \<Rightarrow> x
1139 | Suc j' \<Rightarrow> at xs j')"
1141 text {* \blankline *}
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)"
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|.
1155 simps_of_case at_simps: at.simps
1158 This generates the lemma collection @{thm [source] at_simps}:
1160 \[@{thm at_simps(1)[no_vars]}
1161 \qquad @{thm at_simps(2)[no_vars]}\]
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}):
1172 text {* \blankline *}
1174 fun at_least_two :: "nat \<Rightarrow> bool" where
1175 "at_least_two (Suc (Suc _)) \<longleftrightarrow> True" |
1176 "at_least_two _ \<longleftrightarrow> False"
1179 subsubsection {* Mutual Recursion
1180 \label{sssec:primrec-mutual-recursion} *}
1183 The syntax for mutually recursive functions over mutually recursive datatypes
1188 nat_of_even_nat :: "even_nat \<Rightarrow> nat" and
1189 nat_of_odd_nat :: "odd_nat \<Rightarrow> nat"
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)"
1195 text {* \blankline *}
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"
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"
1212 Mutual recursion is possible within a single type, using \keyw{fun}:
1216 even :: "nat \<Rightarrow> bool" and
1217 odd :: "nat \<Rightarrow> bool"
1219 "even Zero = True" |
1220 "even (Suc n) = odd n" |
1221 "odd Zero = False" |
1222 "odd (Suc n) = even n"
1225 subsubsection {* Nested Recursion
1226 \label{sssec:primrec-nested-recursion} *}
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}:
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")
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 =
1241 | j # js' \<Rightarrow> at (map (\<lambda>t. at\<^sub>f\<^sub>f t js') ts) j)"
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}:
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)"
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>"}):
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)"
1268 For convenience, recursion through functions can also be expressed using
1269 $\lambda$-abstractions and function application rather than through composition.
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))"
1277 text {* \blankline *}
1279 primrec subtree_ft :: "'a \<Rightarrow> 'a ftree \<Rightarrow> 'a ftree" where
1280 "subtree_ft x (FTNode g) = g x"
1284 For recursion through curried $n$-ary functions, $n$ applications of
1285 @{term "op \<circ>"} are necessary. The examples below illustrate the case where
1289 datatype_new 'a ftree2 = FTLeaf2 'a | FTNode2 "'a \<Rightarrow> 'a \<Rightarrow> 'a ftree2"
1291 text {* \blankline *}
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)"
1297 text {* \blankline *}
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))"
1303 text {* \blankline *}
1305 primrec subtree_ft2 :: "'a \<Rightarrow> 'a \<Rightarrow> 'a ftree2 \<Rightarrow> 'a ftree2" where
1306 "subtree_ft2 x y (FTNode2 g) = g x y"
1309 subsubsection {* Nested-as-Mutual Recursion
1310 \label{sssec:primrec-nested-as-mutual-recursion} *}
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:
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"
1327 "at\<^sub>f\<^sub>f (Node\<^sub>f\<^sub>f a ts) js =
1330 | j # js' \<Rightarrow> ats\<^sub>f\<^sub>f ts j js')" |
1331 "ats\<^sub>f\<^sub>f (t # ts) j =
1333 Zero \<Rightarrow> at\<^sub>f\<^sub>f t
1334 | Suc j' \<Rightarrow> ats\<^sub>f\<^sub>f ts j')"
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.
1345 Here is a second example:
1349 sum_btree :: "('a\<Colon>{zero,plus}) btree \<Rightarrow> 'a" and
1350 sum_btree_option :: "'a btree option \<Rightarrow> 'a"
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"
1358 % * can pretend a nested type is mutually recursive (if purely inductive)
1359 % * avoids the higher-order map
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
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
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
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
1380 % * the auxiliary functions like @{const ats\<^sub>f\<^sub>f} are sometimes useful in own right
1382 % * impact on automation unclear
1390 subsection {* Command Syntax
1391 \label{ssec:primrec-command-syntax} *}
1394 subsubsection {* \keyw{primrec}
1395 \label{sssec:primrec-new} *}
1398 \begin{matharray}{rcl}
1399 @{command_def "primrec"} & : & @{text "local_theory \<rightarrow> local_theory"}
1403 @@{command primrec} target? @{syntax pr_option}? fixes \<newline>
1404 @'where' (@{syntax pr_equation} + '|')
1406 @{syntax_def pr_option}: '(' 'nonexhaustive' ')'
1408 @{syntax_def pr_equation}: thmdecl? prop
1414 The @{command primrec} command introduces a set of mutually recursive functions
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}.
1422 The optional target is optionally followed by the following option:
1425 \setlength{\itemsep}{0pt}
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.
1433 %%% TODO: elaborate on format of the equations
1434 %%% TODO: elaborate on mutual and nested-to-mutual
1439 subsection {* Generated Theorems
1440 \label{ssec:primrec-generated-theorems} *}
1443 % * synthesized nonrecursive definition
1444 % * user specification is rederived from it, exactly as entered
1448 % * without some needless induction hypotheses if not used
1455 subsection {* Recursive Default Values for Selectors
1456 \label{ssec:primrec-recursive-default-values-for-selectors} *}
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.
1467 Fortunately, there is a workaround that relies on overloading to relieve us
1468 from the tedium of manual derivations:
1471 \setlength{\itemsep}{0pt}
1474 Introduce a fully unspecified constant @{text "un_D\<^sub>0 \<Colon> 'a"} using
1478 Define the datatype, specifying @{text "un_D\<^sub>0"} as the selector's default
1482 Define the behavior of @{text "un_D\<^sub>0"} on values of the newly introduced
1483 datatype using the \keyw{overloading} command.
1486 Derive the desired equation on @{text un_D} from the characteristic equations
1487 for @{text "un_D\<^sub>0"}.
1491 The following example illustrates this procedure:
1497 consts termi\<^sub>0 :: 'a
1499 text {* \blankline *}
1501 datatype_new ('a, 'b) tlist =
1503 | TCons (thd: 'a) (ttl: "('a, 'b) tlist")
1505 "ttl (TNil y) = TNil y"
1506 | "termi (TCons _ xs) = termi\<^sub>0 xs"
1508 text {* \blankline *}
1511 termi\<^sub>0 \<equiv> "termi\<^sub>0 \<Colon> ('a, 'b) tlist \<Rightarrow> 'b"
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"
1518 text {* \blankline *}
1520 lemma termi_TCons[simp]: "termi (TCons x xs) = termi xs"
1524 subsection {* Compatibility Issues
1525 \label{ssec:primrec-compatibility-issues} *}
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:
1534 \setlength{\itemsep}{0pt}
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"}.
1544 section {* Defining Codatatypes
1545 \label{sec:defining-codatatypes} *}
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}.
1557 subsection {* Introductory Examples
1558 \label{ssec:codatatype-introductory-examples} *}
1561 subsubsection {* Simple Corecursion
1562 \label{sssec:codatatype-simple-corecursion} *}
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:
1571 codatatype (lset: 'a) llist =
1573 | LCons (lhd: 'a) (ltl: "'a llist")
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
1587 codatatype (sset: 'a) stream =
1588 SCons (shd: 'a) (stl: "'a stream")
1595 Another interesting type that can
1596 be defined as a codatatype is that of the extended natural numbers:
1599 codatatype enat = EZero | ESuc enat
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>)"}.
1607 Here is an example with many constructors:
1610 codatatype 'a process =
1612 | Skip (cont: "'a process")
1613 | Action (prefix: 'a) (cont: "'a process")
1614 | Choice (left: "'a process") (right: "'a process")
1618 Notice that the @{const cont} selector is associated with both @{const Skip}
1619 and @{const Action}.
1623 subsubsection {* Mutual Corecursion
1624 \label{sssec:codatatype-mutual-corecursion} *}
1628 The example below introduces a pair of \emph{mutually corecursive} types:
1631 codatatype even_enat = Even_EZero | Even_ESuc odd_enat
1632 and odd_enat = Odd_ESuc even_enat
1635 subsubsection {* Nested Corecursion
1636 \label{sssec:codatatype-nested-corecursion} *}
1640 The next examples feature \emph{nested corecursion}:
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")
1645 text {* \blankline *}
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")
1649 text {* \blankline *}
1651 codatatype 'a sm = SM (accept: bool) (trans: "'a \<Rightarrow> 'a sm")
1654 subsection {* Command Syntax
1655 \label{ssec:codatatype-command-syntax} *}
1658 subsubsection {* \keyw{codatatype}
1659 \label{sssec:codatatype} *}
1662 \begin{matharray}{rcl}
1663 @{command_def "codatatype"} & : & @{text "local_theory \<rightarrow> local_theory"}
1667 @@{command codatatype} target? \<newline>
1668 (@{syntax dt_name} '=' (@{syntax dt_ctor} + '|') + @'and')
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
1681 subsection {* Generated Constants
1682 \label{ssec:codatatype-generated-constants} *}
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:
1693 \begin{tabular}{@ {}ll@ {}}
1700 subsection {* Generated Theorems
1701 \label{ssec:codatatype-generated-theorems} *}
1704 The characteristic theorems generated by @{command codatatype} are grouped in
1705 three broad categories:
1708 \setlength{\itemsep}{0pt}
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.
1714 \item The \emph{functorial theorems}
1715 (Section~\ref{sssec:functorial-theorems}) are properties of datatypes related to
1718 \item The \emph{coinductive theorems} (Section~\ref{sssec:coinductive-theorems})
1719 are properties of datatypes related to their coinductive nature.
1723 The first two categories are exactly as for datatypes.
1727 subsubsection {* Coinductive Theorems
1728 \label{sssec:coinductive-theorems} *}
1731 The coinductive theorems are listed below for @{typ "'a llist"}:
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:
1741 @{thm llist.coinduct[no_vars]}
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:
1747 @{thm llist.strong_coinduct[no_vars]}
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:
1754 @{thm llist.rel_coinduct[no_vars]}
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]"} \\
1762 Given $m > 1$ mutually corecursive codatatypes, these coinduction rules can be
1763 used to prove $m$ properties simultaneously.
1765 \item[@{text "t."}\hthm{corec}\rm:] ~ \\
1766 @{thm llist.corec(1)[no_vars]} \\
1767 @{thm llist.corec(2)[no_vars]}
1769 \item[@{text "t."}\hthm{corec\_code} @{text "[code]"}\rm:] ~ \\
1770 @{thm llist.corec_code[no_vars]}
1772 \item[@{text "t."}\hthm{disc\_corec}\rm:] ~ \\
1773 @{thm llist.disc_corec(1)[no_vars]} \\
1774 @{thm llist.disc_corec(2)[no_vars]}
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]}
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]}
1788 For convenience, @{command codatatype} also provides the following collection:
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}
1801 section {* Defining Corecursive Functions
1802 \label{sec:defining-corecursive-functions} *}
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|.
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$:
1817 \setlength{\itemsep}{0pt}
1819 \abovedisplayskip=.5\abovedisplayskip
1820 \belowdisplayskip=.5\belowdisplayskip
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.
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.
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
1839 All three styles are available as input syntax. Whichever syntax is chosen,
1840 characteristic theorems for all three styles are generated.
1842 %%% TODO: partial_function? E.g. for defining tail recursive function on lazy
1843 %%% lists (cf. terminal0 in TLList.thy)
1847 subsection {* Introductory Examples
1848 \label{ssec:primcorec-introductory-examples} *}
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.
1859 subsubsection {* Simple Corecursion
1860 \label{sssec:primcorec-simple-corecursion} *}
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:
1868 primcorec literate :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a llist" where
1869 "literate g x = LCons x (literate g (g x))"
1871 text {* \blankline *}
1873 primcorec siterate :: "('a \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a stream" where
1874 "siterate g x = SCons x (siterate g (g x))"
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
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:
1890 primcorec every_snd :: "'a stream \<Rightarrow> 'a stream" where
1891 "every_snd s = SCons (shd s) (stl (stl s))"
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:
1900 primcorec lappend :: "'a llist \<Rightarrow> 'a llist \<Rightarrow> 'a llist" where
1903 LNil \<Rightarrow> ys
1904 | LCons x xs' \<Rightarrow> LCons x (lappend xs' ys))"
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|.
1913 simps_of_case lappend_simps: lappend.code
1916 This generates the lemma collection @{thm [source] lappend_simps}:
1920 @{thm lappend_simps(1)[no_vars]} \\
1921 @{thm lappend_simps(2)[no_vars]}
1925 Corecursion is useful to specify not only functions but also infinite objects:
1928 primcorec infty :: enat where
1929 "infty = ESuc infty"
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}):
1939 random_process :: "'a stream \<Rightarrow> (int \<Rightarrow> int) \<Rightarrow> int \<Rightarrow> 'a process"
1941 "random_process s f n =
1942 (if n mod 4 = 0 then
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))
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))))"
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.
1960 subsubsection {* Mutual Corecursion
1961 \label{sssec:primcorec-mutual-corecursion} *}
1964 The syntax for mutually corecursive functions over mutually corecursive
1965 datatypes is unsurprising:
1969 even_infty :: even_enat and
1970 odd_infty :: odd_enat
1972 "even_infty = Even_ESuc odd_infty" |
1973 "odd_infty = Odd_ESuc even_infty"
1976 subsubsection {* Nested Corecursion
1977 \label{sssec:primcorec-nested-corecursion} *}
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:
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))"
1990 text {* \blankline *}
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))"
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
2003 This format may sometimes feel artificial. The following function constructs
2004 a tree with a single, infinite branch from a stream:
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))"
2013 A more natural syntax, also supported by Isabelle, is to move corecursive calls
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)"
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:
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)"
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:
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))"
2044 text {* \blankline *}
2046 primcorec empty_sm :: "'a sm" where
2047 "empty_sm = SM False (\<lambda>_. empty_sm)"
2049 text {* \blankline *}
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))"
2054 text {* \blankline *}
2056 primcorec or_sm :: "'a sm \<Rightarrow> 'a sm \<Rightarrow> 'a sm" where
2058 SM (accept M \<or> accept N) (\<lambda>a. or_sm (trans M a) (trans N a))"
2062 For recursion through curried $n$-ary functions, $n$ applications of
2063 @{term "op \<circ>"} are necessary. The examples below illustrate the case where
2067 codatatype ('a, 'b) sm2 =
2068 SM2 (accept2: bool) (trans2: "'a \<Rightarrow> 'b \<Rightarrow> ('a, 'b) sm2")
2070 text {* \blankline *}
2073 (*<*)(in early) (*>*)sm2_of_dfa :: "('q \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> 'q) \<Rightarrow> 'q set \<Rightarrow> 'q \<Rightarrow> ('a, 'b) sm2"
2075 "sm2_of_dfa \<delta> F q = SM2 (q \<in> F) (op \<circ> (op \<circ> (sm2_of_dfa \<delta> F)) (\<delta> q))"
2077 text {* \blankline *}
2080 sm2_of_dfa :: "('q \<Rightarrow> 'a \<Rightarrow> 'b \<Rightarrow> 'q) \<Rightarrow> 'q set \<Rightarrow> 'q \<Rightarrow> ('a, 'b) sm2"
2082 "sm2_of_dfa \<delta> F q = SM2 (q \<in> F) (\<lambda>a b. sm2_of_dfa \<delta> F (\<delta> q a b))"
2085 subsubsection {* Nested-as-Mutual Corecursion
2086 \label{sssec:primcorec-nested-as-mutual-corecursion} *}
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:
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"
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 =
2106 LNil \<Rightarrow> LNil
2107 | LCons x xs' \<Rightarrow> LCons (iterate\<^sub>i\<^sub>i g x) (iterates\<^sub>i\<^sub>i g xs'))"
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.
2125 subsubsection {* Constructor View
2126 \label{ssec:primrec-constructor-view} *}
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.
2139 Here is an example where there is a difference:
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)"
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}.
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}\]
2161 In contrast, the next example is arguably more naturally expressed in the
2166 random_process :: "'a stream \<Rightarrow> (int \<Rightarrow> int) \<Rightarrow> int \<Rightarrow> 'a process"
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))"
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:
2196 subsubsection {* Destructor View
2197 \label{ssec:primrec-destructor-view} *}
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:
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)"
2216 text {* \blankline *}
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)"
2222 text {* \blankline *}
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)"
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.
2237 The next example shows how to specify functions that rely on more than one
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)"
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
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)" |
2264 "_ \<Longrightarrow> \<not> lnull (lappend xs ys)"
2268 to the specification. The generated selector theorems are conditional.
2270 The next example illustrates how to cope with selectors defined for several
2275 random_process :: "'a stream \<Rightarrow> (int \<Rightarrow> int) \<Rightarrow> int \<Rightarrow> 'a process"
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)"
2289 Using the @{text "of"} keyword, different equations are specified for @{const
2290 cont} depending on which constructor is selected.
2292 Here are more examples to conclude:
2296 even_infty :: even_enat and
2297 odd_infty :: odd_enat
2299 "even_infty \<noteq> Even_EZero" |
2300 "un_Even_ESuc even_infty = odd_infty" |
2301 "un_Odd_ESuc odd_infty = even_infty"
2303 text {* \blankline *}
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)"
2313 subsection {* Command Syntax
2314 \label{ssec:primcorec-command-syntax} *}
2317 subsubsection {* \keyw{primcorec} and \keyw{primcorecursive}
2318 \label{sssec:primcorecursive-and-primcorec} *}
2321 \begin{matharray}{rcl}
2322 @{command_def "primcorec"} & : & @{text "local_theory \<rightarrow> local_theory"} \\
2323 @{command_def "primcorecursive"} & : & @{text "local_theory \<rightarrow> proof(prove)"}
2327 (@@{command primcorec} | @@{command primcorecursive}) target? \<newline>
2328 @{syntax pcr_option}? fixes @'where' (@{syntax pcr_formula} + '|')
2330 @{syntax_def pcr_option}: '(' ('sequential' | 'exhaustive') ')'
2332 @{syntax_def pcr_formula}: thmdecl? prop (@'of' (term * ))?
2338 The @{command primcorec} and @{command primcorecursive} commands introduce a set
2339 of mutually corecursive functions over codatatypes.
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}.
2346 The optional target is optionally followed by one or both of the following
2350 \setlength{\itemsep}{0pt}
2353 The @{text "sequential"} option indicates that the conditions in specifications
2354 expressed using the constructor or destructor view are to be interpreted
2358 The @{text "exhaustive"} option indicates that the conditions in specifications
2359 expressed using the constructor or destructor view cover all possible cases.
2362 The @{command primcorec} command is an abbreviation for @{command
2363 primcorecursive} with @{text "by auto?"} to discharge any emerging proof
2366 %%% TODO: elaborate on format of the propositions
2367 %%% TODO: elaborate on mutual and nested-to-mutual
2372 subsection {* Generated Theorems
2373 \label{ssec:primcorec-generated-theorems} *}
2378 subsection {* Recursive Default Values for Selectors
2379 \label{ssec:primcorec-recursive-default-values-for-selectors} *}
2382 partial_function to the rescue
2387 section {* Introducing Bounded Natural Functors
2388 \label{sec:introducing-bounded-natural-functors} *}
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.
2398 subsection {* Bounded Natural Functors
2399 \label{ssec:bounded-natural-functors} *}
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}.
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}.
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.
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.
2427 subsection {* Introductory Examples
2428 \label{ssec:bnf-introductory-examples} *}
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|,
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.
2441 typedef ('d, 'a) fn = "UNIV \<Colon> ('d \<Rightarrow> 'a) set"
2444 text {* \blankline *}
2446 setup_lifting type_definition_fn
2448 text {* \blankline *}
2450 lift_definition map_fn :: "('a \<Rightarrow> 'b) \<Rightarrow> ('d, 'a) fn \<Rightarrow> ('d, 'b) fn" is "op \<circ>" .
2452 text {* \blankline *}
2454 lift_definition set_fn :: "('d, 'a) fn \<Rightarrow> 'a set" is range .
2456 text {* \blankline *}
2459 rel_fn :: "('a \<Rightarrow> 'b \<Rightarrow> bool) \<Rightarrow> ('d, 'a) fn \<Rightarrow> ('d, 'b) fn \<Rightarrow> bool"
2463 text {* \blankline *}
2468 bd: "natLeq +c |UNIV :: 'd set|"
2471 show "map_fn id = id"
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)
2478 assume "\<And>x. x \<in> set_fn F \<Longrightarrow> f x = g x"
2479 thus "map_fn f F = map_fn g F"
2482 fix f show "set_fn \<circ> map_fn f = op ` f \<circ> set_fn"
2483 by transfer (auto simp add: comp_def)
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)
2490 show "cinfinite (natLeq +c |UNIV \<Colon> 'd set| )"
2491 apply (rule cinfinite_csum)
2493 by (rule natLeq_cinfinite)
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|" .
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)
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
2512 unfolding rel_fun_def subset_iff image_iff
2513 by auto (force, metis pair_collapse)
2516 text {* \blankline *}
2523 Using \keyw{print\_theorems} and @{keyword print_bnfs}, we can contemplate and
2524 show the world what we have achieved.
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
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.
2542 bnf_axiomatization (setA: 'a, setB: 'b, setC: 'c) F [wits: "'a \<Rightarrow> ('a, 'b, 'c) F"]
2544 text {* \blankline *}
2550 subsection {* Command Syntax
2551 \label{ssec:bnf-command-syntax} *}
2554 subsubsection {* \keyw{bnf}
2555 \label{sssec:bnf} *}
2558 \begin{matharray}{rcl}
2559 @{command_def "bnf"} & : & @{text "local_theory \<rightarrow> proof(prove)"}
2563 @@{command bnf} target? (name ':')? type \<newline>
2564 'map:' term ('sets:' (term +))? 'bd:' term \<newline>
2565 ('wits:' (term +))? ('rel:' term)?
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.
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}.
2580 %%% TODO: elaborate on proof obligations
2584 subsubsection {* \keyw{bnf\_axiomatization}
2585 \label{sssec:bnf-axiomatization} *}
2588 \begin{matharray}{rcl}
2589 @{command_def "bnf_axiomatization"} & : & @{text "local_theory \<rightarrow> local_theory"}
2593 @@{command bnf_axiomatization} target? @{syntax tyargs}? name @{syntax wit_types}? \<newline>
2594 mixfix? @{syntax map_rel}?
2596 @{syntax_def wit_types}: '[' 'wits' ':' types ']'
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.
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}.
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.
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.
2625 subsubsection {* \keyw{print\_bnfs}
2626 \label{sssec:print-bnfs} *}
2629 \begin{matharray}{rcl}
2630 @{command_def "print_bnfs"} & : & @{text "local_theory \<rightarrow>"}
2634 @@{command print_bnfs}
2639 section {* Deriving Destructors and Theorems for Free Constructors
2640 \label{sec:deriving-destructors-and-theorems-for-free-constructors} *}
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}.
2647 % * need for this is rare but may arise if you want e.g. to add destructors to
2648 % a type not introduced by ...
2650 % * also useful for compatibility with old package, e.g. add destructors to
2651 % old \keyw{datatype}
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)
2662 subsection {* Introductory Example
2663 \label{ssec:ctors-introductory-example} *}
2667 subsection {* Command Syntax
2668 \label{ssec:ctors-command-syntax} *}
2671 subsubsection {* \keyw{free\_constructors}
2672 \label{sssec:free-constructors} *}
2675 \begin{matharray}{rcl}
2676 @{command_def "free_constructors"} & : & @{text "local_theory \<rightarrow> proof(prove)"}
2680 @@{command free_constructors} target? @{syntax dt_options} \<newline>
2681 name 'for' (@{syntax fc_ctor} + '|') \<newline>
2682 (@'where' (prop + '|'))?
2684 @{syntax_def fc_ctor}: (name ':')? term (name * )
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}).
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}.
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.
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
2713 section {* Standard ML Interface
2714 \label{sec:standard-ml-interface} *}
2717 The package's programmatic interface.
2723 section {* Interoperability
2724 \label{sec:interoperability} *}
2727 The package's interaction with other Isabelle packages and tools, such as the
2728 code generator and the counterexample generators.
2732 subsection {* Transfer and Lifting
2733 \label{ssec:transfer-and-lifting} *}
2736 subsection {* Code Generator
2737 \label{ssec:code-generator} *}
2740 subsection {* Quickcheck
2741 \label{ssec:quickcheck} *}
2744 subsection {* Nitpick
2745 \label{ssec:nitpick} *}
2748 subsection {* Nominal Isabelle
2749 \label{ssec:nominal-isabelle} *}
2754 section {* Known Bugs and Limitations
2755 \label{sec:known-bugs-and-limitations} *}
2758 Known open issues of the package.
2762 %* slow n-ary mutual (co)datatype, avoid as much as possible (e.g. using nesting)
2764 %* partial documentation
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)
2769 % * a fortiori, no way to register same type as both data- and codatatype
2771 %* no recursion through unused arguments (unlike with the old package)
2773 %* in a locale, cannot use locally fixed types (because of limitation in typedef)?
2775 % *names of variables suboptimal
2781 \section*{Acknowledgment}
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.