src/Doc/Corec/Corec.thy
author blanchet
Tue, 29 Mar 2016 17:42:43 +0200
changeset 62742 bfb5a70e4319
parent 62739 628c97d39627
child 62745 257a022f7e7b
permissions -rw-r--r--
more 'corec' documentation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
     1
(*  Title:      Doc/Corec/Corec.thy
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
     2
    Author:     Jasmin Blanchette, Inria, LORIA, MPII
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
     3
    Author:     Aymeric Bouzy, Ecole polytechnique
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
     4
    Author:     Andreas Lochbihler, ETH Zuerich
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
     5
    Author:     Andrei Popescu, Middlesex University
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
     6
    Author:     Dmitriy Traytel, ETH Zuerich
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
     7
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
     8
Tutorial for nonprimitively corecursive definitions.
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
     9
*)
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    10
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    11
theory Corec
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    12
imports
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    13
  GCD
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    14
  "../Datatypes/Setup"
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    15
  "~~/src/HOL/Library/BNF_Corec"
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    16
  "~~/src/HOL/Library/FSet"
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    17
begin
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    18
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    19
section \<open>Introduction
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    20
  \label{sec:introduction}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    21
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    22
text \<open>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    23
...
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    24
\cite{isabelle-datatypes}
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    25
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    26
* friend
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    27
* up to
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    28
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    29
BNF
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    30
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    31
link to papers
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    32
\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    33
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    34
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    35
section \<open>Introductory Examples
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    36
  \label{sec:introductory-examples}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    37
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    38
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    39
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    40
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    41
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    42
subsection \<open>Simple Corecursion
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    43
  \label{ssec:simple-corecursion}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
    44
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    45
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    46
The case studies by Rutten~\cite{rutten05} and Hinze~\cite{hinze10} on stream
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    47
calculi serve as our starting point. Streams can be defined as follows
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    48
(cf. @{file "~~/src/HOL/Library/Stream.thy"}):
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    49
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    50
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    51
    codatatype (sset: 'a) stream =
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    52
      SCons (shd: 'a) (stl: "'a stream")
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    53
    for
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    54
      map: smap
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    55
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    56
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    57
The @{command corec} command makes it possible to define functions where the
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    58
corecursive call occurs under two or more constructors:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    59
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    60
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    61
    corec oneTwos :: "nat stream" where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    62
      "oneTwos = SCons 1 (SCons 2 oneTwos)"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    63
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    64
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    65
\noindent
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    66
This is already beyond the syntactic fragment supported by \keyw{primcorec}.
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    67
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    68
The following definition of pointwise sum can be performed with either
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    69
\keyw{primcorec} or @{command corec}:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    70
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    71
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    72
    primcorec ssum :: "('a :: plus) stream \<Rightarrow> 'a stream \<Rightarrow> 'a stream" where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    73
      "ssum xs ys = SCons (shd xs + shd ys) (ssum (stl xs) (stl ys))"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    74
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    75
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    76
\noindent
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    77
Pointwise sum meets the friendliness criterion. We register it as a friend using
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    78
the @{command friend_of_corec} command. The command requires us to give a
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    79
specification of @{const ssum} where a constructor (@{const SCons}) occurs at
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    80
the outermost position on the right-hand side. Here, we can simply reuse the
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    81
\keyw{primcorec} specification above:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    82
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    83
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    84
    friend_of_corec ssum :: "('a :: plus) stream \<Rightarrow> 'a stream \<Rightarrow> 'a stream" where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    85
      "ssum xs ys = SCons (shd xs + shd ys) (ssum (stl xs) (stl ys))"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    86
       apply (rule ssum.code)
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    87
      by transfer_prover
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    88
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    89
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    90
\noindent
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    91
The command emits two proof goals. The first one corresponds to the equation we
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    92
specified and is trivial to discharge. The second one is a parametricity goal
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    93
and can usually be discharged using the @{text transfer_prover} proof method.
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    94
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    95
After registering @{const ssum} as a friend, we can use it in the corecursive
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    96
call context, either inside or outside the constructor guard:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    97
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    98
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
    99
    corec fibA :: "nat stream" where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   100
      "fibA = SCons 0 (ssum (SCons 1 fibA) fibA)"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   101
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   102
text \<open>\blankline\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   103
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   104
    corec fibB :: "nat stream" where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   105
      "fibB = ssum (SCons 0 (SCons 1 fibB)) (SCons 0 fibB)"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   106
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   107
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   108
Using the @{text "friend"} option, we can simultaneously define a function and
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   109
register it as a friend:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   110
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   111
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   112
    corec (friend)
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   113
      sprod :: "('a :: {plus,times}) stream \<Rightarrow> 'a stream \<Rightarrow> 'a stream"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   114
    where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   115
      "sprod xs ys =
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   116
       SCons (shd xs * shd ys) (ssum (sprod xs (stl ys)) (sprod (stl xs) ys))"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   117
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   118
text \<open>\blankline\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   119
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   120
    corec (friend) sexp :: "nat stream \<Rightarrow> nat stream" where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   121
      "sexp xs = SCons (2 ^^ shd xs) (sprod (stl xs) (sexp xs))"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   122
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   123
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   124
\noindent
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   125
The parametricity proof goal is given to @{text transfer_prover}.
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   126
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   127
The @{const sprod} and @{const sexp} functions provide shuffle product and
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   128
exponentiation on streams. We can use them to define the stream of factorial
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   129
numbers in two different ways:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   130
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   131
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   132
    corec factA :: "nat stream" where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   133
      "factA = (let zs = SCons 1 factA in sprod zs zs)"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   134
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   135
    corec factB :: "nat stream" where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   136
      "factB = sexp (SCons 0 factB)"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   137
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   138
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   139
The arguments of friendly operations can be of complex types involving the
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   140
target codatatype. The following example defines the supremum of a finite set of
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   141
streams by primitive corecursion and registers it as friendly:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   142
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   143
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   144
    corec (friend) sfsup :: "nat stream fset \<Rightarrow> nat stream" where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   145
      "sfsup X = SCons (Sup (fset (fimage shd X))) (sfsup (fimage stl X))"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   146
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   147
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   148
\noindent
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   149
In general, the arguments may be any BNF, with the restriction that the target
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   150
codatatype (@{typ "nat stream"}) may occur only in a live position of the BNF.
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   151
For this reason, the following operation, on unbounded sets, cannot be
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   152
registered as a friend:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   153
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   154
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   155
    corec ssup :: "nat stream set \<Rightarrow> nat stream" where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   156
      "ssup X = SCons (Sup (image shd X)) (ssup (image stl X))"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   157
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   158
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   159
subsection \<open>Nested Corecursion
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   160
  \label{ssec:nested-corecursion}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   161
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   162
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   163
The package generally supports arbitrary codatatypes with multiple constructors
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   164
and nesting through other type constructors (BNFs). Consider the following type
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   165
of finitely branching Rose trees of potentially infinite depth:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   166
\<close>
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   167
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   168
    codatatype 'a tree =
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   169
      Node (lab: 'a) (sub: "'a tree list")
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   170
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   171
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   172
We first define the pointwise sum of two trees analogously to @{const ssum}:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   173
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   174
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   175
    corec (friend) tplus :: "('a :: plus) tree \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   176
      "tplus t u =
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   177
       Node (lab t + lab u) (map (\<lambda>(t', u'). tplus t' u') (zip (sub t) (sub u)))"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   178
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   179
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   180
\noindent
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   181
Here, @{const map} is the standard map function on lists, and @{const zip}
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   182
converts two parallel lists into a list of pairs. The @{const tplus} function is
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   183
primitively corecursive. Instead of @{text "corec (friend)"}, we could also have
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   184
used \keyw{primcorec} and @{command friend_of_corec}, as we did for
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   185
@{const ssum}.
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   186
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   187
Once @{const tplus} is registered as friendly, we can use it in the corecursive
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   188
call context:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   189
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   190
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   191
    corec (friend) ttimes :: "('a :: {plus,times}) tree \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   192
      "ttimes t u = Node (lab t * lab u)
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   193
         (map (\<lambda>(t', u'). tplus (ttimes t u') (ttimes t' u)) (zip (sub t) (sub u)))"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   194
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   195
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   196
subsection \<open>Mixed Recursion--Corecursion
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   197
  \label{ssec:mixed-recursion-corecursion}\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   198
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   199
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   200
It is often convenient to let a corecursive function perform some finite
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   201
computation before producing a constructor. With mixed recursion--corecursion, a
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   202
finite number of unguarded recursive calls perform this calculation before
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   203
reaching a guarded corecursive call.
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   204
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   205
Intuitively, the unguarded recursive call can be unfolded to arbitrary finite
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   206
depth, ultimately yielding a purely corecursive definition. An example is the
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   207
@{term primes} function from Di Gianantonio and Miculan
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   208
\cite{di-gianantonio-miculan-2003}:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   209
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   210
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   211
    corecursive primes :: "nat \<Rightarrow> nat \<Rightarrow> nat stream" where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   212
      "primes m n =
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   213
       (if (m = 0 \<and> n > 1) \<or> coprime m n then
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   214
          SCons n (primes (m * n) (n + 1))
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   215
        else
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   216
          primes m (n + 1))"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   217
      apply (relation "measure (\<lambda>(m, n).
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   218
        if n = 0 then 1 else if coprime m n then 0 else m - n mod m)")
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   219
       apply (auto simp: mod_Suc intro: Suc_lessI)
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   220
       apply (metis One_nat_def coprime_Suc_nat gcd.commute gcd_red_nat)
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   221
      by (metis diff_less_mono2 lessI mod_less_divisor)
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   222
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   223
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   224
\noindent
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   225
The @{command corecursive} command is a variant of @{command corec} that allows
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   226
us to specify a termination argument for any unguarded self-call.
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   227
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   228
When called with @{term "m = 1"} and @{term "n = 2"}, the @{const primes}
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   229
function computes the stream of prime numbers. The unguarded call in the
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   230
@{text else} branch increments @{term n} until it is coprime to the first
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   231
argument @{term m} (i.e., the greatest common divisor of @{term m} and
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   232
@{term n} is @{term 1}).
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   233
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   234
For any positive integers @{term m} and @{term n}, the numbers @{term m} and
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   235
@{term "m * n + 1"} are coprime, yielding an upper bound on the number of times
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   236
@{term n} is increased. Hence, the function will take the @{text else} branch at
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   237
most finitely often before taking the then branch and producing one constructor.
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   238
There is a slight complication when @{term "m = 0 \<and> n > 1"}: Without the first
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   239
disjunct in the @{text "if"} condition, the function could stall. (This corner
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   240
case was overlooked in the original example \cite{di-gianantonio-miculan-2003}.)
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   241
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   242
In the following example, which defines the stream of Catalan numbers,
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   243
termination is discharged automatically using @{text lexicographic_order}:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   244
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   245
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   246
    corec catalan :: "nat \<Rightarrow> nat stream" where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   247
      "catalan n =
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   248
       (if n > 0 then ssum (catalan (n - 1)) (SCons 0 (catalan (n + 1)))
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   249
        else SCons 1 (catalan 1))"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   250
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   251
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   252
A more elaborate case study, revolving around the filter function on lazy lists,
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   253
is presented in @{file "~~/src/HOL/Corec_Examples/LFilter.thy"}.
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   254
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   255
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   256
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   257
subsection \<open>Self-Friendship
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   258
  \label{ssec:self-friendship}\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   259
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   260
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   261
Paradoxically, the package allows us to simultaneously define a function and use
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   262
it as its own friend, as in the following definition of a ``skewed product'':
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   263
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   264
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   265
    corec (friend)
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   266
      sskew :: "('a :: {plus,times}) stream \<Rightarrow> 'a stream \<Rightarrow> 'a stream"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   267
    where
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   268
      "sskew xs ys =
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   269
       SCons (shd xs * shd ys) (sskew (sskew xs (stl ys)) (sskew (stl xs) ys))"
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   270
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   271
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   272
\noindent
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   273
Such definitions, with nested self-calls on the right-hand side, cannot be
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   274
separated into a @{command corec} part and a @{command friend_of_corec} part.
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   275
\<close>
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   276
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   277
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   278
subsection \<open>Coinduction
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   279
  \label{ssec:coinduction}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   280
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   281
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   282
Once a corecursive specification has been accepted, we normally want to reason
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   283
about it. The @{text codatatype} command generates a structural coinduction
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   284
principle that matches primitively corecursive functions. For nonprimitive
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   285
specifications, our package provides the more advanced proof principle of
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   286
\emph{coinduction up to congruence}---or simply \emph{coinduction up-to}.
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   287
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   288
The structural coinduction principle for @{typ "'a stream"}, called
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   289
@{thm [source] stream.coinduct}, is as follows:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   290
%
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   291
\[@{thm stream.coinduct[no_vars]}\]
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   292
%
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   293
Coinduction allows us to prove an equality @{text "l = r"} on streams by
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   294
providing a relation @{text R} that relates @{text l} and @{text r} (first
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   295
premise) and that constitutes a bisimulation (second premise). Streams that are
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   296
related by a bisimulation cannot be distinguished by taking observations (via
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   297
the selectors @{const shd} and @{const stl}); hence they must be equal.
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   298
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   299
The coinduction up-to principle after registering @{const sskew} as friendly is
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   300
available as @{thm [source] sskew.coinduct} or
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   301
@{thm [source] stream.coinduct_upto(2)}:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   302
%
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   303
\[@{thm sfsup.coinduct[no_vars]}\]
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   304
%
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   305
This rule is almost identical to structural coinduction, except that the
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   306
corecursive application of @{term R} is replaced by
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   307
@{term "stream.v5.congclp R"}. The @{const stream.v5.congclp} predicate is
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   308
equipped with the following introduction rules:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   309
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   310
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   311
(* FIXME:
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   312
thm
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   313
  sskew.cong_base
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   314
  sskew.cong_refl
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   315
  sskew.cong_intros
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   316
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   317
thm stream.coinduct_upto(2)
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   318
  sskew.coinduct
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   319
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   320
thm stream.cong_intros
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   321
thm sfsup.cong_intros
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   322
*)
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   323
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   324
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   325
subsection \<open>Uniqueness Reasoning
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   326
  \label{ssec:uniqueness-reasoning}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   327
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   328
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   329
...
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   330
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   331
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   332
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   333
section \<open>Command Syntax
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   334
  \label{sec:command-syntax}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   335
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   336
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   337
...
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   338
\<close>
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   339
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   340
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   341
subsection \<open>\keyw{corec} and \keyw{corecursive}
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   342
  \label{ssec:corec-and-corecursive}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   343
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   344
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   345
...
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   346
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   347
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   348
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   349
subsection \<open>\keyw{friend_of_corec}
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   350
  \label{ssec:friend-of-corec}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   351
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   352
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   353
...
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   354
\<close>
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   355
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   356
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   357
subsection \<open>\keyw{coinduction_upto}
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   358
  \label{ssec:coinduction-upto}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   359
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   360
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   361
...
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   362
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   363
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   364
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   365
section \<open>Generated Theorems
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   366
  \label{sec:generated-theorems}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   367
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   368
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   369
...
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   370
\<close>
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   371
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   372
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   373
subsection \<open>\keyw{corec} and \keyw{corecursive}
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   374
  \label{ssec:corec-and-corecursive}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   375
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   376
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   377
...
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   378
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   379
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   380
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   381
subsection \<open>\keyw{friend_of_corec}
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   382
  \label{ssec:friend-of-corec}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   383
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   384
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   385
...
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   386
\<close>
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   387
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   388
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   389
subsection \<open>\keyw{coinduction_upto}
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   390
  \label{ssec:coinduction-upto}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   391
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   392
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   393
...
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   394
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   395
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   396
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   397
section \<open>Proof Method
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   398
  \label{sec:proof-method}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   399
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   400
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   401
...
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   402
\<close>
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   403
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   404
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   405
subsection \<open>\textit{corec_unique}
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   406
  \label{ssec:corec-unique}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   407
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   408
text \<open>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   409
...
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   410
\<close>
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   411
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   412
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   413
section \<open>Known Bugs and Limitations
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   414
  \label{sec:known-bugs-and-limitations}\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   415
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   416
text \<open>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   417
This section lists the known bugs and limitations of the corecursion package at
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   418
the time of this writing.
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   419
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   420
\begin{enumerate}
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   421
\setlength{\itemsep}{0pt}
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   422
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   423
\item
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   424
\emph{TODO.} TODO.
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   425
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   426
  * no mutual types
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   427
  * limitation on type of friend
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   428
  * unfinished tactics
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   429
  * polymorphism of corecUU_transfer
62742
bfb5a70e4319 more 'corec' documentation
blanchet
parents: 62739
diff changeset
   430
  * alternative views
62739
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   431
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   432
\end{enumerate}
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   433
\<close>
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   434
628c97d39627 added sketchy 'corec' documentation
blanchet
parents:
diff changeset
   435
end