src/HOL/Quotient_Examples/DList.thy
author Cezary Kaliszyk <kaliszyk@in.tum.de>
Tue, 12 Jul 2011 16:00:05 +0900
changeset 43766 9545bb3cefac
child 44263 971d1be5d5ce
permissions -rw-r--r--
Quotient example: Lists with distinct elements
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43766
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     1
(*  Title:      HOL/Quotient_Examples/DList.thy
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     2
    Author:     Cezary Kaliszyk, University of Tsukuba
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     3
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     4
Based on typedef version "Library/Dlist" by Florian Haftmann
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     5
and theory morphism version by Maksym Bortin
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     6
*)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     7
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     8
header {* Lists with distinct elements *}
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
     9
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    10
theory DList
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    11
imports "~~/src/HOL/Library/Quotient_List" "~~/src/HOL/Library/More_List"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    12
begin
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    13
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    14
text {* Some facts about lists *}
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    15
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    16
lemma remdups_removeAll_commute[simp]:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    17
  "remdups (removeAll x l) = removeAll x (remdups l)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    18
  by (induct l) auto
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    19
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    20
lemma removeAll_distinct[simp]:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    21
  assumes "distinct l"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    22
  shows "distinct (removeAll x l)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    23
  using assms by (induct l) simp_all
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    24
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    25
lemma removeAll_commute:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    26
  "removeAll x (removeAll y l) = removeAll y (removeAll x l)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    27
  by (induct l) auto
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    28
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    29
lemma remdups_hd_notin_tl:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    30
  "remdups dl = h # t \<Longrightarrow> h \<notin> set t"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    31
  by (induct dl arbitrary: h t)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    32
     (case_tac [!] "a \<in> set dl", auto)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    33
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    34
lemma remdups_repeat:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    35
  "remdups dl = h # t \<Longrightarrow> t = remdups t"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    36
  by (induct dl arbitrary: h t, case_tac [!] "a \<in> set dl")
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    37
     (simp_all, metis remdups_remdups)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    38
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    39
lemma remdups_nil_noteq_cons:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    40
  "remdups (h # t) \<noteq> remdups []"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    41
  "remdups [] \<noteq> remdups (h # t)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    42
  by auto
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    43
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    44
lemma remdups_eq_map_eq:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    45
  assumes "remdups xa = remdups ya"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    46
    shows "remdups (map f xa) = remdups (map f ya)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    47
  using assms
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    48
  by (induct xa ya arbitrary: fx fy rule: list_induct2')
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    49
     (metis (full_types) remdups_nil_noteq_cons(2) remdups_map_remdups)+
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    50
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    51
text {* Setting up the quotient type *}
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    52
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    53
definition
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    54
  dlist_eq :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    55
where
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    56
  [simp]: "dlist_eq xs ys \<longleftrightarrow> remdups xs = remdups ys"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    57
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    58
lemma dlist_eq_reflp:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    59
  "reflp dlist_eq"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    60
  by (auto intro: reflpI)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    61
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    62
lemma dlist_eq_symp:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    63
  "symp dlist_eq"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    64
  by (auto intro: sympI)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    65
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    66
lemma dlist_eq_transp:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    67
  "transp dlist_eq"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    68
  by (auto intro: transpI)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    69
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    70
lemma dlist_eq_equivp:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    71
  "equivp dlist_eq"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    72
  by (auto intro: equivpI dlist_eq_reflp dlist_eq_symp dlist_eq_transp)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    73
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    74
quotient_type
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    75
  'a dlist = "'a list" / "dlist_eq"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    76
  by (rule dlist_eq_equivp)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    77
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    78
text {* respectfulness and constant definitions *}
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    79
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    80
definition [simp]: "card_remdups = length \<circ> remdups"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    81
definition [simp]: "foldr_remdups f xs e = foldr f (remdups xs) e"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    82
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    83
lemma [quot_respect]:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    84
  "(dlist_eq) Nil Nil"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    85
  "(dlist_eq ===> op =) List.member List.member"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    86
  "(op = ===> dlist_eq ===> dlist_eq) Cons Cons"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    87
  "(op = ===> dlist_eq ===> dlist_eq) removeAll removeAll"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    88
  "(dlist_eq ===> op =) card_remdups card_remdups"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    89
  "(dlist_eq ===> op =) remdups remdups"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    90
  "(op = ===> dlist_eq ===> op =) foldr_remdups foldr_remdups"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    91
  "(op = ===> dlist_eq ===> dlist_eq) map map"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    92
  "(op = ===> dlist_eq ===> dlist_eq) filter filter"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    93
  by (auto intro!: fun_relI simp add: remdups_filter)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    94
     (metis (full_types) member_set set_remdups remdups_eq_map_eq)+
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    95
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    96
quotient_definition empty where "empty :: 'a dlist"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    97
  is "Nil"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    98
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
    99
quotient_definition insert where "insert :: 'a \<Rightarrow> 'a dlist \<Rightarrow> 'a dlist"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   100
  is "Cons"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   101
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   102
quotient_definition "member :: 'a dlist \<Rightarrow> 'a \<Rightarrow> bool"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   103
  is "List.member"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   104
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   105
quotient_definition foldr where "foldr :: ('a \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> 'a dlist \<Rightarrow> 'b \<Rightarrow> 'b"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   106
  is "foldr_remdups"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   107
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   108
quotient_definition "remove :: 'a \<Rightarrow> 'a dlist \<Rightarrow> 'a dlist"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   109
  is "removeAll"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   110
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   111
quotient_definition card where "card :: 'a dlist \<Rightarrow> nat"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   112
  is "card_remdups"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   113
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   114
quotient_definition map where "map :: ('a \<Rightarrow> 'b) \<Rightarrow> 'a dlist \<Rightarrow> 'b dlist"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   115
  is "List.map :: ('a \<Rightarrow> 'b) \<Rightarrow> 'a list \<Rightarrow> 'b list"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   116
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   117
quotient_definition filter where "filter :: ('a \<Rightarrow> bool) \<Rightarrow> 'a dlist \<Rightarrow> 'a dlist"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   118
  is "List.filter"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   119
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   120
quotient_definition "list_of_dlist :: 'a dlist \<Rightarrow> 'a list"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   121
  is "remdups"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   122
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   123
text {* lifted theorems *}
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   124
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   125
lemma dlist_member_insert:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   126
  "member dl x \<Longrightarrow> insert x dl = dl"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   127
  by descending (simp add: List.member_def)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   128
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   129
lemma dlist_member_insert_eq:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   130
  "member (insert y dl) x = (x = y \<or> member dl x)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   131
  by descending (simp add: List.member_def)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   132
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   133
lemma dlist_insert_idem:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   134
  "insert x (insert x dl) = insert x dl"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   135
  by descending simp
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   136
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   137
lemma dlist_insert_not_empty:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   138
  "insert x dl \<noteq> empty"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   139
  by descending auto
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   140
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   141
lemma not_dlist_member_empty:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   142
  "\<not> member empty x"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   143
  by descending (simp add: List.member_def)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   144
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   145
lemma not_dlist_member_remove:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   146
  "\<not> member (remove x dl) x"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   147
  by descending (simp add: List.member_def)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   148
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   149
lemma dlist_in_remove:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   150
  "a \<noteq> b \<Longrightarrow> member (remove b dl) a = member dl a"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   151
  by descending (simp add: List.member_def)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   152
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   153
lemma dlist_not_memb_remove:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   154
  "\<not> member dl x \<Longrightarrow> remove x dl = dl"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   155
  by descending (simp add: List.member_def)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   156
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   157
lemma dlist_no_memb_remove_insert:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   158
"\<not> member dl x \<Longrightarrow> remove x (insert x dl) = dl"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   159
  by descending (simp add: List.member_def)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   160
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   161
lemma dlist_remove_empty:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   162
  "remove x empty = empty"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   163
  by descending simp
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   164
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   165
lemma dlist_remove_insert_commute:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   166
  "a \<noteq> b \<Longrightarrow> remove a (insert b dl) = insert b (remove a dl)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   167
  by descending simp
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   168
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   169
lemma dlist_remove_commute:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   170
"remove a (remove b dl) = remove b (remove a dl)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   171
  by (lifting removeAll_commute)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   172
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   173
lemma dlist_foldr_empty:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   174
  "foldr f empty e = e"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   175
  by descending simp
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   176
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   177
lemma dlist_no_memb_foldr:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   178
  assumes "\<not> member dl x"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   179
  shows "foldr f (insert x dl) e = f x (foldr f dl e)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   180
  using assms by descending (simp add: List.member_def)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   181
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   182
lemma dlist_foldr_insert_not_memb:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   183
  assumes "\<not>member t h"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   184
  shows "foldr f (insert h t) e = f h (foldr f t e)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   185
  using assms by descending (simp add: List.member_def)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   186
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   187
lemma list_of_dlist_empty[simp]:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   188
  "list_of_dlist empty = []"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   189
  by descending simp
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   190
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   191
lemma list_of_dlist_insert[simp]:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   192
  "list_of_dlist (insert x xs) =
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   193
    (if member xs x then (remdups (list_of_dlist xs))
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   194
    else x # (remdups (list_of_dlist xs)))"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   195
  by descending (simp add: List.member_def remdups_remdups)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   196
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   197
lemma list_of_dlist_remove[simp]:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   198
  "list_of_dlist (remove x dxs) = remove1 x (list_of_dlist dxs)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   199
  by descending (simp add: distinct_remove1_removeAll)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   200
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   201
lemma list_of_dlist_map[simp]:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   202
  "list_of_dlist (map f dxs) = remdups (List.map f (list_of_dlist dxs))"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   203
  by descending (simp add: remdups_map_remdups)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   204
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   205
lemma list_of_dlist_filter [simp]:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   206
  "list_of_dlist (filter P dxs) = List.filter P (list_of_dlist dxs)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   207
  by descending (simp add: remdups_filter)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   208
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   209
lemma dlist_map_empty:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   210
  "map f empty = empty"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   211
  by descending simp
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   212
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   213
lemma dlist_map_insert:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   214
  "map f (insert x xs) = insert (f x) (map f xs)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   215
  by descending simp
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   216
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   217
lemma dlist_eq_iff:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   218
  "dxs = dys \<longleftrightarrow> list_of_dlist dxs = list_of_dlist dys"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   219
  by descending simp
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   220
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   221
lemma dlist_eqI:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   222
  "list_of_dlist dxs = list_of_dlist dys \<Longrightarrow> dxs = dys"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   223
  by (simp add: dlist_eq_iff)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   224
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   225
abbreviation
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   226
  "dlist xs \<equiv> abs_dlist xs"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   227
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   228
lemma distinct_list_of_dlist [simp, intro]:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   229
  "distinct (list_of_dlist dxs)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   230
  by descending simp
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   231
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   232
lemma list_of_dlist_dlist [simp]:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   233
  "list_of_dlist (dlist xs) = remdups xs"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   234
  unfolding list_of_dlist_def map_fun_apply id_def
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   235
  by (metis Quotient_rep_abs[OF Quotient_dlist] dlist_eq_def)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   236
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   237
lemma remdups_list_of_dlist [simp]:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   238
  "remdups (list_of_dlist dxs) = list_of_dlist dxs"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   239
  by simp
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   240
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   241
lemma dlist_list_of_dlist [simp, code abstype]:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   242
  "dlist (list_of_dlist dxs) = dxs"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   243
  by (simp add: list_of_dlist_def)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   244
  (metis Quotient_def Quotient_dlist dlist_eqI list_of_dlist_dlist remdups_list_of_dlist)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   245
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   246
lemma dlist_filter_simps:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   247
  "filter P empty = empty"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   248
  "filter P (insert x xs) = (if P x then insert x (filter P xs) else filter P xs)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   249
  by (lifting filter.simps)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   250
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   251
lemma dlist_induct:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   252
  assumes "P empty"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   253
      and "\<And>a dl. P dl \<Longrightarrow> P (insert a dl)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   254
    shows "P dl"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   255
  using assms by descending (drule list.induct, simp)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   256
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   257
lemma dlist_induct_stronger:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   258
  assumes a1: "P empty"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   259
  and     a2: "\<And>x dl. \<lbrakk>\<not>member dl x; P dl\<rbrakk> \<Longrightarrow> P (insert x dl)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   260
  shows "P dl"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   261
proof(induct dl rule: dlist_induct)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   262
  show "P empty" using a1 by simp
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   263
next
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   264
  fix x dl
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   265
  assume "P dl"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   266
  then show "P (insert x dl)" using a2
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   267
    by (cases "member dl x") (simp_all add: dlist_member_insert)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   268
qed
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   269
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   270
lemma dlist_card_induct:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   271
  assumes "\<And>xs. (\<And>ys. card ys < card xs \<Longrightarrow> P ys) \<Longrightarrow> P xs"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   272
    shows "P xs"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   273
  using assms
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   274
  by descending (rule measure_induct [of card_remdups], blast)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   275
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   276
lemma dlist_cases:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   277
  "dl = empty \<or> (\<exists>h t. dl = insert h t \<and> \<not> member t h)"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   278
  apply (descending, simp add: List.member_def)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   279
  by (metis list.exhaust remdups_eq_nil_iff remdups_hd_notin_tl remdups_repeat)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   280
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   281
lemma dlist_exhaust:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   282
  assumes "y = empty \<Longrightarrow> P"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   283
      and "\<And>a dl. y = insert a dl \<Longrightarrow> P"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   284
    shows "P"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   285
  using assms by (lifting list.exhaust)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   286
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   287
lemma dlist_exhaust_stronger:
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   288
  assumes "y = empty \<Longrightarrow> P"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   289
      and "\<And>a dl. y = insert a dl \<Longrightarrow> \<not> member dl a \<Longrightarrow> P"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   290
    shows "P"
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   291
  using assms by (metis dlist_cases)
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   292
9545bb3cefac Quotient example: Lists with distinct elements
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
diff changeset
   293
end