src/HOL/Corec_Examples/Paper_Examples.thy
author eberlm
Wed, 25 May 2016 12:24:00 +0200
changeset 63144 76130b7cc450
parent 62734 38fefd98c929
child 63406 32866eff1843
permissions -rw-r--r--
NEWS: Permutations of a set and randomised folds
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62734
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
     1
(*  Title:      HOL/Corec_Examples/Paper_Examples.thy
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
     2
    Author:     Andreas Lochbihler, ETH Zuerich
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
     3
    Author:     Andrei Popescu, TU Muenchen
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
     4
    Copyright   2016
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
     5
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
     6
Small examples from the paper.
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
     7
*)
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
     8
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
     9
section \<open>Small Examples from the Paper\<close>
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    10
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    11
theory Paper_Examples
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    12
imports "~~/src/HOL/Library/BNF_Corec"
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    13
begin
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    14
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    15
subsection \<open>Examples from the introduction\<close>
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    16
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    17
codatatype 'a stream = SCons (hd: 'a) (tl: "'a stream") (infixr "\<lhd>" 65)
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    18
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    19
corec "from" :: "nat \<Rightarrow> nat stream" where
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    20
  "from n = n \<lhd> from (n + 1)"
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    21
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    22
corec (friend) addOne :: "nat stream \<Rightarrow> nat stream" where
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    23
  "addOne n = (hd n + 1) \<lhd> addOne (tl n)"
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    24
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    25
corec from' :: "nat \<Rightarrow> nat stream" where
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    26
  "from' n = n \<lhd> addOne (from' n)"
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    27
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    28
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    29
subsection \<open>Examples from Section 5\<close>
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    30
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    31
text \<open>
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    32
We curry the example functions in this section because infix syntax works only for curried
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    33
functions.
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    34
\<close>
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    35
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    36
corec (friend) Plus :: "nat stream \<Rightarrow> nat stream \<Rightarrow> nat stream" (infix "\<oplus>" 67) where
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    37
  "x\<^sub>1 \<oplus> x\<^sub>2 = (hd x\<^sub>1 + hd x\<^sub>2) \<lhd> (tl x\<^sub>1 \<oplus> tl x\<^sub>2)"
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    38
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    39
corec zeros :: "nat stream" where "zeros = 0 \<lhd> zeros"
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    40
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    41
corec (friend) Plus' :: "nat stream \<Rightarrow> nat stream \<Rightarrow> nat stream" (infix "\<oplus>''" 67) where
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    42
  "x\<^sub>1 \<oplus>' x\<^sub>2 = hd x\<^sub>1 \<lhd> (tl (tl zeros) \<oplus>' x\<^sub>2)"
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    43
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    44
corec (friend) heart :: "nat stream \<Rightarrow> nat stream \<Rightarrow> nat stream" (infix "\<heartsuit>" 67) where
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    45
  "x\<^sub>1 \<heartsuit> x\<^sub>2 = (hd x\<^sub>1 * hd x\<^sub>2) \<lhd> (x\<^sub>2 \<heartsuit> ((x\<^sub>1 \<heartsuit> ((x\<^sub>1 \<heartsuit> tl x\<^sub>2) \<oplus> (tl x\<^sub>1 \<heartsuit> x\<^sub>2)))))"
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    46
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    47
corec spade :: "nat stream \<Rightarrow> nat stream \<Rightarrow> nat stream" (infix "\<spadesuit>" 67) where
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    48
  "x\<^sub>1 \<spadesuit> x\<^sub>2 = (hd x\<^sub>1 \<lhd> (x\<^sub>1 \<spadesuit> x\<^sub>2)) \<oplus> (hd x\<^sub>1 \<lhd> ((x\<^sub>1 \<spadesuit> tl x\<^sub>2) \<oplus> (tl x\<^sub>1 \<spadesuit> x\<^sub>2)))"
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    49
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    50
corec collatz :: "nat \<Rightarrow> nat stream" where
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    51
  "collatz n = (if even n \<and> n > 0 then collatz (n div 2) else n \<lhd> collatz (3 * n + 1))"
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    52
38fefd98c929 another 'corec' example
blanchet
parents:
diff changeset
    53
end