src/HOL/BNF_Examples/ListF.thy
author blanchet
Mon, 20 Jan 2014 18:24:56 +0100
changeset 55075 b3d0a02a756d
parent 55071 8ae6f86a3477
child 55076 1e73e090a514
permissions -rw-r--r--
dissolved BNF session
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55075
b3d0a02a756d dissolved BNF session
blanchet
parents: 55071
diff changeset
     1
(*  Title:      HOL/BNF_Examples/ListF.thy
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     2
    Author:     Dmitriy Traytel, TU Muenchen
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     3
    Author:     Andrei Popescu, TU Muenchen
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     4
    Copyright   2012
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     5
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     6
Finite lists.
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     7
*)
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     8
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
     9
header {* Finite Lists *}
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    10
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    11
theory ListF
49509
163914705f8d renamed top-level theory from "Codatatype" to "BNF"
blanchet
parents: 49508
diff changeset
    12
imports "../BNF"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    13
begin
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    14
53355
603e6e97c391 modernized more examples
traytel
parents: 53353
diff changeset
    15
datatype_new 'a listF (map: mapF rel: relF) =
603e6e97c391 modernized more examples
traytel
parents: 53353
diff changeset
    16
  NilF (defaults tlF: NilF) | Conss (hdF: 'a) (tlF: "'a listF")
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    17
datatype_new_compat listF
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    18
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    19
definition Singll ("[[_]]") where
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    20
  [simp]: "Singll a \<equiv> Conss a NilF"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    21
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    22
primrec_new appendd (infixr "@@" 65) where
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    23
  "NilF @@ ys = ys"
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    24
| "Conss x xs @@ ys = Conss x (xs @@ ys)"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    25
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    26
primrec_new lrev where
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    27
  "lrev NilF = NilF"
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    28
| "lrev (Conss y ys) = lrev ys @@ [[y]]"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    29
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    30
lemma appendd_NilF[simp]: "xs @@ NilF = xs"
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    31
  by (induct xs) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    32
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    33
lemma appendd_assoc[simp]: "(xs @@ ys) @@ zs = xs @@ ys @@ zs"
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    34
  by (induct xs) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    35
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    36
lemma lrev_appendd[simp]: "lrev (xs @@ ys) = lrev ys @@ lrev xs"
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    37
  by (induct xs) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    38
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    39
lemma listF_map_appendd[simp]:
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    40
  "mapF f (xs @@ ys) = mapF f xs @@ mapF f ys"
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    41
  by (induct xs) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    42
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    43
lemma lrev_listF_map[simp]: "lrev (mapF f xs) = mapF f (lrev xs)"
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    44
  by (induct xs) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    45
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    46
lemma lrev_lrev[simp]: "lrev (lrev xs) = xs"
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    47
  by (induct xs) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    48
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    49
primrec_new lengthh where
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    50
  "lengthh NilF = 0"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    51
| "lengthh (Conss x xs) = Suc (lengthh xs)"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    52
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    53
fun nthh where
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    54
  "nthh (Conss x xs) 0 = x"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    55
| "nthh (Conss x xs) (Suc n) = nthh xs n"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    56
| "nthh xs i = undefined"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    57
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    58
lemma lengthh_listF_map[simp]: "lengthh (mapF f xs) = lengthh xs"
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    59
  by (induct xs) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    60
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    61
lemma nthh_listF_map[simp]:
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    62
  "i < lengthh xs \<Longrightarrow> nthh (mapF f xs) i = f (nthh xs i)"
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    63
  by (induct rule: nthh.induct) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    64
54490
930409d43211 use suffix '_list' etc. instead of prefix 'list_' for constants not present in the old package
blanchet
parents: 53355
diff changeset
    65
lemma nthh_listF_set[simp]: "i < lengthh xs \<Longrightarrow> nthh xs i \<in> set_listF xs"
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    66
  by (induct rule: nthh.induct) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    67
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    68
lemma NilF_iff[iff]: "(lengthh xs = 0) = (xs = NilF)"
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    69
  by (induct xs) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    70
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    71
lemma Conss_iff[iff]:
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    72
  "(lengthh xs = Suc n) = (\<exists>y ys. xs = Conss y ys \<and> lengthh ys = n)"
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    73
  by (induct xs) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    74
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    75
lemma Conss_iff'[iff]:
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    76
  "(Suc n = lengthh xs) = (\<exists>y ys. xs = Conss y ys \<and> lengthh ys = n)"
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    77
  by (induct xs) (simp, simp, blast)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    78
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    79
lemma listF_induct2[consumes 1, case_names NilF Conss]: "\<lbrakk>lengthh xs = lengthh ys; P NilF NilF;
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    80
    \<And>x xs y ys. P xs ys \<Longrightarrow> P (Conss x xs) (Conss y ys)\<rbrakk> \<Longrightarrow> P xs ys"
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    81
    by (induct xs arbitrary: ys) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    82
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    83
fun zipp where
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    84
  "zipp NilF NilF = NilF"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    85
| "zipp (Conss x xs) (Conss y ys) = Conss (x, y) (zipp xs ys)"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    86
| "zipp xs ys = undefined"
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    87
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    88
lemma listF_map_fst_zip[simp]:
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    89
  "lengthh xs = lengthh ys \<Longrightarrow> mapF fst (zipp xs ys) = xs"
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    90
  by (induct rule: listF_induct2) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    91
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    92
lemma listF_map_snd_zip[simp]:
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    93
  "lengthh xs = lengthh ys \<Longrightarrow> mapF snd (zipp xs ys) = ys"
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    94
  by (induct rule: listF_induct2) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    95
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    96
lemma lengthh_zip[simp]:
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    97
  "lengthh xs = lengthh ys \<Longrightarrow> lengthh (zipp xs ys) = lengthh xs"
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
    98
  by (induct rule: listF_induct2) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
    99
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   100
lemma nthh_zip[simp]:
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
   101
  assumes "lengthh xs = lengthh ys"
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   102
  shows "i < lengthh xs \<Longrightarrow> nthh (zipp xs ys) i = (nthh xs i, nthh ys i)"
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
   103
using assms proof (induct arbitrary: i rule: listF_induct2)
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
   104
  case (Conss x xs y ys) thus ?case by (induct i) auto
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   105
qed simp
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   106
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   107
lemma list_set_nthh[simp]:
54490
930409d43211 use suffix '_list' etc. instead of prefix 'list_' for constants not present in the old package
blanchet
parents: 53355
diff changeset
   108
  "(x \<in> set_listF xs) \<Longrightarrow> (\<exists>i < lengthh xs. nthh xs i = x)"
53353
0c1c67e3fccc modernized example
traytel
parents: 51804
diff changeset
   109
  by (induct xs) (auto, induct rule: nthh.induct, auto)
48975
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   110
7f79f94a432c added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff changeset
   111
end