# HG changeset patch # User krauss # Date 1158240428 -7200 # Node ID f088edff8af85d7d4ca3b63bb33ad39e8314cf92 # Parent b4b3933ec026f62f7655cc597aecabea49e36212 Function package: Outside their domain functions now return "arbitrary". diff -r b4b3933ec026 -r f088edff8af8 src/HOL/FunDef.thy --- a/src/HOL/FunDef.thy Thu Sep 14 15:25:23 2006 +0200 +++ b/src/HOL/FunDef.thy Thu Sep 14 15:27:08 2006 +0200 @@ -23,25 +23,42 @@ ("Tools/function_package/auto_term.ML") begin + +definition + THE_default :: "'a \ ('a \ bool) \ 'a" + "THE_default d P = (if (\!x. P x) then (THE x. P x) else d)" + +lemma THE_defaultI': "\!x. P x \ P (THE_default d P)" + by (simp add:theI' THE_default_def) + +lemma THE_default1_equality: + "\\!x. P x; P a\ \ THE_default d P = a" + by (simp add:the1_equality THE_default_def) + +lemma THE_default_none: + "\(\!x. P x) \ THE_default d P = d" +by (simp add:THE_default_def) + + lemma fundef_ex1_existence: -assumes f_def: "f \ \x. THE y. (x,y)\G" +assumes f_def: "f \ \x. THE_default d (\y. (x,y)\G)" assumes ex1: "\!y. (x,y)\G" shows "(x, f x)\G" - by (simp only:f_def, rule theI', rule ex1) + by (simp only:f_def, rule THE_defaultI', rule ex1) lemma fundef_ex1_uniqueness: -assumes f_def: "f \ \x. THE y. (x,y)\G" +assumes f_def: "f \ \x. THE_default d (\y. (x,y)\G)" assumes ex1: "\!y. (x,y)\G" assumes elm: "(x, h x)\G" shows "h x = f x" - by (simp only:f_def, rule the1_equality[symmetric], rule ex1, rule elm) + by (simp only:f_def, rule THE_default1_equality[symmetric], rule ex1, rule elm) lemma fundef_ex1_iff: -assumes f_def: "f \ \x. THE y. (x,y)\G" +assumes f_def: "f \ \x. THE_default d (\y. (x,y)\G)" assumes ex1: "\!y. (x,y)\G" shows "((x, y)\G) = (f x = y)" - apply (auto simp:ex1 f_def the1_equality) - by (rule theI', rule ex1) + apply (auto simp:ex1 f_def THE_default1_equality) + by (rule THE_defaultI', rule ex1) subsection {* Projections *} diff -r b4b3933ec026 -r f088edff8af8 src/HOL/Tools/function_package/fundef_prep.ML --- a/src/HOL/Tools/function_package/fundef_prep.ML Thu Sep 14 15:25:23 2006 +0200 +++ b/src/HOL/Tools/function_package/fundef_prep.ML Thu Sep 14 15:27:08 2006 +0200 @@ -422,7 +422,7 @@ fun define_function fdefname (fname, mixfix) domT ranT G lthy = let val f_def = - Abs ("x", domT, Const ("The", (ranT --> boolT) --> ranT) $ + Abs ("x", domT, Const ("FunDef.THE_default", ranT --> (ranT --> boolT) --> ranT) $ Const ("arbitrary", ranT) $ Abs ("y", ranT, mk_relmemT domT ranT (Bound 1, Bound 0) G)) val ((f, (_, f_defthm)), lthy) = LocalTheory.def ((fname ^ "C", mixfix), ((fdefname, []), f_def)) lthy diff -r b4b3933ec026 -r f088edff8af8 src/HOL/ex/Fundefs.thy --- a/src/HOL/ex/Fundefs.thy Thu Sep 14 15:25:23 2006 +0200 +++ b/src/HOL/ex/Fundefs.thy Thu Sep 14 15:27:08 2006 +0200 @@ -9,10 +9,8 @@ imports Main begin - section {* Very basic *} -ML "trace_simp := false" fun fib :: "nat \ nat" where @@ -59,7 +57,6 @@ "nz 0 = 0" | "nz (Suc x) = nz (nz x)" - lemma nz_is_zero: -- {* A lemma we need to prove termination *} assumes trm: "x \ nz_dom" shows "nz x = 0" @@ -123,7 +120,6 @@ thm gcd2.simps thm gcd2.induct - subsection {* Guards *} text {* We can reformulate the above example using guarded patterns *}