src/HOL/Induct/Multiset.ML
author paulson
Thu, 11 Nov 1999 10:25:17 +0100
changeset 8005 b64d86018785
parent 7499 23e090051cb8
child 8914 e1e4b7313063
permissions -rw-r--r--
new-style infix declaration for "image"
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     1
(*  Title:      HOL/Induct/Multiset.ML
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     2
    ID:         $Id$
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     3
    Author:     Tobias Nipkow
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     4
    Copyright   1998 TUM
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     5
*)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     6
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     7
Addsimps [Abs_multiset_inverse,Rep_multiset_inverse,Rep_multiset];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     8
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
     9
(** Preservation of representing set `multiset' **)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    10
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    11
Goalw [multiset_def] "(%a. 0) : multiset";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    12
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    13
qed "const0_in_multiset";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    14
Addsimps [const0_in_multiset];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    15
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    16
Goalw [multiset_def] "(%b. if b=a then 1 else 0) : multiset";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    17
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    18
qed "only1_in_multiset";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    19
Addsimps [only1_in_multiset];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    20
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    21
Goalw [multiset_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    22
 "[| M : multiset; N : multiset |] ==> (%a. M a + N a) : multiset";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    23
by (Asm_full_simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    24
by (dtac finite_UnI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    25
by (assume_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    26
by (asm_full_simp_tac (simpset() delsimps [finite_Un]addsimps [Un_def]) 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    27
qed "union_preserves_multiset";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    28
Addsimps [union_preserves_multiset];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    29
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    30
Goalw [multiset_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    31
 "[| M : multiset |] ==> (%a. M a - N a) : multiset";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    32
by (Asm_full_simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    33
by (etac (rotate_prems 1 finite_subset) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    34
by (Auto_tac);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    35
qed "diff_preserves_multiset";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    36
Addsimps [diff_preserves_multiset];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    37
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    38
(** Injectivity of Rep_multiset **)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    39
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    40
Goal "(M = N) = (Rep_multiset M = Rep_multiset N)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    41
by (rtac iffI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    42
 by (Asm_simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    43
by (dres_inst_tac [("f","Abs_multiset")] arg_cong 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    44
by (Asm_full_simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    45
qed "multiset_eq_conv_Rep_eq";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    46
Addsimps [multiset_eq_conv_Rep_eq];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    47
Addsimps [expand_fun_eq];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    48
(*
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    49
Goal
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    50
 "[| f : multiset; g : multiset |] ==> \
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    51
\ (Abs_multiset f = Abs_multiset g) = (!x. f x = g x)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    52
by (rtac iffI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    53
 by (dres_inst_tac [("f","Rep_multiset")] arg_cong 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    54
 by (Asm_full_simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    55
by (subgoal_tac "f = g" 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    56
 by (Asm_simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    57
by (rtac ext 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    58
by (Blast_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    59
qed "Abs_multiset_eq";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    60
Addsimps [Abs_multiset_eq];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    61
*)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    62
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    63
(** Equations **)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    64
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    65
(* union *)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    66
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    67
Goalw [union_def,empty_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    68
 "M + {#} = M & {#} + M = M";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    69
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    70
qed "union_empty";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    71
Addsimps [union_empty];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    72
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    73
Goalw [union_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    74
 "(M::'a multiset) + N = N + M";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    75
by (simp_tac (simpset() addsimps add_ac) 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    76
qed "union_comm";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    77
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    78
Goalw [union_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    79
 "((M::'a multiset)+N)+K = M+(N+K)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    80
by (simp_tac (simpset() addsimps add_ac) 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    81
qed "union_assoc";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    82
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    83
qed_goal "union_lcomm" thy "M+(N+K) = N+((M+K)::'a multiset)"
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    84
 (fn _ => [rtac (union_comm RS trans) 1, rtac (union_assoc RS trans) 1,
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    85
           rtac (union_comm RS arg_cong) 1]);
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    86
7454
bde978e3d9bb no_qed;
wenzelm
parents: 6162
diff changeset
    87
bind_thms ("union_ac", [union_assoc, union_comm, union_lcomm]);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    88
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    89
(* diff *)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    90
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    91
Goalw [empty_def,diff_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    92
 "M-{#} = M & {#}-M = {#}";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    93
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    94
qed "diff_empty";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    95
Addsimps [diff_empty];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    96
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    97
Goalw [union_def,diff_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
    98
 "M+{#a#}-{#a#} = M";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
    99
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   100
qed "diff_union_inverse2";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   101
Addsimps [diff_union_inverse2];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   102
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   103
(* count *)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   104
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   105
Goalw [count_def,empty_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   106
 "count {#} a = 0";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   107
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   108
qed "count_empty";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   109
Addsimps [count_empty];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   110
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   111
Goalw [count_def,single_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   112
 "count {#b#} a = (if b=a then 1 else 0)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   113
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   114
qed "count_single";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   115
Addsimps [count_single];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   116
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   117
Goalw [count_def,union_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   118
 "count (M+N) a = count M a + count N a";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   119
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   120
qed "count_union";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   121
Addsimps [count_union];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   122
5772
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   123
Goalw [count_def,diff_def]
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   124
 "count (M-N) a = count M a - count N a";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   125
by (Simp_tac 1);
5772
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   126
qed "count_diff";
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   127
Addsimps [count_diff];
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   128
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   129
(* set_of *)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   130
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   131
Goalw [set_of_def] "set_of {#} = {}";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   132
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   133
qed "set_of_empty";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   134
Addsimps [set_of_empty];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   135
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   136
Goalw [set_of_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   137
 "set_of {#b#} = {b}";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   138
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   139
qed "set_of_single";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   140
Addsimps [set_of_single];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   141
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   142
Goalw [set_of_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   143
 "set_of(M+N) = set_of M Un set_of N";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   144
by (Auto_tac);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   145
qed "set_of_union";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   146
Addsimps [set_of_union];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   147
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   148
(* size *)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   149
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   150
Goalw [size_def] "size {#} = 0";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   151
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   152
qed "size_empty";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   153
Addsimps [size_empty];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   154
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   155
Goalw [size_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   156
 "size {#b#} = 1";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   157
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   158
qed "size_single";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   159
Addsimps [size_single];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   160
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   161
(* Some other day...
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   162
Goalw [size_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   163
 "size (M+N::'a multiset) = size M + size N";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   164
*)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   165
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   166
(* equalities *)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   167
5772
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   168
Goalw [count_def] "(M = N) = (!a. count M a = count N a)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   169
by (Simp_tac 1);
5772
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   170
qed "multiset_eq_conv_count_eq";
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   171
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   172
Goalw [single_def,empty_def] "{#a#} ~= {#}  &  {#} ~= {#a#}";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   173
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   174
qed "single_not_empty";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   175
Addsimps [single_not_empty];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   176
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   177
Goalw [single_def] "({#a#}={#b#}) = (a=b)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   178
by (Auto_tac);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   179
qed "single_eq_single";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   180
Addsimps [single_eq_single];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   181
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   182
Goalw [union_def,empty_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   183
 "(M+N = {#}) = (M = {#} & N = {#})";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   184
by (Simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   185
by (Blast_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   186
qed "union_eq_empty";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   187
AddIffs [union_eq_empty];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   188
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   189
Goalw [union_def,empty_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   190
 "({#} = M+N) = (M = {#} & N = {#})";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   191
by (Simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   192
by (Blast_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   193
qed "empty_eq_union";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   194
AddIffs [empty_eq_union];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   195
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   196
Goalw [union_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   197
 "(M+K = N+K) = (M=(N::'a multiset))";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   198
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   199
qed "union_right_cancel";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   200
Addsimps [union_right_cancel];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   201
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   202
Goalw [union_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   203
 "(K+M = K+N) = (M=(N::'a multiset))";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   204
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   205
qed "union_left_cancel";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   206
Addsimps [union_left_cancel];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   207
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   208
Goalw [empty_def,single_def,union_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   209
 "(M+N = {#a#}) = (M={#a#} & N={#} | M={#} & N={#a#})";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   210
by (simp_tac (simpset() addsimps [add_is_1]) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   211
by (Blast_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   212
qed "union_is_single";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   213
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   214
Goalw [empty_def,single_def,union_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   215
 "({#a#} = M+N) = ({#a#}=M & N={#} | M={#} & {#a#}=N)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   216
by (simp_tac (simpset() addsimps [one_is_add]) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   217
by (blast_tac (claset() addDs [sym]) 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   218
qed "single_is_union";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   219
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   220
Goalw [single_def,union_def,diff_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   221
 "(M+{#a#} = N+{#b#}) = (M=N & a=b | M = N-{#a#}+{#b#} & N = M-{#b#}+{#a#})";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   222
by (Simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   223
by (rtac conjI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   224
 by (Force_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   225
by (Clarify_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   226
by (rtac conjI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   227
 by (Blast_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   228
by (Clarify_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   229
by (rtac iffI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   230
 by (rtac conjI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   231
 by (Clarify_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   232
  by (rtac conjI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   233
   by (asm_full_simp_tac (simpset() addsimps [eq_sym_conv]) 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   234
(* PROOF FAILED:
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   235
by (Blast_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   236
*)
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   237
  by (Fast_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   238
 by (Asm_simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   239
by (Force_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   240
qed "add_eq_conv_diff";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   241
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   242
(* FIXME
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   243
val prems = Goal
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   244
 "[| !!F. [| finite F; !G. G < F --> P G |] ==> P F |] ==> finite F --> P F";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   245
by (res_inst_tac [("a","F"),("f","%A. if finite A then card A else 0")]
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   246
     measure_induct 1);
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   247
by (Clarify_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   248
by (resolve_tac prems 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   249
 by (assume_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   250
by (Clarify_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   251
by (subgoal_tac "finite G" 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   252
 by (fast_tac (claset() addDs [finite_subset,order_less_le RS iffD1]) 2);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   253
by (etac allE 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   254
by (etac impE 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   255
 by (Blast_tac 2);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   256
by (asm_simp_tac (simpset() addsimps [psubset_card]) 1);
7454
bde978e3d9bb no_qed;
wenzelm
parents: 6162
diff changeset
   257
no_qed();
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   258
val lemma = result();
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   259
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   260
val prems = Goal
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   261
 "[| finite F; !!F. [| finite F; !G. G < F --> P G |] ==> P F |] ==> P F";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   262
by (rtac (lemma RS mp) 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   263
by (REPEAT(ares_tac prems 1));
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   264
qed "finite_psubset_induct";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   265
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   266
Better: use wf_finite_psubset in WF_Rel
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   267
*)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   268
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   269
(** Towards the induction rule **)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   270
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   271
Goal "finite F ==> (setsum f F = 0) = (!a:F. f a = 0)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   272
by (etac finite_induct 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   273
by (Auto_tac);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   274
qed "setsum_0";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   275
Addsimps [setsum_0];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   276
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   277
Goal "finite F ==> setsum f F = Suc n --> (? a:F. 0 < f a)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   278
by (etac finite_induct 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   279
by (Auto_tac);
7454
bde978e3d9bb no_qed;
wenzelm
parents: 6162
diff changeset
   280
no_qed();
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   281
val lemma = result();
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   282
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   283
Goal "[| setsum f F = Suc n; finite F |] ==> ? a:F. 0 < f a";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   284
by (dtac lemma 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   285
by (Fast_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   286
qed "setsum_SucD";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   287
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   288
Goal "[| finite F; 0 < f a |] ==> \
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   289
\     setsum (f(a:=f(a)-1)) F = (if a:F then setsum f F - 1 else setsum f F)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   290
by (etac finite_induct 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   291
by (Auto_tac);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   292
 by (asm_simp_tac (simpset() addsimps add_ac) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   293
by (dres_inst_tac [("a","a")] mk_disjoint_insert 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   294
by (Auto_tac);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   295
qed "setsum_decr";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   296
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   297
val prems = Goalw [multiset_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   298
 "[| P(%a.0); \
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   299
\    !!f b. [| f : multiset; P(f) |] ==> P(f(b:=f(b)+1)) |] \
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   300
\  ==> !f. f : multiset --> setsum f {x. 0 < f x} = n --> P(f)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   301
by (induct_tac "n" 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   302
 by (Asm_simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   303
 by (Clarify_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   304
 by (subgoal_tac "f = (%a.0)" 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   305
  by (Asm_simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   306
  by (resolve_tac prems 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   307
 by (rtac ext 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   308
 by (Force_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   309
by (Clarify_tac 1);
7499
23e090051cb8 isatool expandshort;
wenzelm
parents: 7454
diff changeset
   310
by (ftac setsum_SucD 1);
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   311
 by (assume_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   312
by (Clarify_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   313
by (rename_tac "a" 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   314
by (subgoal_tac "finite{x. 0 < (f(a:=f(a)-1)) x}" 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   315
 by (etac (rotate_prems 1 finite_subset) 2);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   316
 by (Simp_tac 2);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   317
 by (Blast_tac 2);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   318
by (subgoal_tac
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   319
   "f = (f(a:=f(a)-1))(a:=(f(a:=f(a)-1))a+1)" 1);
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   320
 by (rtac ext 2);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   321
 by (Asm_simp_tac 2);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   322
by (EVERY1[etac ssubst, resolve_tac prems]);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   323
 by (Blast_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   324
by (EVERY[etac allE 1, etac impE 1, etac mp 2]);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   325
 by (Blast_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   326
by (asm_simp_tac (simpset() addsimps [setsum_decr] delsimps [fun_upd_apply]) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   327
by (subgoal_tac "{x. x ~= a --> 0 < f x} = {x. 0 < f x}" 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   328
 by (Blast_tac 2);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   329
by (subgoal_tac "{x. x ~= a & 0 < f x} = {x. 0 < f x} - {a}" 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   330
 by (Blast_tac 2);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   331
by (asm_simp_tac (simpset() addsimps [le_imp_diff_is_add,setsum_diff1]
5983
79e301a6a51b At last: linear arithmetic for nat!
nipkow
parents: 5772
diff changeset
   332
                           addcongs [conj_cong]) 1);
7454
bde978e3d9bb no_qed;
wenzelm
parents: 6162
diff changeset
   333
no_qed();
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   334
val lemma = result();
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   335
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   336
val major::prems = Goal
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   337
 "[| f : multiset; \
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   338
\    P(%a.0); \
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   339
\    !!f b. [| f : multiset; P(f) |] ==> P(f(b:=f(b)+1)) |] ==> P(f)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   340
by (rtac (major RSN (3, lemma RS spec RS mp RS mp)) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   341
by (REPEAT(ares_tac (refl::prems) 1));
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   342
qed "Rep_multiset_induct";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   343
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   344
val [prem1,prem2] = Goalw [union_def,single_def,empty_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   345
 "[| P({#}); !!M x. P(M) ==> P(M + {#x#}) |] ==> P(M)";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   346
by (rtac (Rep_multiset_inverse RS subst) 1);
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   347
by (rtac (Rep_multiset RS Rep_multiset_induct) 1);
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   348
 by (rtac prem1 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   349
by (Clarify_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   350
by (subgoal_tac
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   351
    "f(b := f b + 1) = (%a. f a + (if a = b then 1 else 0))" 1);
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   352
 by (Simp_tac 2);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   353
by (etac ssubst 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   354
by (etac (Abs_multiset_inverse RS subst) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   355
by (etac(simplify (simpset()) prem2)1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   356
qed "multiset_induct";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   357
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   358
Delsimps [multiset_eq_conv_Rep_eq, expand_fun_eq];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   359
Delsimps [Abs_multiset_inverse,Rep_multiset_inverse,Rep_multiset];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   360
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   361
Goal
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   362
 "(M+{#a#} = N+{#b#}) = (M = N & a = b | (? K. M = K+{#b#} & N = K+{#a#}))";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   363
by (simp_tac (simpset() addsimps [add_eq_conv_diff]) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   364
by (Auto_tac);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   365
qed "add_eq_conv_ex";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   366
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   367
(** order **)
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   368
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   369
Goalw [mult1_def] "(M, {#}) ~: mult1(r)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   370
by (Simp_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   371
qed "not_less_empty";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   372
AddIffs [not_less_empty];
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   373
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   374
Goalw [mult1_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   375
 "(N,M0 + {#a#}) : mult1(r) = \
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   376
\ ((? M. (M,M0) : mult1(r) & N = M + {#a#}) | \
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   377
\  (? K. (!b. elem K b --> (b,a) : r) & N = M0 + K))";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   378
by (rtac iffI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   379
 by (asm_full_simp_tac (simpset() addsimps [add_eq_conv_ex]) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   380
 by (Clarify_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   381
 by (etac disjE 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   382
  by (Blast_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   383
 by (Clarify_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   384
 by (res_inst_tac [("x","Ka+K")] exI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   385
 by (simp_tac (simpset() addsimps union_ac) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   386
 by (Blast_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   387
by (etac disjE 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   388
 by (Clarify_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   389
 by (res_inst_tac [("x","aa")] exI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   390
 by (res_inst_tac [("x","M0+{#a#}")] exI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   391
 by (res_inst_tac [("x","K")] exI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   392
 by (simp_tac (simpset() addsimps union_ac) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   393
by (Blast_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   394
qed "less_add_conv";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   395
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   396
Open_locale "MSOrd";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   397
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   398
val W_def = thm "W_def";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   399
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   400
Goalw [W_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   401
 "[| !b. (b,a) : r --> (!M : W. M+{#b#} : W); M0 : W; \
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   402
\    !M. (M,M0) : mult1(r) --> M+{#a#} : W |] \
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   403
\ ==> M0+{#a#} : W";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   404
by (rtac accI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   405
by (rename_tac "N" 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   406
by (full_simp_tac (simpset() addsimps [less_add_conv]) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   407
by (etac disjE 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   408
 by (Blast_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   409
by (Clarify_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   410
by (rotate_tac ~1 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   411
by (etac rev_mp 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   412
by (res_inst_tac [("M","K")] multiset_induct 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   413
 by (Asm_simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   414
by (simp_tac (simpset() addsimps [union_assoc RS sym]) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   415
by (Blast_tac 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   416
qed "lemma1";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   417
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   418
Goalw [W_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   419
 "[| !b. (b,a) : r --> (!M : W. M+{#b#} : W); M : W |] ==> M+{#a#} : W";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   420
by (etac acc_induct 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   421
by (blast_tac (claset() addIs [export lemma1]) 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   422
qed "lemma2";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   423
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   424
Goalw [W_def]
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   425
 "wf(r) ==> !M:W. M+{#a#} : W";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   426
by (eres_inst_tac [("a","a")] wf_induct 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   427
by (blast_tac (claset() addIs [export lemma2]) 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   428
qed "lemma3";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   429
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   430
Goalw [W_def] "wf(r) ==> M : W";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   431
by (res_inst_tac [("M","M")] multiset_induct 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   432
 by (rtac accI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   433
 by (Asm_full_simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   434
by (blast_tac (claset() addDs [export lemma3]) 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   435
qed "all_accessible";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   436
6024
cb87f103d114 new Close_locale synatx
paulson
parents: 5983
diff changeset
   437
Close_locale "MSOrd";
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   438
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   439
Goal "wf(r) ==> wf(mult1 r)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   440
by (blast_tac (claset() addIs [acc_wfI, export all_accessible]) 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   441
qed "wf_mult1";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   442
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   443
Goalw [mult_def] "wf(r) ==> wf(mult r)";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   444
by (blast_tac (claset() addIs [wf_trancl,wf_mult1]) 1);
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   445
qed "wf_mult";
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   446
5772
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   447
(** Equivalence of mult with the usual (closure-free) def **)
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   448
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   449
(* Badly needed: a linear arithmetic tactic for multisets *)
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   450
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   451
Goal "elem J a ==> I+J - {#a#} = I + (J-{#a#})";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   452
by (asm_simp_tac (simpset() addsimps [multiset_eq_conv_count_eq]) 1);
5772
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   453
qed "diff_union_single_conv";
5628
15b7f12ad919 Multisets at last!
nipkow
parents:
diff changeset
   454
5772
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   455
(* One direction *)
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   456
Goalw [mult_def,mult1_def,set_of_def]
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   457
 "trans r ==> \
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   458
\ (M,N) : mult r ==> (? I J K. N = I+J & M = I+K & J ~= {#} & \
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   459
\                            (!k : set_of K. ? j : set_of J. (k,j) : r))";
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   460
by (etac converse_trancl_induct 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   461
 by (Clarify_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   462
 by (res_inst_tac [("x","M0")] exI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   463
 by (Simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   464
by (Clarify_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   465
by (case_tac "elem K a" 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   466
 by (res_inst_tac [("x","I")] exI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   467
 by (Simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   468
 by (res_inst_tac [("x","(K - {#a#}) + Ka")] exI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   469
 by (asm_simp_tac (simpset() addsimps [union_assoc RS sym]) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   470
 by (dres_inst_tac[("f","%M. M-{#a#}")] arg_cong 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   471
 by (asm_full_simp_tac (simpset() addsimps [diff_union_single_conv]) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   472
 by (full_simp_tac (simpset() addsimps [trans_def]) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   473
 by (Blast_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   474
by (subgoal_tac "elem I a" 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   475
 by (res_inst_tac [("x","I-{#a#}")] exI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   476
 by (res_inst_tac [("x","J+{#a#}")] exI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   477
 by (res_inst_tac [("x","K + Ka")] exI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   478
 by (rtac conjI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   479
  by (asm_simp_tac (simpset() addsimps [multiset_eq_conv_count_eq]
5772
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   480
                             addsplits [nat_diff_split]) 1);
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   481
 by (rtac conjI 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   482
  by (dres_inst_tac[("f","%M. M-{#a#}")] arg_cong 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   483
  by (Asm_full_simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   484
  by (asm_simp_tac (simpset() addsimps [multiset_eq_conv_count_eq]
5772
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   485
                             addsplits [nat_diff_split]) 1);
6162
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   486
 by (full_simp_tac (simpset() addsimps [trans_def]) 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   487
 by (Blast_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   488
by (subgoal_tac "elem (M0 +{#a#}) a" 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   489
 by (Asm_full_simp_tac 1);
484adda70b65 expandshort
paulson
parents: 6024
diff changeset
   490
by (Simp_tac 1);
5772
d52d61a66c32 Some more proofs.
nipkow
parents: 5758
diff changeset
   491
qed "mult_implies_one_step";