# HG changeset patch # User wenzelm # Date 1332195438 -3600 # Node ID e3a3f161ad70e21a1a34d3942ee620ed96baabb3 # Parent fc3bb6c02a3c03e593abfc689cdc36cc805a82ac tuned proofs; diff -r fc3bb6c02a3c -r e3a3f161ad70 src/HOL/ex/Set_Algebras.thy --- a/src/HOL/ex/Set_Algebras.thy Mon Mar 19 23:08:27 2012 +0100 +++ b/src/HOL/ex/Set_Algebras.thy Mon Mar 19 23:17:18 2012 +0100 @@ -29,57 +29,59 @@ abbreviation (input) elt_set_eq :: "'a \ 'a set \ bool" (infix "=o" 50) where "x =o A \ x \ A" -interpretation set_add!: semigroup "set_plus :: 'a::semigroup_add set \ 'a set \ 'a set" proof -qed (force simp add: set_plus_def add.assoc) +interpretation set_add!: semigroup "set_plus :: 'a::semigroup_add set \ 'a set \ 'a set" + by default (force simp add: set_plus_def add.assoc) -interpretation set_add!: abel_semigroup "set_plus :: 'a::ab_semigroup_add set \ 'a set \ 'a set" proof -qed (force simp add: set_plus_def add.commute) +interpretation set_add!: abel_semigroup "set_plus :: 'a::ab_semigroup_add set \ 'a set \ 'a set" + by default (force simp add: set_plus_def add.commute) -interpretation set_add!: monoid "set_plus :: 'a::monoid_add set \ 'a set \ 'a set" "{0}" proof -qed (simp_all add: set_plus_def) +interpretation set_add!: monoid "set_plus :: 'a::monoid_add set \ 'a set \ 'a set" "{0}" + by default (simp_all add: set_plus_def) -interpretation set_add!: comm_monoid "set_plus :: 'a::comm_monoid_add set \ 'a set \ 'a set" "{0}" proof -qed (simp add: set_plus_def) +interpretation set_add!: comm_monoid "set_plus :: 'a::comm_monoid_add set \ 'a set \ 'a set" "{0}" + by default (simp add: set_plus_def) interpretation set_add!: monoid_add "set_plus :: 'a::monoid_add set \ 'a set \ 'a set" "{0}" defines listsum_set is set_add.listsum -proof -qed (simp_all add: set_add.assoc) + by default (simp_all add: set_add.assoc) -interpretation set_add!: comm_monoid_add "set_plus :: 'a::comm_monoid_add set \ 'a set \ 'a set" "{0}" +interpretation + set_add!: comm_monoid_add "set_plus :: 'a::comm_monoid_add set \ 'a set \ 'a set" "{0}" defines setsum_set is set_add.setsum where "monoid_add.listsum set_plus {0::'a} = listsum_set" proof - - show "class.comm_monoid_add (set_plus :: 'a set \ 'a set \ 'a set) {0}" proof - qed (simp_all add: set_add.commute) + show "class.comm_monoid_add (set_plus :: 'a set \ 'a set \ 'a set) {0}" + by default (simp_all add: set_add.commute) then interpret set_add!: comm_monoid_add "set_plus :: 'a set \ 'a set \ 'a set" "{0}" . show "monoid_add.listsum set_plus {0::'a} = listsum_set" by (simp only: listsum_set_def) qed -interpretation set_mult!: semigroup "set_times :: 'a::semigroup_mult set \ 'a set \ 'a set" proof -qed (force simp add: set_times_def mult.assoc) +interpretation set_mult!: semigroup "set_times :: 'a::semigroup_mult set \ 'a set \ 'a set" + by default (force simp add: set_times_def mult.assoc) -interpretation set_mult!: abel_semigroup "set_times :: 'a::ab_semigroup_mult set \ 'a set \ 'a set" proof -qed (force simp add: set_times_def mult.commute) +interpretation + set_mult!: abel_semigroup "set_times :: 'a::ab_semigroup_mult set \ 'a set \ 'a set" + by default (force simp add: set_times_def mult.commute) -interpretation set_mult!: monoid "set_times :: 'a::monoid_mult set \ 'a set \ 'a set" "{1}" proof -qed (simp_all add: set_times_def) +interpretation set_mult!: monoid "set_times :: 'a::monoid_mult set \ 'a set \ 'a set" "{1}" + by default (simp_all add: set_times_def) -interpretation set_mult!: comm_monoid "set_times :: 'a::comm_monoid_mult set \ 'a set \ 'a set" "{1}" proof -qed (simp add: set_times_def) +interpretation + set_mult!: comm_monoid "set_times :: 'a::comm_monoid_mult set \ 'a set \ 'a set" "{1}" + by default (simp add: set_times_def) interpretation set_mult!: monoid_mult "{1}" "set_times :: 'a::monoid_mult set \ 'a set \ 'a set" defines power_set is set_mult.power -proof -qed (simp_all add: set_mult.assoc) + by default (simp_all add: set_mult.assoc) -interpretation set_mult!: comm_monoid_mult "set_times :: 'a::comm_monoid_mult set \ 'a set \ 'a set" "{1}" +interpretation + set_mult!: comm_monoid_mult "set_times :: 'a::comm_monoid_mult set \ 'a set \ 'a set" "{1}" defines setprod_set is set_mult.setprod where "power.power {1} set_times = power_set" proof - - show "class.comm_monoid_mult (set_times :: 'a set \ 'a set \ 'a set) {1}" proof - qed (simp_all add: set_mult.commute) + show "class.comm_monoid_mult (set_times :: 'a set \ 'a set \ 'a set) {1}" + by default (simp_all add: set_mult.commute) then interpret set_mult!: comm_monoid_mult "set_times :: 'a set \ 'a set \ 'a set" "{1}" . show "power.power {1} set_times = power_set" by (simp add: power_set_def) @@ -91,8 +93,7 @@ lemma set_plus_intro2 [intro]: "b : C ==> a + b : a +o C" by (auto simp add: elt_set_plus_def) -lemma set_plus_rearrange: "((a::'a::comm_monoid_add) +o C) \ - (b +o D) = (a + b) +o (C \ D)" +lemma set_plus_rearrange: "((a::'a::comm_monoid_add) +o C) \ (b +o D) = (a + b) +o (C \ D)" apply (auto simp add: elt_set_plus_def set_plus_def add_ac) apply (rule_tac x = "ba + bb" in exI) apply (auto simp add: add_ac) @@ -100,12 +101,10 @@ apply (auto simp add: add_ac) done -lemma set_plus_rearrange2: "(a::'a::semigroup_add) +o (b +o C) = - (a + b) +o C" +lemma set_plus_rearrange2: "(a::'a::semigroup_add) +o (b +o C) = (a + b) +o C" by (auto simp add: elt_set_plus_def add_assoc) -lemma set_plus_rearrange3: "((a::'a::semigroup_add) +o B) \ C = - a +o (B \ C)" +lemma set_plus_rearrange3: "((a::'a::semigroup_add) +o B) \ C = a +o (B \ C)" apply (auto simp add: elt_set_plus_def set_plus_def) apply (blast intro: add_ac) apply (rule_tac x = "a + aa" in exI) @@ -116,8 +115,7 @@ apply (auto simp add: add_ac) done -theorem set_plus_rearrange4: "C \ ((a::'a::comm_monoid_add) +o D) = - a +o (C \ D)" +theorem set_plus_rearrange4: "C \ ((a::'a::comm_monoid_add) +o D) = a +o (C \ D)" apply (auto intro!: simp add: elt_set_plus_def set_plus_def add_ac) apply (rule_tac x = "aa + ba" in exI) apply (auto simp add: add_ac) @@ -327,18 +325,22 @@ assumes fin: "finite I" shows "setsum_set S I = {setsum s I |s. \i\I. s i \ S i}" (is "_ = ?setsum I") -using fin proof induct +using fin +proof induct case (insert x F) have "setsum_set S (insert x F) = S x \ ?setsum F" using insert.hyps by auto also have "...= {s x + setsum s F |s. \ i\insert x F. s i \ S i}" - unfolding set_plus_def - proof safe - fix y s assume "y \ S x" "\i\F. s i \ S i" - then show "\s'. y + setsum s F = s' x + setsum s' F \ (\i\insert x F. s' i \ S i)" - using insert.hyps - by (intro exI[of _ "\i. if i \ F then s i else y"]) (auto simp add: set_plus_def) - qed auto + proof - + { + fix y s assume "y \ S x" "\i\F. s i \ S i" + then have "\s'. y + setsum s F = s' x + setsum s' F \ (\i\insert x F. s' i \ S i)" + using insert.hyps + by (intro exI[of _ "\i. if i \ F then s i else y"]) (auto simp add: set_plus_def) + } + then show ?thesis + unfolding set_plus_def by auto + qed finally show ?case using insert.hyps by auto qed auto