src/HOL/Corec_Examples/Tests/Misc_Poly.thy
author wenzelm
Fri, 18 Aug 2017 20:47:47 +0200
changeset 66453 cc19f7ca2ed6
parent 62726 5b2a7caa855b
permissions -rw-r--r--
session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
     1
(*  Title:      HOL/Corec_Examples/Tests/Misc_Poly.thy
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
     2
    Author:     Aymeric Bouzy, Ecole polytechnique
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
     3
    Author:     Jasmin Blanchette, Inria, LORIA, MPII
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
     4
    Copyright   2015, 2016
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
     5
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
     6
Miscellaneous polymorphic examples.
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
     7
*)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
     8
62726
5b2a7caa855b tuned examples
blanchet
parents: 62698
diff changeset
     9
section \<open>Miscellaneous Polymorphic Examples\<close>
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    10
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    11
theory Misc_Poly
66453
cc19f7ca2ed6 session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
wenzelm
parents: 62726
diff changeset
    12
imports "HOL-Library.BNF_Corec"
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    13
begin
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    14
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    15
codatatype ('a, 'b) T0 =
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    16
  C1 (lab: "'a * 'b") (tl11: "('a, 'b) T0") (tl12: "('a, 'b) T0")
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    17
| C2 (lab: "'a * 'b") (tl2: "('a, 'b) T0")
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    18
| C3 (tl3: "('a, 'b) T0 list")
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    19
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    20
codatatype stream = S (hd: nat) (tl: stream)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    21
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    22
corec test0 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    23
  "test0 x y = (case (x, y) of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    24
  (S a1 s1, S a2 s2) \<Rightarrow> S (a1 + a2) (test0 s1 s2))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    25
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    26
friend_of_corec test0 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    27
  "test0 x y = (case (x, y) of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    28
  (S a1 s1, S a2 s2) \<Rightarrow> S (a1 + a2) (test0 s1 s2))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    29
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    30
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    31
corec test01 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    32
  "test01 x y = C2 (fst (lab x), snd (lab y)) (test01 (tl2 x) (tl2 y))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    33
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    34
friend_of_corec test01 :: "('a, 'b) T0 \<Rightarrow> ('a, 'b) T0 \<Rightarrow> ('a, 'b) T0" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    35
  "test01 x y = C2 (fst (lab x), snd (lab y)) (test01 (tl2 x) (tl2 y))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    36
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    37
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    38
corec test02 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    39
  "test02 x y = C2 (fst (lab x), snd (lab y)) (test01 (test02 x (tl2 y)) (test02 (tl2 x) y))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    40
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    41
friend_of_corec test02 :: "('a, 'b) T0 \<Rightarrow> ('a, 'b) T0 \<Rightarrow> ('a, 'b) T0"  where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    42
  "test02 x y = C2 (fst (lab x), snd (lab y)) (test01 (test02 x (tl2 y)) (test02 (tl2 x) y))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    43
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    44
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    45
corec test03 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    46
  "test03 x = C2 (lab x) (C2 (lab x) (test02 x x))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    47
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    48
friend_of_corec test03 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    49
  "test03 x = C2 (lab x) (C2 (lab x) (test02 (test03 (tl2 x)) (test03 (tl2 x))))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    50
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    51
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    52
corec test04 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    53
  "test04 x = (case x of C1 a t1 t2 \<Rightarrow> C1 a (test04 t1) (test04 t2) | C2 a t \<Rightarrow> C2 a (test04 t) | C3 l \<Rightarrow> C3 l)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    54
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    55
friend_of_corec test04 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    56
  "test04 x = (case x of C1 a t1 t2 \<Rightarrow> C1 a (test04 t1) (test04 t2) | C2 a t \<Rightarrow> C2 a (test04 t) | C3 l \<Rightarrow> C3 l)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    57
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    58
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    59
corec test05 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    60
  "test05 x y = (case (x, y) of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    61
  (C1 a t11 t12, C1 b t21 t22) \<Rightarrow> C1 (fst a, snd b) (test05 t11 t21) (test05 t12 t22)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    62
| (C1 a t11 _, C2 b t2) \<Rightarrow> C2 (fst a, snd b) (test05 t11 t2)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    63
| (C2 a t1, C1 b _ t22) \<Rightarrow> C2 (fst a, snd b) (test05 t1 t22)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    64
| (C2 a t1, C2 b t2) \<Rightarrow> C2 (fst a, snd b) (test05 t1 t2)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    65
| (_, _) \<Rightarrow> C3 [])"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    66
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    67
friend_of_corec test05 :: "('a, 'b) T0 \<Rightarrow> ('a, 'b) T0 \<Rightarrow> ('a, 'b) T0" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    68
  "test05 x y = (case (x, y) of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    69
  (C1 a t11 t12, C1 b t21 t22) \<Rightarrow> C1 (fst a, snd b) (test05 t11 t21) (test05 t12 t22)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    70
| (C1 a t11 _, C2 b t2) \<Rightarrow> C2 (fst a, snd b) (test05 t11 t2)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    71
| (C2 a t1, C1 b _ t22) \<Rightarrow> C2 (fst a, snd b) (test05 t1 t22)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    72
| (C2 a t1, C2 b t2) \<Rightarrow> C2 (fst a, snd b) (test05 t1 t2)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    73
| (_, _) \<Rightarrow> C3 [])"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    74
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    75
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    76
corec test06 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    77
  "test06 x =
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    78
  (if \<not> is_C1 x then
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    79
    let tail = tl2 x in
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    80
    C1 (lab x) (test06 tail) tail
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    81
  else
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    82
    C2 (lab x) (test06 (tl12 x)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    83
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    84
friend_of_corec test06 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    85
  "test06 x =
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    86
  (if \<not> is_C1 x then
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    87
    let tail = tl2 x in
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    88
    C1 (lab x) (test06 tail) tail
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    89
  else
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    90
    C2 (lab x) (test06 (tl12 x)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    91
    sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    92
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    93
corec test07 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    94
  "test07 xs = C3 (map (\<lambda>x. test07 (tl3 x)) xs)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    95
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    96
friend_of_corec test07 :: "('a, 'b) T0 list \<Rightarrow> ('a, 'b) T0" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    97
  "test07 xs = C3 (map (\<lambda>x. test07 (tl3 x)) xs)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    98
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    99
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   100
corec test08 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   101
  "test08 xs = (case xs of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   102
    [] \<Rightarrow> C3 []
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   103
  | T # r \<Rightarrow> C1 (lab T) (test08 r) T)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   104
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   105
friend_of_corec test08 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   106
  "test08 xs = (case xs of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   107
    [] \<Rightarrow> C3 []
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   108
  | T # r \<Rightarrow> C1 (lab T) (test08 r) T)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   109
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   110
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   111
corec test09 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   112
  "test09 xs = (case xs of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   113
    [] \<Rightarrow> C3 []
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   114
  | (C1 n T1 T2) # r \<Rightarrow> C1 n (test09 (T1 # r)) (test09 (T2 # r))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   115
  | _ # r \<Rightarrow> C3 [test09 r])"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   116
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   117
friend_of_corec test09 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   118
  "test09 xs = (case xs of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   119
    [] \<Rightarrow> C3 []
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   120
  | (C1 n T1 T2) # r \<Rightarrow> C1 n (test09 (T1 # r)) (test09 (T2 # r))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   121
  | _ # r \<Rightarrow> C3 [test09 r])"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   122
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   123
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   124
codatatype 'h tree =
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   125
  Node (node: 'h) (branches: "'h tree list")
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   126
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   127
consts integerize_list :: "'a list \<Rightarrow> int"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   128
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   129
corec f10 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   130
  "f10 x y = Node
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   131
  (integerize_list (branches x) + integerize_list (branches y))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   132
  (map (\<lambda>(x, y). f10 x y) (zip (branches x) (branches y)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   133
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   134
friend_of_corec f10 :: "int tree \<Rightarrow> int tree \<Rightarrow> int tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   135
  "f10 x y = Node
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   136
  (integerize_list (branches x) + integerize_list (branches y))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   137
  (map (\<lambda>(x, y). f10 x y) (zip (branches x) (branches y)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   138
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   139
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   140
codatatype llist =
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   141
  Nil | LCons llist
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   142
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   143
consts friend :: "llist \<Rightarrow> llist"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   144
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   145
friend_of_corec friend where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   146
  "friend x = Nil"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   147
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   148
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   149
corec f11 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   150
  "f11 x = (case friend x of Nil \<Rightarrow> Nil | LCons y \<Rightarrow> LCons (f11 y))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   151
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   152
corec f12 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   153
  "f12 t = Node (node t) (map f12 (branches t))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   154
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   155
friend_of_corec f12 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   156
  "f12 t = Node (node t) (map f12 (branches t))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   157
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   158
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   159
corec f13 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   160
  "f13 n ts = Node n (map (%t. f13 (node t) (branches t)) ts)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   161
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   162
friend_of_corec f13 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   163
  "f13 n ts = Node n (map (%t. f13 (node t) (branches t)) ts)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   164
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   165
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   166
corec f14 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   167
  "f14 t_opt = Node undefined
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   168
    (case map_option branches t_opt of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   169
      None \<Rightarrow> []
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   170
    | Some ts \<Rightarrow> map (f14 o Some) ts)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   171
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   172
friend_of_corec f14 :: "'a tree option \<Rightarrow> 'a tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   173
  "f14 t_opt = Node undefined
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   174
    (case map_option branches t_opt of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   175
      None \<Rightarrow> []
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   176
    | Some ts \<Rightarrow> map (f14 o Some) ts)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   177
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   178
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   179
corec f15 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   180
  "f15 ts_opt = Node undefined
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   181
    (case map_option (map branches) ts_opt of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   182
      None \<Rightarrow> []
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   183
    | Some tss \<Rightarrow> map (f15 o Some) tss)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   184
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   185
friend_of_corec f15 :: "'a tree list option \<Rightarrow> 'a tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   186
  "f15 ts_opt = Node undefined
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   187
    (case map_option (map branches) ts_opt of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   188
      None \<Rightarrow> []
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   189
    | Some tss \<Rightarrow> map (f15 o Some) tss)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   190
    sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   191
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   192
corec f16 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   193
  "f16 ts_opt = Node undefined
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   194
    (case ts_opt of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   195
      None \<Rightarrow> []
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   196
    | Some ts \<Rightarrow> map (f16 o Some o branches) ts)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   197
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   198
friend_of_corec f16 :: "'a tree list option \<Rightarrow> 'a tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   199
  "f16 ts_opt = Node undefined
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   200
    (case ts_opt of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   201
      None \<Rightarrow> []
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   202
    | Some ts \<Rightarrow> map (f16 o Some o branches) ts)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   203
    sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   204
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   205
corec f18 :: "'a tree \<Rightarrow> 'a tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   206
  "f18 t = Node (node t) (map (f18 o f12) (branches t))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   207
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   208
friend_of_corec f18 :: "'z tree \<Rightarrow> 'z tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   209
  "f18 t = Node (node t) (map (f18 o f12) (branches t))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   210
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   211
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   212
corec f19 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   213
  "f19 t = Node (node t) (map (%f. f [t]) (map f13 [undefined]))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   214
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   215
friend_of_corec f19 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   216
  "f19 t = Node (node t) (map (%f. f [t]) (map f13 [undefined]))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   217
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   218
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   219
datatype ('a, 'b, 'c) h = H1 (h_a: 'a) (h_tail: "('a, 'b, 'c) h") | H2 (h_b: 'b) (h_c: 'c) (h_tail: "('a, 'b, 'c) h") | H3
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   220
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   221
term "map_h (map_option f12) (%n. n) f12"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   222
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   223
corec f20 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   224
  "f20 x y = Node (node y) (case (map_h (map_option f12) (%n. n) f12 x) of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   225
    H1 None r \<Rightarrow> (f20 r y) # (branches y)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   226
  | H1 (Some t) r \<Rightarrow> (f20 r t) # (branches y)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   227
  | H2 n t r \<Rightarrow> (f20 r (Node n [])) # (branches y)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   228
  | H3 \<Rightarrow> branches y)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   229
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   230
friend_of_corec f20 :: "('a tree option, 'a, 'a tree) h \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   231
  "f20 x y = Node (node y) (case (map_h (map_option f12) (%n. n) f12 x) of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   232
    H1 None r \<Rightarrow> (f20 r y) # (branches y)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   233
  | H1 (Some t) r \<Rightarrow> (f20 r t) # (branches y)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   234
  | H2 n t r \<Rightarrow> (f20 r (Node n [])) # (branches y)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   235
  | H3 \<Rightarrow> branches y)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   236
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   237
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   238
corec f21 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   239
  "f21 x xh =
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   240
  Node (node x) (case xh of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   241
    H1 (Some a) yh \<Rightarrow> (f21 x (map_h (map_option (f20 yh)) id id yh)) # (branches a)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   242
  | H1 None yh \<Rightarrow> [f21 x yh]
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   243
  | H2 b c yh \<Rightarrow> (f21 c (map_h id (%n. n + b) id yh)) # (branches x)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   244
  | H3 \<Rightarrow> branches x)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   245
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   246
friend_of_corec f21 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   247
  "f21 x xh =
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   248
  Node (node x) (case xh of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   249
    H1 (Some a) yh \<Rightarrow> (f21 x (map_h (map_option (f20 yh)) (%t. t) (%t. t) yh)) # (branches a)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   250
  | H1 None yh \<Rightarrow> [f21 x yh]
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   251
  | H2 b c yh \<Rightarrow> (f21 c (map_h (%t. t) (%n. n + b) (%t. t) yh)) # (branches x)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   252
  | H3 \<Rightarrow> branches x)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   253
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   254
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   255
corec f22 :: "('a \<Rightarrow> 'h tree) \<Rightarrow> 'a list \<Rightarrow> 'h tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   256
  "f22 f x = Node undefined (map f x)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   257
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   258
friend_of_corec f22 :: "('h \<Rightarrow> 'h tree) \<Rightarrow> 'h list \<Rightarrow> 'h tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   259
  "f22 f x = Node undefined (map f x)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   260
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   261
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   262
corec f23 where
62698
9d706e37ddab tuned whitespace
blanchet
parents: 62696
diff changeset
   263
  "f23 xh = Node undefined
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   264
    (if is_H1 xh then
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   265
      (f23 (h_tail xh)) # (branches (h_a xh))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   266
    else if is_H1 xh then
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   267
      (f23 (h_tail xh)) # (h_c xh) # (branches (h_b xh))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   268
    else
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   269
      [])"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   270
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   271
friend_of_corec f23 where
62698
9d706e37ddab tuned whitespace
blanchet
parents: 62696
diff changeset
   272
  "f23 xh = Node undefined
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   273
    (if is_H1 xh then
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   274
      (f23 (h_tail xh)) # (branches (h_a xh))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   275
    else if is_H1 xh then
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   276
      (f23 (h_tail xh)) # (h_c xh) # (branches (h_b xh))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   277
    else
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   278
      [])"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   279
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   280
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   281
corec f24 where
62698
9d706e37ddab tuned whitespace
blanchet
parents: 62696
diff changeset
   282
  "f24 xh =
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   283
    (if is_H1 xh then
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   284
      Node 0 ((f24 (h_tail xh)) # (h_a xh 0))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   285
    else if is_H2 xh then
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   286
      Node (h_b xh) ((f24 (h_tail xh)) # (h_c xh 0))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   287
    else
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   288
      Node 0 [])"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   289
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   290
friend_of_corec f24 :: "(('b :: {zero}) \<Rightarrow> 'b tree list, 'b, 'b \<Rightarrow> 'b tree list) h \<Rightarrow> 'b tree" where
62698
9d706e37ddab tuned whitespace
blanchet
parents: 62696
diff changeset
   291
  "f24 xh =
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   292
    (if is_H1 xh then
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   293
      Node 0 ((f24 (h_tail xh)) # (h_a xh 0))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   294
    else if is_H2 xh then
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   295
      Node (h_b xh) ((f24 (h_tail xh)) # (h_c xh 0))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   296
    else
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   297
      Node 0 [])"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   298
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   299
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   300
codatatype ('a, 'b, 'c) s =
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   301
  S (s1: 'a) (s2: 'b) (s3: 'c) (s4: "('a, 'b, 'c) s")
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   302
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   303
corec (friend) ga :: "('a, 'b, nat) s \<Rightarrow> _" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   304
  "ga s = S (s1 s) (s2 s) (s3 s) (s4 s)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   305
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   306
corec (friend) gb :: "('a, nat, 'b) s \<Rightarrow> _" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   307
  "gb s = S (s1 s) (s2 s) (s3 s) (s4 s)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   308
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   309
consts foo :: "('b \<Rightarrow> 'b) \<Rightarrow> 'a \<Rightarrow> 'a"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   310
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   311
corecursive (friend) gc :: "(nat, 'a, 'b) s \<Rightarrow> _" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   312
  "gc s = S (s1 s) (s2 s) (s3 s) (foo (undefined :: 'a \<Rightarrow> 'a) s)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   313
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   314
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   315
end