src/HOL/Corec_Examples/Tests/Merge_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/Merge_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
Tests polymorphic merges.
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>Tests Polymorphic Merges\<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 Merge_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
62726
5b2a7caa855b tuned examples
blanchet
parents: 62698
diff changeset
    15
subsection \<open>A Monomorphic Example\<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 r = R (rhd: nat) (rtl: r)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    18
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    19
corec id_r :: "r \<Rightarrow> r" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    20
  "id_r r = R (rhd r) (id_r (rtl r))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    21
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    22
corec id_r' :: "r \<Rightarrow> r" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    23
  "id_r' r = R (rhd r) (id_r' (rtl r))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    24
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    25
corec id_r'' :: "r \<Rightarrow> r" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    26
  "id_r'' r = R (rhd r) (id_r'' (rtl r))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    27
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    28
consts
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    29
  f1 :: "r \<Rightarrow> r"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    30
  f2 :: "r \<Rightarrow> r"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    31
  f3 :: "r \<Rightarrow> r"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    32
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    33
friend_of_corec f1 :: "r \<Rightarrow> r" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    34
  "f1 r = R (rhd r) (f1 (R (rhd r) (rtl r)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    35
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    36
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    37
friend_of_corec f2 :: "r \<Rightarrow> r" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    38
  "f2 r = R (rhd r) (f1 (f2 (rtl r)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    39
  sorry
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 f3 :: "r \<Rightarrow> r" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    42
  "f3 r = R (rhd r) (f3 (rtl r))"
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 id_rx :: "r \<Rightarrow> r" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    46
  "id_rx r = f1 (f2 (f3 (R (rhd r) (id_rx (rtl r)))))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    47
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    48
62726
5b2a7caa855b tuned examples
blanchet
parents: 62698
diff changeset
    49
subsection \<open>The Polymorphic Version\<close>
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    50
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    51
codatatype 'a s = S (shd: 'a) (stl: "'a s")
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    52
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    53
corec id_s :: "'a s \<Rightarrow> 'a s" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    54
  "id_s s = S (shd s) (id_s (stl s))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    55
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    56
corec id_s' :: "'b s \<Rightarrow> 'b s" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    57
  "id_s' s = S (shd s) (id_s' (stl s))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    58
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    59
corec id_s'' :: "'w s \<Rightarrow> 'w s" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    60
  "id_s'' s = S (shd s) (id_s'' (stl s))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    61
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    62
(* Registers polymorphic and nonpolymorphic friends in an alternating fashion. *)
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    63
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    64
consts
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    65
  g1 :: "'a \<Rightarrow> 'a s \<Rightarrow> 'a s"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    66
  g2 :: "nat \<Rightarrow> nat s \<Rightarrow> nat s"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    67
  g3 :: "'a \<Rightarrow> 'a s \<Rightarrow> 'a s"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    68
  g4 :: "'a \<Rightarrow> 'a s \<Rightarrow> 'a s"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    69
  g5 :: "nat \<Rightarrow> nat s \<Rightarrow> nat s"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    70
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    71
friend_of_corec g3 :: "'b \<Rightarrow> 'b s \<Rightarrow> 'b s" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    72
  "g3 x s = S (shd s) (g3 x (stl s))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    73
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    74
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    75
friend_of_corec g1 :: "'w \<Rightarrow> 'w s \<Rightarrow> 'w s" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    76
  "g1 x s = S (shd s) (g1 x (stl s))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    77
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    78
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    79
friend_of_corec g2 :: "nat \<Rightarrow> nat s \<Rightarrow> nat s" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    80
  "g2 x s = S (shd s) (g1 x (stl s))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    81
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    82
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    83
friend_of_corec g4 :: "'a \<Rightarrow> 'a s \<Rightarrow> 'a s" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    84
  "g4 x s = S (shd s) (g1 x (g4 x (stl s)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    85
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    86
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    87
friend_of_corec g5 :: "nat \<Rightarrow> nat s \<Rightarrow> nat s" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    88
  "g5 x s = S (shd s) (g2 x (g5 x (stl s)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    89
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    90
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    91
corec id_nat_s :: "nat s \<Rightarrow> nat s" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    92
  "id_nat_s s = g1 undefined (g2 undefined (g3 undefined (S (shd s) (id_nat_s (stl s)))))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    93
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    94
codatatype ('a, 'b) ABstream = ACons 'a (ABtl: "('a, 'b) ABstream") | BCons 'b (ABtl: "('a, 'b) ABstream")
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    95
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    96
consts
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    97
  h1 :: "('a, 'b) ABstream \<Rightarrow> ('a, 'b) ABstream"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    98
  h2 :: "(nat, 'b) ABstream \<Rightarrow> (nat, 'b) ABstream"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
    99
  h3 :: "('a, nat) ABstream \<Rightarrow> ('a, nat) ABstream"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   100
  h4 :: "('a :: zero, 'a) ABstream \<Rightarrow> ('a :: zero, 'a) ABstream"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   101
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   102
friend_of_corec h1 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   103
  "h1 x = ACons undefined undefined" sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   104
62698
9d706e37ddab tuned whitespace
blanchet
parents: 62696
diff changeset
   105
friend_of_corec h2 where
9d706e37ddab tuned whitespace
blanchet
parents: 62696
diff changeset
   106
  "h2 x = (case x of
9d706e37ddab tuned whitespace
blanchet
parents: 62696
diff changeset
   107
    ACons a t \<Rightarrow> ACons a (h1 (h2 t))
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   108
  | BCons b t \<Rightarrow> BCons b (h1 (h2 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
friend_of_corec h3 where
62698
9d706e37ddab tuned whitespace
blanchet
parents: 62696
diff changeset
   112
  "h3 x = (case x of
9d706e37ddab tuned whitespace
blanchet
parents: 62696
diff changeset
   113
    ACons a t \<Rightarrow> ACons a (h1 (h3 t))
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   114
  | BCons b t \<Rightarrow> BCons b (h1 (h3 t)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   115
  sorry
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 h4 where
62698
9d706e37ddab tuned whitespace
blanchet
parents: 62696
diff changeset
   118
  "h4 x = (case x of
9d706e37ddab tuned whitespace
blanchet
parents: 62696
diff changeset
   119
    ACons a t \<Rightarrow> ACons a (h1 (h4 t))
62696
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   120
  | BCons b t \<Rightarrow> BCons b (h1 (h4 t)))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   121
  sorry
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   122
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   123
corec (friend) h5 where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   124
  "h5 x = (case x of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   125
    ACons a t \<Rightarrow> ACons a (h1 (h2 (h3 (h4 (h5 t)))))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   126
  | BCons b t \<Rightarrow> BCons b (h1 (h2 (h3 (h4 (h5 t))))))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   127
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   128
corec (friend) h6 :: "(nat, nat) ABstream \<Rightarrow> (nat, nat) ABstream" where
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   129
  "h6 x = (case x of
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   130
    ACons a t \<Rightarrow> ACons a (h6 (h1 (h2 (h3 (h4 (h5 (h6 t)))))))
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   131
  | BCons b t \<Rightarrow> BCons b (h1 (h2 (h3 (h4 (h5 (h6 t)))))))"
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   132
7325d8573fb8 added 'corec' examples and tests
blanchet
parents:
diff changeset
   133
end