src/HOL/Corec_Examples/Tests/Small_Concrete.thy
author paulson <lp15@cam.ac.uk>
Mon, 23 May 2016 15:33:24 +0100
changeset 63114 27afe7af7379
parent 62733 ebfc41a47641
child 66453 cc19f7ca2ed6
permissions -rw-r--r--
Lots of new material for multivariate analysis
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/Small_Concrete.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
Small concrete 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: 62696
diff changeset
     9
section \<open>Small Concrete 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 Small_Concrete
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    12
imports "~~/src/HOL/Library/BNF_Corec"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    13
begin
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    14
62726
5b2a7caa855b tuned examples
blanchet
parents: 62696
diff changeset
    15
subsection \<open>Streams of Natural Numbers\<close>
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    16
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    17
codatatype natstream = S (head: nat) (tail: natstream)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    18
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    19
corec (friend) incr_all where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    20
  "incr_all s = S (head s + 1) (incr_all (tail s))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    21
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    22
corec all_numbers where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    23
  "all_numbers = S 0 (incr_all all_numbers)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    24
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    25
corec all_numbers_efficient where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    26
  "all_numbers_efficient n = S n (all_numbers_efficient (n + 1))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    27
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    28
corec remove_multiples where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    29
  "remove_multiples n s =
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    30
    (if (head s) mod n = 0 then
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    31
      S (head (tail s)) (remove_multiples n (tail (tail s)))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    32
    else
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    33
      S (head s) (remove_multiples n (tail s)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    34
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    35
corec prime_numbers where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    36
  "prime_numbers known_primes =
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    37
    (let next_prime = head (fold (%n s. remove_multiples n s) known_primes (tail (tail all_numbers))) in
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    38
      S next_prime (prime_numbers (next_prime # known_primes)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    39
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    40
term "prime_numbers []"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    41
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    42
corec prime_numbers_more_efficient where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    43
  "prime_numbers_more_efficient n remaining_numbers =
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    44
    (let remaining_numbers = remove_multiples n remaining_numbers in
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    45
      S (head remaining_numbers) (prime_numbers_more_efficient (head remaining_numbers) remaining_numbers))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    46
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    47
term "prime_numbers_more_efficient 0 (tail (tail all_numbers))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    48
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    49
corec (friend) alternate where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    50
  "alternate s1 s2 = S (head s1) (S (head s2) (alternate (tail s1) (tail s2)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    51
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    52
corec (friend) all_sums where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    53
  "all_sums s1 s2 = S (head s1 + head s2) (alternate (all_sums s1 (tail s2)) (all_sums (tail s1) s2))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    54
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    55
corec app_list where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    56
  "app_list s l = (case l of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    57
    [] \<Rightarrow> s
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    58
  | a # r \<Rightarrow> S a (app_list s r))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    59
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    60
friend_of_corec app_list where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    61
  "app_list s l = (case l of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    62
    [] \<Rightarrow> (case s of S a b \<Rightarrow> S a b)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    63
  | a # r \<Rightarrow> S a (app_list s r))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    64
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    65
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    66
corec expand_with where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    67
  "expand_with f s = (let l = f (head s) in S (hd l) (app_list (expand_with f (tail s)) (tl l)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    68
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    69
friend_of_corec expand_with where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    70
  "expand_with f s = (let l = f (head s) in S (hd l) (app_list (expand_with f (tail s)) (tl l)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    71
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    72
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    73
corec iterations where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    74
  "iterations f a = S a (iterations f (f a))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    75
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    76
corec exponential_iterations where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    77
  "exponential_iterations f a = S (f a) (exponential_iterations (f o f) a)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    78
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    79
corec (friend) alternate_list where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    80
  "alternate_list l = (let heads = (map head l) in S (hd heads) (app_list (alternate_list (map tail l)) (tl heads)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    81
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    82
corec switch_one_two0 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    83
  "switch_one_two0 f a s = (case s of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    84
    S b r \<Rightarrow> S b (S a (f r)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    85
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    86
corec switch_one_two where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    87
  "switch_one_two s = (case s of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    88
    S a (S b r) \<Rightarrow> S b (S a (switch_one_two r)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    89
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    90
corec fibonacci where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    91
  "fibonacci n m = S m (fibonacci (n + m) n)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    92
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    93
corec sequence2 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    94
  "sequence2 f u1 u0 = S u0 (sequence2 f (f u1 u0) u1)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    95
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    96
corec (friend) alternate_with_function where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    97
  "alternate_with_function f s =
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    98
    (let f_head_s = f (head s) in S (head f_head_s) (alternate (tail f_head_s) (alternate_with_function f (tail s))))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    99
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   100
corec h where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   101
  "h l s = (case l of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   102
    [] \<Rightarrow> s
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   103
  | (S a s') # r \<Rightarrow> S a (alternate s (h r s')))"
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 h where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   106
  "h l s = (case l of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   107
    [] \<Rightarrow> (case s of S a b \<Rightarrow> S a b)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   108
  | (S a s') # r \<Rightarrow> S a (alternate s (h r s')))"
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 z where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   112
  "z = S 0 (S 0 z)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   113
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   114
lemma "\<And>x. x = S 0 (S 0 x) \<Longrightarrow> x = z"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   115
  apply corec_unique
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   116
  apply (rule z.code)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   117
  done
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   118
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   119
corec enum where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   120
  "enum m = S m (enum (m + 1))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   121
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   122
lemma "(\<And>m. f m = S m (f (m + 1))) \<Longrightarrow> f m = enum m"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   123
  apply corec_unique
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   124
  apply (rule enum.code)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   125
  done
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   126
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   127
lemma "(\<forall>m. f m = S m (f (m + 1))) \<Longrightarrow> f m = enum m"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   128
  apply corec_unique
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   129
  apply (rule enum.code)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   130
  done
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   131
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   132
62726
5b2a7caa855b tuned examples
blanchet
parents: 62696
diff changeset
   133
subsection \<open>Lazy Lists of Natural Numbers\<close>
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   134
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   135
codatatype llist = LNil | LCons nat llist
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   136
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   137
corec h1 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   138
  "h1 x = (if x = 1 then
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   139
    LNil
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   140
  else
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   141
    let x = if x mod 2 = 0 then x div 2 else 3 * x + 1 in
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   142
    LCons x (h1 x))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   143
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   144
corec h3 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   145
  "h3 s = (case s of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   146
    LNil \<Rightarrow> LNil
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   147
  | LCons x r \<Rightarrow> LCons x (h3 r))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   148
62733
ebfc41a47641 don't ask too much of 'transfer_prover'
blanchet
parents: 62726
diff changeset
   149
corec fold_map where
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   150
  "fold_map f a s = (let v = f a (head s) in S v (fold_map f v (tail s)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   151
62733
ebfc41a47641 don't ask too much of 'transfer_prover'
blanchet
parents: 62726
diff changeset
   152
friend_of_corec fold_map where
ebfc41a47641 don't ask too much of 'transfer_prover'
blanchet
parents: 62726
diff changeset
   153
  "fold_map f a s = (let v = f a (head s) in S v (fold_map f v (tail s)))"
ebfc41a47641 don't ask too much of 'transfer_prover'
blanchet
parents: 62726
diff changeset
   154
   apply (rule fold_map.code)
ebfc41a47641 don't ask too much of 'transfer_prover'
blanchet
parents: 62726
diff changeset
   155
  sorry
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   156
62733
ebfc41a47641 don't ask too much of 'transfer_prover'
blanchet
parents: 62726
diff changeset
   157
ebfc41a47641 don't ask too much of 'transfer_prover'
blanchet
parents: 62726
diff changeset
   158
subsection \<open>Coinductive Natural Numbers\<close>
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   159
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   160
codatatype conat = CoZero | CoSuc conat
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   161
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   162
corec sum where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   163
  "sum x y = (case x of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   164
      CoZero \<Rightarrow> y
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   165
    | CoSuc x \<Rightarrow> CoSuc (sum x y))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   166
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   167
friend_of_corec sum where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   168
  "sum x y = (case x of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   169
      CoZero \<Rightarrow> (case y of CoZero \<Rightarrow> CoZero | CoSuc y \<Rightarrow> CoSuc y)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   170
    | CoSuc x \<Rightarrow> CoSuc (sum x y))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   171
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   172
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   173
corec (friend) prod where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   174
  "prod x y = (case (x, y) of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   175
      (CoZero, _) \<Rightarrow> CoZero
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   176
    | (_, CoZero) \<Rightarrow> CoZero
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   177
    | (CoSuc x, CoSuc y) \<Rightarrow> CoSuc (sum (prod x y) (sum x y)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   178
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   179
end