src/HOL/More_List.thy
author haftmann
Fri, 06 Jan 2012 10:19:49 +0100
changeset 46133 d9fe85d3d2cd
parent 46033 6fc579c917b8
child 46142 94479a979129
permissions -rw-r--r--
incorporated canonical fold combinator on lists into body of List theory; refactored passages on List.fold(l/r)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45973
204f34a99ceb moved `sublists` to theory Enum
haftmann
parents: 45146
diff changeset
     1
(* Author:  Florian Haftmann, TU Muenchen *)
37025
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
     2
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
     3
header {* Operations on lists beyond the standard List theory *}
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
     4
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
     5
theory More_List
45990
b7b905b23b2a incorporated More_Set and More_List into the Main body -- to be consolidated later
haftmann
parents: 45973
diff changeset
     6
imports List
37025
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
     7
begin
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
     8
37028
a6e0696d7110 proper document text
haftmann
parents: 37025
diff changeset
     9
text {* @{text nth_map} *}
37025
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    10
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    11
definition nth_map :: "nat \<Rightarrow> ('a \<Rightarrow> 'a) \<Rightarrow> 'a list \<Rightarrow> 'a list" where
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    12
  "nth_map n f xs = (if n < length xs then
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    13
       take n xs @ [f (xs ! n)] @ drop (Suc n) xs
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    14
     else xs)"
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    15
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    16
lemma nth_map_id:
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    17
  "n \<ge> length xs \<Longrightarrow> nth_map n f xs = xs"
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    18
  by (simp add: nth_map_def)
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    19
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    20
lemma nth_map_unfold:
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    21
  "n < length xs \<Longrightarrow> nth_map n f xs = take n xs @ [f (xs ! n)] @ drop (Suc n) xs"
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    22
  by (simp add: nth_map_def)
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    23
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    24
lemma nth_map_Nil [simp]:
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    25
  "nth_map n f [] = []"
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    26
  by (simp add: nth_map_def)
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    27
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    28
lemma nth_map_zero [simp]:
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    29
  "nth_map 0 f (x # xs) = f x # xs"
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    30
  by (simp add: nth_map_def)
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    31
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    32
lemma nth_map_Suc [simp]:
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    33
  "nth_map (Suc n) f (x # xs) = x # nth_map n f xs"
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    34
  by (simp add: nth_map_def)
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    35
45145
d5086da3c32d monadic bind
haftmann
parents: 44928
diff changeset
    36
d5086da3c32d monadic bind
haftmann
parents: 44928
diff changeset
    37
text {* monad operation *}
d5086da3c32d monadic bind
haftmann
parents: 44928
diff changeset
    38
d5086da3c32d monadic bind
haftmann
parents: 44928
diff changeset
    39
definition bind :: "'a list \<Rightarrow> ('a \<Rightarrow> 'b list) \<Rightarrow> 'b list" where
d5086da3c32d monadic bind
haftmann
parents: 44928
diff changeset
    40
  "bind xs f = concat (map f xs)"
d5086da3c32d monadic bind
haftmann
parents: 44928
diff changeset
    41
d5086da3c32d monadic bind
haftmann
parents: 44928
diff changeset
    42
lemma bind_simps [simp]:
d5086da3c32d monadic bind
haftmann
parents: 44928
diff changeset
    43
  "bind [] f = []"
d5086da3c32d monadic bind
haftmann
parents: 44928
diff changeset
    44
  "bind (x # xs) f = f x @ bind xs f"
d5086da3c32d monadic bind
haftmann
parents: 44928
diff changeset
    45
  by (simp_all add: bind_def)
d5086da3c32d monadic bind
haftmann
parents: 44928
diff changeset
    46
37025
8a5718d54e71 added More_List.thy explicitly
haftmann
parents:
diff changeset
    47
end