# HG changeset patch # User wenzelm # Date 1430495544 -7200 # Node ID ff6c4ff5e7ab7170b8795d294be96fa8c438dfaa # Parent 29c826137153659a8dc86796eb16ca090fb9c4a3 tuned spelling; diff -r 29c826137153 -r ff6c4ff5e7ab src/HOL/Predicate.thy --- a/src/HOL/Predicate.thy Fri May 01 11:36:16 2015 +0100 +++ b/src/HOL/Predicate.thy Fri May 01 17:52:24 2015 +0200 @@ -215,50 +215,57 @@ by (auto simp add: is_empty_def) definition singleton :: "(unit \ 'a) \ 'a pred \ 'a" where - "singleton dfault A = (if \!x. eval A x then THE x. eval A x else dfault ())" + "\default. singleton default A = (if \!x. eval A x then THE x. eval A x else default ())" lemma singleton_eqI: - "\!x. eval A x \ eval A x \ singleton dfault A = x" + fixes default + shows "\!x. eval A x \ eval A x \ singleton default A = x" by (auto simp add: singleton_def) lemma eval_singletonI: - "\!x. eval A x \ eval A (singleton dfault A)" + fixes default + shows "\!x. eval A x \ eval A (singleton default A)" proof - assume assm: "\!x. eval A x" then obtain x where x: "eval A x" .. - with assm have "singleton dfault A = x" by (rule singleton_eqI) + with assm have "singleton default A = x" by (rule singleton_eqI) with x show ?thesis by simp qed lemma single_singleton: - "\!x. eval A x \ single (singleton dfault A) = A" + fixes default + shows "\!x. eval A x \ single (singleton default A) = A" proof - assume assm: "\!x. eval A x" - then have "eval A (singleton dfault A)" + then have "eval A (singleton default A)" by (rule eval_singletonI) - moreover from assm have "\x. eval A x \ singleton dfault A = x" + moreover from assm have "\x. eval A x \ singleton default A = x" by (rule singleton_eqI) - ultimately have "eval (single (singleton dfault A)) = eval A" + ultimately have "eval (single (singleton default A)) = eval A" by (simp (no_asm_use) add: single_def fun_eq_iff) blast - then have "\x. eval (single (singleton dfault A)) x = eval A x" + then have "\x. eval (single (singleton default A)) x = eval A x" by simp then show ?thesis by (rule pred_eqI) qed lemma singleton_undefinedI: - "\ (\!x. eval A x) \ singleton dfault A = dfault ()" + fixes default + shows "\ (\!x. eval A x) \ singleton default A = default ()" by (simp add: singleton_def) lemma singleton_bot: - "singleton dfault \ = dfault ()" + fixes default + shows "singleton default \ = default ()" by (auto simp add: bot_pred_def intro: singleton_undefinedI) lemma singleton_single: - "singleton dfault (single x) = x" + fixes default + shows "singleton default (single x) = x" by (auto simp add: intro: singleton_eqI singleI elim: singleE) lemma singleton_sup_single_single: - "singleton dfault (single x \ single y) = (if x = y then x else dfault ())" + fixes default + shows "singleton default (single x \ single y) = (if x = y then x else default ())" proof (cases "x = y") case True then show ?thesis by (simp add: singleton_single) next @@ -268,25 +275,27 @@ by (auto intro: supI1 supI2 singleI) with False have "\ (\!z. eval (single x \ single y) z)" by blast - then have "singleton dfault (single x \ single y) = dfault ()" + then have "singleton default (single x \ single y) = default ()" by (rule singleton_undefinedI) with False show ?thesis by simp qed lemma singleton_sup_aux: - "singleton dfault (A \ B) = (if A = \ then singleton dfault B - else if B = \ then singleton dfault A - else singleton dfault - (single (singleton dfault A) \ single (singleton dfault B)))" + fixes default + shows + "singleton default (A \ B) = (if A = \ then singleton default B + else if B = \ then singleton default A + else singleton default + (single (singleton default A) \ single (singleton default B)))" proof (cases "(\!x. eval A x) \ (\!y. eval B y)") case True then show ?thesis by (simp add: single_singleton) next case False from False have A_or_B: - "singleton dfault A = dfault () \ singleton dfault B = dfault ()" + "singleton default A = default () \ singleton default B = default ()" by (auto intro!: singleton_undefinedI) - then have rhs: "singleton dfault - (single (singleton dfault A) \ single (singleton dfault B)) = dfault ()" + then have rhs: "singleton default + (single (singleton default A) \ single (singleton default B)) = default ()" by (auto simp add: singleton_sup_single_single singleton_single) from False have not_unique: "\ (\!x. eval A x) \ \ (\!y. eval B y)" by simp @@ -296,7 +305,7 @@ by (blast elim: not_bot) with True not_unique have "\ (\!x. eval (A \ B) x)" by (auto simp add: sup_pred_def bot_pred_def) - then have "singleton dfault (A \ B) = dfault ()" by (rule singleton_undefinedI) + then have "singleton default (A \ B) = default ()" by (rule singleton_undefinedI) with True rhs show ?thesis by simp next case False then show ?thesis by auto @@ -304,10 +313,12 @@ qed lemma singleton_sup: - "singleton dfault (A \ B) = (if A = \ then singleton dfault B - else if B = \ then singleton dfault A - else if singleton dfault A = singleton dfault B then singleton dfault A else dfault ())" -using singleton_sup_aux [of dfault A B] by (simp only: singleton_sup_single_single) + fixes default + shows + "singleton default (A \ B) = (if A = \ then singleton default B + else if B = \ then singleton default A + else if singleton default A = singleton default B then singleton default A else default ())" + using singleton_sup_aux [of default A B] by (simp only: singleton_sup_single_single) subsection {* Derived operations *} @@ -554,28 +565,34 @@ by (simp add: null_is_empty Seq_def) primrec the_only :: "(unit \ 'a) \ 'a seq \ 'a" where - [code del]: "the_only dfault Empty = dfault ()" -| "the_only dfault (Insert x P) = (if is_empty P then x else let y = singleton dfault P in if x = y then x else dfault ())" -| "the_only dfault (Join P xq) = (if is_empty P then the_only dfault xq else if null xq then singleton dfault P - else let x = singleton dfault P; y = the_only dfault xq in - if x = y then x else dfault ())" + [code del]: "\default. the_only default Empty = default ()" +| "\default. the_only default (Insert x P) = + (if is_empty P then x else let y = singleton default P in if x = y then x else default ())" +| "\default. the_only default (Join P xq) = + (if is_empty P then the_only default xq else if null xq then singleton default P + else let x = singleton default P; y = the_only default xq in + if x = y then x else default ())" lemma the_only_singleton: - "the_only dfault xq = singleton dfault (pred_of_seq xq)" + fixes default + shows "the_only default xq = singleton default (pred_of_seq xq)" by (induct xq) (auto simp add: singleton_bot singleton_single is_empty_def null_is_empty Let_def singleton_sup) lemma singleton_code [code]: - "singleton dfault (Seq f) = (case f () - of Empty \ dfault () + fixes default + shows + "singleton default (Seq f) = + (case f () of + Empty \ default () | Insert x P \ if is_empty P then x - else let y = singleton dfault P in - if x = y then x else dfault () - | Join P xq \ if is_empty P then the_only dfault xq - else if null xq then singleton dfault P - else let x = singleton dfault P; y = the_only dfault xq in - if x = y then x else dfault ())" + else let y = singleton default P in + if x = y then x else default () + | Join P xq \ if is_empty P then the_only default xq + else if null xq then singleton default P + else let x = singleton default P; y = the_only default xq in + if x = y then x else default ())" by (cases "f ()") (auto simp add: Seq_def the_only_singleton is_empty_def null_is_empty singleton_bot singleton_single singleton_sup Let_def)