src/ZF/UNITY/MultisetSum.thy
author schirmer
Sun, 05 Jun 2005 16:23:50 +0200
changeset 16281 de9815628d33
parent 15202 d14a6e421a65
child 24893 b8ef7afe3a6b
permissions -rw-r--r--
bugfix in record_type_abbr_tr'
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14052
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
     1
(*  Title:      ZF/UNITY/MultusetSum.thy
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
     2
    ID:         $Id$
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
     3
    Author:     Sidi O Ehmety
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
     4
*)
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
     5
15202
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
     6
header {*Setsum for Multisets*}
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
     7
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
     8
theory MultisetSum
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
     9
imports "../Induct/Multiset"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    10
begin
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    11
14052
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    12
constdefs
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    13
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    14
  lcomm :: "[i, i, [i,i]=>i]=>o"
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    15
  "lcomm(A, B, f) ==
15202
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    16
   (\<forall>x \<in> A. \<forall>y \<in> A. \<forall>z \<in> B. f(x, f(y, z))= f(y, f(x, z)))  &
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    17
   (\<forall>x \<in> A. \<forall>y \<in> B. f(x, y) \<in> B)"
14052
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    18
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    19
  general_setsum :: "[i,i,i, [i,i]=>i, i=>i] =>i"
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    20
   "general_setsum(C, B, e, f, g) ==
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    21
    if Finite(C) then fold[cons(e, B)](%x y. f(g(x), y), e, C) else e"
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    22
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    23
  msetsum :: "[i=>i, i, i]=>i"
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    24
  "msetsum(g, C, B) == normalize(general_setsum(C, Mult(B), 0, op +#, g))"
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    25
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    26
  (* sum for naturals *)
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    27
  nsetsum :: "[i=>i, i] =>i"
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
    28
  "nsetsum(g, C) == general_setsum(C, nat, 0, op #+, g)"
15202
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    29
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    30
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    31
lemma mset_of_normalize: "mset_of(normalize(M)) \<subseteq> mset_of(M)"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    32
by (auto simp add: mset_of_def normalize_def)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    33
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    34
lemma general_setsum_0 [simp]: "general_setsum(0, B, e, f, g) = e"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    35
by (simp add: general_setsum_def)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    36
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    37
lemma general_setsum_cons [simp]: 
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    38
"[| C \<in> Fin(A); a \<in> A; a\<notin>C; e \<in> B; \<forall>x \<in> A. g(x) \<in> B; lcomm(B, B, f) |] ==>  
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    39
  general_setsum(cons(a, C), B, e, f, g) =  
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    40
    f(g(a), general_setsum(C, B, e, f,g))"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    41
apply (simp add: general_setsum_def)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    42
apply  (auto simp add: Fin_into_Finite [THEN Finite_cons] cons_absorb)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    43
prefer 2 apply (blast dest: Fin_into_Finite)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    44
apply (rule fold_typing.fold_cons)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    45
apply (auto simp add: fold_typing_def lcomm_def)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    46
done
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    47
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    48
(** lcomm **)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    49
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    50
lemma lcomm_mono: "[| C\<subseteq>A; lcomm(A, B, f) |] ==> lcomm(C, B,f)"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    51
by (auto simp add: lcomm_def, blast)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    52
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    53
lemma munion_lcomm [simp]: "lcomm(Mult(A), Mult(A), op +#)"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    54
by (auto simp add: lcomm_def Mult_iff_multiset munion_lcommute)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    55
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    56
(** msetsum **)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    57
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    58
lemma multiset_general_setsum: 
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    59
     "[| C \<in> Fin(A); \<forall>x \<in> A. multiset(g(x))& mset_of(g(x))\<subseteq>B  |]   
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    60
      ==> multiset(general_setsum(C, B -||> nat - {0}, 0, \<lambda>u v. u +# v, g))"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    61
apply (erule Fin_induct, auto)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    62
apply (subst general_setsum_cons)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    63
apply (auto simp add: Mult_iff_multiset)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    64
done
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    65
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    66
lemma msetsum_0 [simp]: "msetsum(g, 0, B) = 0"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    67
by (simp add: msetsum_def)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    68
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    69
lemma msetsum_cons [simp]: 
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    70
  "[| C \<in> Fin(A); a\<notin>C; a \<in> A; \<forall>x \<in> A. multiset(g(x)) & mset_of(g(x))\<subseteq>B  |]   
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    71
   ==> msetsum(g, cons(a, C), B) = g(a) +#  msetsum(g, C, B)"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    72
apply (simp add: msetsum_def)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    73
apply (subst general_setsum_cons)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    74
apply (auto simp add: multiset_general_setsum Mult_iff_multiset)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    75
done
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    76
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    77
(* msetsum type *)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    78
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    79
lemma msetsum_multiset: "multiset(msetsum(g, C, B))"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    80
by (simp add: msetsum_def)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    81
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    82
lemma mset_of_msetsum: 
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    83
     "[| C \<in> Fin(A); \<forall>x \<in> A. multiset(g(x)) & mset_of(g(x))\<subseteq>B |]   
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    84
      ==> mset_of(msetsum(g, C, B))\<subseteq>B"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    85
by (erule Fin_induct, auto)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    86
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    87
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    88
(*The reversed orientation looks more natural, but LOOPS as a simprule!*)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    89
lemma msetsum_Un_Int: 
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    90
     "[| C \<in> Fin(A); D \<in> Fin(A); \<forall>x \<in> A. multiset(g(x)) & mset_of(g(x))\<subseteq>B |]
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    91
      ==> msetsum(g, C Un D, B) +# msetsum(g, C Int D, B)  
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    92
        = msetsum(g, C, B) +# msetsum(g, D, B)"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    93
apply (erule Fin_induct)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    94
apply (subgoal_tac [2] "cons (x, y) Un D = cons (x, y Un D) ")
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    95
apply (auto simp add: msetsum_multiset)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    96
apply (subgoal_tac "y Un D \<in> Fin (A) & y Int D \<in> Fin (A) ")
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    97
apply clarify
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    98
apply (case_tac "x \<in> D")
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
    99
apply (subgoal_tac [2] "cons (x, y) Int D = y Int D")
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   100
apply (subgoal_tac "cons (x, y) Int D = cons (x, y Int D) ")
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   101
apply (simp_all (no_asm_simp) add: cons_absorb munion_assoc msetsum_multiset)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   102
apply (simp (no_asm_simp) add: munion_lcommute msetsum_multiset)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   103
apply auto
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   104
done
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   105
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   106
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   107
lemma msetsum_Un_disjoint:
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   108
     "[| C \<in> Fin(A); D \<in> Fin(A); C Int D = 0;  
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   109
         \<forall>x \<in> A. multiset(g(x)) & mset_of(g(x))\<subseteq>B |]  
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   110
      ==> msetsum(g, C Un D, B) = msetsum(g, C, B) +# msetsum(g,D, B)"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   111
apply (subst msetsum_Un_Int [symmetric])
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   112
apply (auto simp add: msetsum_multiset)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   113
done
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   114
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   115
lemma UN_Fin_lemma [rule_format (no_asm)]:
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   116
     "I \<in> Fin(A) ==> (\<forall>i \<in> I. C(i) \<in> Fin(B)) --> (\<Union>i \<in> I. C(i)):Fin(B)"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   117
by (erule Fin_induct, auto)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   118
 
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   119
lemma msetsum_UN_disjoint [rule_format (no_asm)]:
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   120
     "[| I \<in> Fin(K); \<forall>i \<in> K. C(i) \<in> Fin(A) |] ==>  
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   121
      (\<forall>x \<in> A. multiset(f(x)) & mset_of(f(x))\<subseteq>B) -->   
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   122
      (\<forall>i \<in> I. \<forall>j \<in> I. i\<noteq>j --> C(i) Int C(j) = 0) -->  
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   123
	msetsum(f, \<Union>i \<in> I. C(i), B) = msetsum (%i. msetsum(f, C(i),B), I, B)"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   124
apply (erule Fin_induct, auto)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   125
apply (subgoal_tac "\<forall>i \<in> y. x \<noteq> i")
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   126
 prefer 2 apply blast
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   127
apply (subgoal_tac "C(x) Int (\<Union>i \<in> y. C (i)) = 0")
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   128
 prefer 2 apply blast
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   129
apply (subgoal_tac " (\<Union>i \<in> y. C (i)):Fin (A) & C(x) :Fin (A) ")
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   130
prefer 2 apply (blast intro: UN_Fin_lemma dest: FinD, clarify)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   131
apply (simp (no_asm_simp) add: msetsum_Un_disjoint)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   132
apply (subgoal_tac "\<forall>x \<in> K. multiset (msetsum (f, C(x), B)) & mset_of (msetsum (f, C(x), B)) \<subseteq> B")
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   133
apply (simp (no_asm_simp))
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   134
apply clarify
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   135
apply (drule_tac x = xa in bspec)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   136
apply (simp_all (no_asm_simp) add: msetsum_multiset mset_of_msetsum)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   137
done
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   138
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   139
lemma msetsum_addf: 
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   140
    "[| C \<in> Fin(A);  
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   141
      \<forall>x \<in> A. multiset(f(x)) & mset_of(f(x))\<subseteq>B;  
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   142
      \<forall>x \<in> A. multiset(g(x)) & mset_of(g(x))\<subseteq>B |] ==> 
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   143
      msetsum(%x. f(x) +# g(x), C, B) = msetsum(f, C, B) +# msetsum(g, C, B)"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   144
apply (subgoal_tac "\<forall>x \<in> A. multiset (f(x) +# g(x)) & mset_of (f(x) +# g(x)) \<subseteq> B")
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   145
apply (erule Fin_induct)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   146
apply (auto simp add: munion_ac) 
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   147
done
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   148
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   149
lemma msetsum_cong: 
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   150
    "[| C=D; !!x. x \<in> D ==> f(x) = g(x) |]
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   151
     ==> msetsum(f, C, B) = msetsum(g, D, B)"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   152
by (simp add: msetsum_def general_setsum_def cong add: fold_cong)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   153
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   154
lemma multiset_union_diff: "[| multiset(M); multiset(N) |] ==> M +# N -# N = M"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   155
by (simp add: multiset_equality)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   156
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   157
lemma msetsum_Un: "[| C \<in> Fin(A); D \<in> Fin(A);  
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   158
  \<forall>x \<in> A. multiset(f(x)) & mset_of(f(x)) \<subseteq> B  |]  
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   159
   ==> msetsum(f, C Un D, B) =  
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   160
          msetsum(f, C, B) +# msetsum(f, D, B) -# msetsum(f, C Int D, B)"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   161
apply (subgoal_tac "C Un D \<in> Fin (A) & C Int D \<in> Fin (A) ")
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   162
apply clarify
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   163
apply (subst msetsum_Un_Int [symmetric])
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   164
apply (simp_all (no_asm_simp) add: msetsum_multiset multiset_union_diff)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   165
apply (blast dest: FinD)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   166
done
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   167
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   168
lemma nsetsum_0 [simp]: "nsetsum(g, 0)=0"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   169
by (simp add: nsetsum_def)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   170
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   171
lemma nsetsum_cons [simp]: 
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   172
     "[| Finite(C); x\<notin>C |] ==> nsetsum(g, cons(x, C))= g(x) #+ nsetsum(g, C)"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   173
apply (simp add: nsetsum_def general_setsum_def)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   174
apply (rule_tac A = "cons (x, C)" in fold_typing.fold_cons)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   175
apply (auto intro: Finite_cons_lemma simp add: fold_typing_def)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   176
done
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   177
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   178
lemma nsetsum_type [simp,TC]: "nsetsum(g, C) \<in> nat"
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   179
apply (case_tac "Finite (C) ")
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   180
 prefer 2 apply (simp add: nsetsum_def general_setsum_def)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   181
apply (erule Finite_induct, auto)
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   182
done
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   183
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   184
ML
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   185
{*
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   186
val mset_of_normalize = thm "mset_of_normalize";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   187
val general_setsum_0 = thm "general_setsum_0";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   188
val general_setsum_cons = thm "general_setsum_cons";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   189
val lcomm_mono = thm "lcomm_mono";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   190
val munion_lcomm = thm "munion_lcomm";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   191
val multiset_general_setsum = thm "multiset_general_setsum";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   192
val msetsum_0 = thm "msetsum_0";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   193
val msetsum_cons = thm "msetsum_cons";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   194
val msetsum_multiset = thm "msetsum_multiset";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   195
val mset_of_msetsum = thm "mset_of_msetsum";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   196
val msetsum_Un_Int = thm "msetsum_Un_Int";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   197
val msetsum_Un_disjoint = thm "msetsum_Un_disjoint";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   198
val UN_Fin_lemma = thm "UN_Fin_lemma";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   199
val msetsum_UN_disjoint = thm "msetsum_UN_disjoint";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   200
val msetsum_addf = thm "msetsum_addf";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   201
val msetsum_cong = thm "msetsum_cong";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   202
val multiset_union_diff = thm "multiset_union_diff";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   203
val msetsum_Un = thm "msetsum_Un";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   204
val nsetsum_0 = thm "nsetsum_0";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   205
val nsetsum_cons = thm "nsetsum_cons";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   206
val nsetsum_type = thm "nsetsum_type";
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   207
*}
d14a6e421a65 converting UNITY/MultisetSum.ML to Isar script
paulson
parents: 14052
diff changeset
   208
14052
e9c9f69e4f63 some new ZF/UNITY material from Sidi Ehmety
paulson
parents:
diff changeset
   209
end