src/HOL/Corec_Examples/Tests/Simple_Nesting.thy
author blanchet
Mon, 28 Mar 2016 12:05:47 +0200
changeset 62726 5b2a7caa855b
parent 62696 7325d8573fb8
child 66453 cc19f7ca2ed6
permissions -rw-r--r--
tuned examples
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/Simple_Nesting.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
Tests "corec"'s parsing of map functions.
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>Tests "corec"'s Parsing of Map Functions\<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 Simple_Nesting
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>Corecursion via Map Functions\<close>
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    16
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    17
consts
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    18
  g :: 'a
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    19
  g' :: 'a
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    20
  g'' :: 'a
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    21
  h :: 'a
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    22
  h' :: 'a
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    23
  q :: 'a
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    24
  q' :: 'a
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    25
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    26
codatatype tree =
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    27
  Node nat "tree list"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    28
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    29
(* a direct, intuitive way to define a function *)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    30
corec k0 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    31
  "k0 x = Node (g x) (map (\<lambda>y. if q y then g' y else k0 (h' y :: 'a)) (h (x :: 'a) :: nat list))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    32
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    33
(* another way -- this one is perhaps less intuitive but more systematic *)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    34
corec k0' where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    35
  "k0' x = Node (g x) (map (\<lambda>z. case z of Inl t \<Rightarrow> t | Inr (x' :: 'a) \<Rightarrow> k0' x')
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    36
     (map (\<lambda>y. if q y then Inl (g' y) else Inr (h' y)) (h (x :: 'a) :: nat list)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    37
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    38
(* more examples, same story *)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    39
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    40
corec k1 :: "nat \<Rightarrow> tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    41
  "k1 x = Node (g x) (map (\<lambda>y. k1 (h' y)) (h x :: nat list))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    42
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    43
corec k1' :: "nat \<Rightarrow> tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    44
  "k1' x = Node (g x) (map (\<lambda>z. case z of Inl t \<Rightarrow> t | Inr x' \<Rightarrow> k1' x')
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    45
    (map (\<lambda>y. Inr (h' y)) (h x :: nat list)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    46
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    47
corec k2 :: "nat \<Rightarrow> tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    48
  "k2 x = Node (g x) (map g' (h x :: nat list))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    49
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    50
corec k2' :: "nat \<Rightarrow> tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    51
  "k2' x = Node (g x) (map (\<lambda>z. case z of Inl t \<Rightarrow> t | Inr (x' :: nat) \<Rightarrow> k2' x')
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    52
     (map (\<lambda>y. Inl (g' y)) (h x :: nat list)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    53
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    54
corec k3 :: "nat \<Rightarrow> tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    55
  "k3 x = Node (g x) (h x)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    56
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    57
corec k3' :: "nat \<Rightarrow> tree" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    58
  "k3' x = Node (g x) (map (\<lambda>z. case z of Inl t \<Rightarrow> t | Inr (x' :: nat) \<Rightarrow> k3' x')
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    59
    (map Inl (h x)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    60
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    61
62726
5b2a7caa855b tuned examples
blanchet
parents: 62696
diff changeset
    62
subsection \<open>Constructors instead of Maps\<close>
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    63
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    64
codatatype 'a y = Y 'a "'a y list"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    65
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    66
corec hh where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    67
  "hh a = Y a (map hh [a])"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    68
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    69
corec k where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    70
  "k a = Y a [k a, k undefined, k (a + a), undefined, k a]"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    71
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    72
codatatype 'a x = X 'a "'a x option"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    73
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    74
corec f where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    75
  "f a = X a (map_option f (Some a))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    76
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    77
corec gg where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    78
  "gg a = X a (Some (gg a))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    79
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    80
62726
5b2a7caa855b tuned examples
blanchet
parents: 62696
diff changeset
    81
subsection \<open>Some Friends\<close>
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    82
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    83
codatatype u =
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    84
  U (lab: nat) (sub: "u list")
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    85
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    86
definition u_id :: "u \<Rightarrow> u" where "u_id u = u"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    87
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    88
friend_of_corec u_id where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    89
  "u_id u = U (lab u) (sub u)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    90
  by (simp add: u_id_def) transfer_prover
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    91
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    92
corec u_id_f :: "u \<Rightarrow> u" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    93
  "u_id_f u = u_id (U (lab u) (map u_id_f (sub u)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    94
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    95
corec (friend) u_id_g :: "u \<Rightarrow> u" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    96
  "u_id_g u = U (lab u) (map (\<lambda>u'. u_id (u_id_g u')) (sub u))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    97
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    98
corec (friend) u_id_g' :: "u \<Rightarrow> u" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    99
  "u_id_g' u = U (lab u) (map (u_id o u_id_g') (sub u))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   100
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   101
corec (friend) u_id_g'' :: "u \<Rightarrow> u" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   102
  "u_id_g'' u = U (lab u) (map ((\<lambda>u'. u_id u') o u_id_g'') (sub u))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   103
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   104
corec u_id_h :: "u \<Rightarrow> u" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   105
  "u_id_h u = u_id (u_id (U (lab u) (map (\<lambda>u'. (u_id o u_id) (u_id (u_id (u_id_h u')))) (sub u))))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   106
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   107
corec u_id_h' :: "u \<Rightarrow> u" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   108
  "u_id_h' u = u_id (u_id (U (lab u) (map (u_id o u_id o u_id_h') (sub u))))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   109
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   110
corec u_id_h'' :: "u \<Rightarrow> u" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   111
  "u_id_h'' u = u_id (u_id (U (lab u) (map (u_id o (u_id o (\<lambda>u'. u_id u')) o u_id_h'') (sub u))))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   112
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   113
definition u_K :: "u \<Rightarrow> u \<Rightarrow> u" where "u_K u v = u"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   114
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   115
friend_of_corec u_K where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   116
  "u_K u v = U (lab u) (sub u)"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   117
  by (simp add: u_K_def) transfer_prover
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   118
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   119
corec u_K_f :: "u \<Rightarrow> u" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   120
  "u_K_f u = u_K (U (lab u) (map u_K_f (sub u))) undefined"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   121
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   122
corec (friend) u_K_g :: "u \<Rightarrow> u" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   123
  "u_K_g u = U (lab u) (map (\<lambda>u'. u_K (u_K_g u') undefined) (sub u))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   124
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   125
corec (friend) u_K_g' :: "u \<Rightarrow> u" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   126
  "u_K_g' u = U (lab u) (map ((\<lambda>u'. u_K u' undefined) o u_K_g') (sub u))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   127
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   128
corec (friend) u_K_g'' :: "u \<Rightarrow> u" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   129
  "u_K_g'' u = U (lab u) (map (u_K undefined o u_K_g'') (sub u))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   130
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   131
end