src/HOL/BNF/Examples/Misc_Primcorec.thy
author blanchet
Wed, 23 Oct 2013 14:53:36 +0200
changeset 54193 bc07627c5dcd
permissions -rw-r--r--
added 'primcorec' examples
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
54193
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
     1
(*  Title:      HOL/BNF/Examples/Misc_Primcorec.thy
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
     2
    Author:     Jasmin Blanchette, TU Muenchen
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
     3
    Copyright   2013
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
     4
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
     5
Miscellaneous primitive corecursive function definitions.
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
     6
*)
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
     7
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
     8
header {* Miscellaneous Primitive Corecursive Function Definitions *}
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
     9
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    10
theory Misc_Primcorec
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    11
imports Misc_Codatatype
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    12
begin
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    13
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    14
primcorec simple_of_bools :: "bool \<Rightarrow> bool \<Rightarrow> simple" where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    15
  "simple_of_bools b b' = (if b then if b' then X1 else X2 else if b' then X3 else X4)"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    16
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    17
primcorec simple'_of_bools :: "bool \<Rightarrow> bool \<Rightarrow> simple'" where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    18
  "simple'_of_bools b b' =
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    19
     (if b then if b' then X1' () else X2' () else if b' then X3' () else X4' ())"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    20
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    21
primcorec inc_simple'' :: "nat \<Rightarrow> simple'' \<Rightarrow> simple''" where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    22
  "inc_simple'' k s = (case s of X1'' n i \<Rightarrow> X1'' (n + k) (i + int k) | X2'' \<Rightarrow> X2'')"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    23
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    24
primcorec sinterleave :: "'a stream \<Rightarrow> 'a stream \<Rightarrow> 'a stream" where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    25
  "sinterleave s s' = Stream (shd s) (sinterleave s' (stl s))"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    26
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    27
primcorec myapp :: "'a mylist \<Rightarrow> 'a mylist \<Rightarrow> 'a mylist" where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    28
  "myapp xs ys =
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    29
     (if xs = MyNil then ys
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    30
      else if ys = MyNil then xs
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    31
      else MyCons (myhd xs) (myapp (mytl xs) ys))"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    32
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    33
primcorec shuffle_sp :: "('a, 'b, 'c, 'd) some_passive \<Rightarrow> ('d, 'a, 'b, 'c) some_passive" where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    34
  "shuffle_sp sp =
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    35
     (case sp of
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    36
       SP1 sp' \<Rightarrow> SP1 (shuffle_sp sp')
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    37
     | SP2 a \<Rightarrow> SP3 a
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    38
     | SP3 b \<Rightarrow> SP4 b
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    39
     | SP4 c \<Rightarrow> SP5 c
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    40
     | SP5 d \<Rightarrow> SP2 d)"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    41
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    42
primcorec rename_lam :: "(string \<Rightarrow> string) \<Rightarrow> lambda \<Rightarrow> lambda" where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    43
  "rename_lam f l =
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    44
     (case l of
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    45
       Var s \<Rightarrow> Var (f s)
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    46
     | App l l' \<Rightarrow> App (rename_lam f l) (rename_lam f l')
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    47
     | Abs s l \<Rightarrow> Abs (f s) (rename_lam f l)
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    48
     | Let SL l \<Rightarrow> Let (fimage (map_pair f (rename_lam f)) SL) (rename_lam f l))"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    49
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    50
primcorec
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    51
  j1_sum :: "('a\<Colon>{zero,one,plus}) \<Rightarrow> 'a J1" and
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    52
  j2_sum :: "'a \<Rightarrow> 'a J2"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    53
where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    54
  "n = 0 \<Longrightarrow> is_J11 (j1_sum n)" |
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    55
  "un_J111 (j1_sum _) = 0" |
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    56
  "un_J112 (j1_sum _) = j1_sum 0" |
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    57
  "un_J121 (j1_sum n) = n + 1" |
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    58
  "un_J122 (j1_sum n) = j2_sum (n + 1)" |
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    59
  "n = 0 \<Longrightarrow> is_J21 (j2_sum n)" |
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    60
  "un_J221 (j2_sum n) = j1_sum (n + 1)" |
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    61
  "un_J222 (j2_sum n) = j2_sum (n + 1)"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    62
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    63
primcorec forest_of_mylist :: "'a tree mylist \<Rightarrow> 'a forest" where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    64
  "forest_of_mylist ts =
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    65
     (case ts of
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    66
       MyNil \<Rightarrow> FNil
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    67
     | MyCons t ts \<Rightarrow> FCons t (forest_of_mylist ts))"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    68
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    69
primcorec mylist_of_forest :: "'a forest \<Rightarrow> 'a tree mylist" where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    70
  "mylist_of_forest f =
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    71
     (case f of
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    72
       FNil \<Rightarrow> MyNil
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    73
     | FCons t ts \<Rightarrow> MyCons t (mylist_of_forest ts))"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    74
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    75
primcorec semi_stream :: "'a stream \<Rightarrow> 'a stream" where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    76
  "semi_stream s = Stream (shd s) (semi_stream (stl (stl s)))"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    77
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    78
primcorec
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    79
  tree'_of_stream :: "'a stream \<Rightarrow> 'a tree'" and
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    80
  branch_of_stream :: "'a stream \<Rightarrow> 'a branch"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    81
where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    82
  "tree'_of_stream s =
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    83
     TNode' (branch_of_stream (semi_stream s)) (branch_of_stream (semi_stream (stl s)))" |
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    84
  "branch_of_stream s = (case s of Stream h t \<Rightarrow> Branch h (tree'_of_stream t))"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    85
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    86
primcorec
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    87
  freeze_exp :: "('b \<Rightarrow> 'a) \<Rightarrow> ('a, 'b) exp \<Rightarrow> ('a, 'b) exp" and
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    88
  freeze_trm :: "('b \<Rightarrow> 'a) \<Rightarrow> ('a, 'b) trm \<Rightarrow> ('a, 'b) trm" and
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    89
  freeze_factor :: "('b \<Rightarrow> 'a) \<Rightarrow> ('a, 'b) factor \<Rightarrow> ('a, 'b) factor"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    90
where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    91
  "freeze_exp g e =
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    92
     (case e of
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    93
       Term t \<Rightarrow> Term (freeze_trm g t)
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    94
     | Sum t e \<Rightarrow> Sum (freeze_trm g t) (freeze_exp g e))" |
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    95
  "freeze_trm g t =
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    96
     (case t of
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    97
       Factor f \<Rightarrow> Factor (freeze_factor g f)
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    98
     | Prod f t \<Rightarrow> Prod (freeze_factor g f) (freeze_trm g t))" |
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
    99
  "freeze_factor g f =
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
   100
     (case f of
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
   101
       C a \<Rightarrow> C a
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
   102
     | V b \<Rightarrow> C (g b)
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
   103
     | Paren e \<Rightarrow> Paren (freeze_exp g e))"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
   104
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
   105
primcorec poly_unity :: "'a poly_unit" where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
   106
  "poly_unity = U (\<lambda>_. poly_unity)"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
   107
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
   108
primcorec build_cps :: "('a \<Rightarrow> 'a) \<Rightarrow> ('a \<Rightarrow> bool stream) \<Rightarrow> 'a \<Rightarrow> bool stream \<Rightarrow> 'a cps" where
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
   109
  "shd b \<Longrightarrow> build_cps f g a b = CPS1 a" |
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
   110
  "_ \<Longrightarrow> build_cps f g a b = CPS2 (\<lambda>a. build_cps f g (f a) (g a))"
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
   111
bc07627c5dcd added 'primcorec' examples
blanchet
parents:
diff changeset
   112
end