(* Title: HOL/Fun_Def.thy Author: Alexander Krauss, TU Muenchen
*)
section \<open>Function Definitions and Termination Proofs\<close>
theory Fun_Def imports Basic_BNF_LFPs Partial_Function SAT
keywords "function""termination" :: thy_goal_defn and "fun""fun_cases" :: thy_defn begin
subsection \<open>Definitions with default value\<close>
definition THE_default :: "'a \ ('a \ bool) \ 'a" where"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::'a. THE_default (d x) (\y. G x y))" assumes ex1: "\!y. G x y" shows"G x (f x)" apply (simp only: f_def) apply (rule THE_defaultI') apply (rule ex1) done
lemma fundef_ex1_uniqueness: assumes f_def: "f \ (\x::'a. THE_default (d x) (\y. G x y))" assumes ex1: "\!y. G x y" assumes elm: "G x (h x)" shows"h x = f x" by (auto simp add: f_def ex1 elm THE_default1_equality[symmetric])
lemma fundef_ex1_iff: assumes f_def: "f \ (\x::'a. THE_default (d x) (\y. G x y))" assumes ex1: "\!y. G x y" shows"(G x y) = (f x = y)" by (auto simp add: ex1 f_def THE_default1_equality THE_defaultI')
lemma fundef_default_value: assumes f_def: "f \ (\x::'a. THE_default (d x) (\y. G x y))" assumes graph: "\x y. G x y \ D x" assumes"\ D x" shows"f x = d x" proof - have"\(\y. G x y)" proof assume"\y. G x y" thenhave"D x"using graph .. with\<open>\<not> D x\<close> show False .. qed thenhave"\(\!y. G x y)" by blast thenshow ?thesis unfolding f_def by (rule THE_default_none) qed
definition in_rel_def[simp]: "in_rel R x y \ (x, y) \ R"
lemma wf_in_rel: "wf R \ wfp (in_rel R)" by (simp add: wfp_def)
named_theorems measure_function "rules that guide the heuristic generation of measure functions"
ML_file \<open>Tools/Function/measure_functions.ML\<close>
lemma measure_size[measure_function]: "is_measure size" by (rule is_measure_trivial)
lemma measure_fst[measure_function]: "is_measure f \ is_measure (\p. f (fst p))" by (rule is_measure_trivial)
lemma measure_snd[measure_function]: "is_measure f \ is_measure (\p. f (snd p))" by (rule is_measure_trivial)
lemma size_prod_simp[termination_simp]: "size_prod f g p = f (fst p) + g (snd p) + Suc 0" by (induct p) auto
subsection \<open>Decomposition\<close>
lemma less_by_empty: "A = {} \ A \ B" and union_comp_emptyL: "A O C = {} \ B O C = {} \ (A \ B) O C = {}" and union_comp_emptyR: "A O B = {} \ A O C = {} \ A O (B \ C) = {}" and wf_no_loop: "R O R = {} \ wf R" by (auto simp add: wf_comp_self [of R])
subsection \<open>Reduction pairs\<close>
definition"reduction_pair P \ wf (fst P) \ fst P O snd P \ fst P"
lemma reduction_pairI[intro]: "wf R \ R O S \ R \ reduction_pair (R, S)" by (auto simp: reduction_pair_def)
lemma reduction_pair_lemma: assumes rp: "reduction_pair P" assumes"R \ fst P" assumes"S \ snd P" assumes"wf S" shows"wf (R \ S)" proof - from rp \<open>S \<subseteq> snd P\<close> have "wf (fst P)" "fst P O S \<subseteq> fst P" unfolding reduction_pair_def by auto with\<open>wf S\<close> have "wf (fst P \<union> S)" by (auto intro: wf_union_compatible) moreoverfrom\<open>R \<subseteq> fst P\<close> have "R \<union> S \<subseteq> fst P \<union> S" by auto ultimatelyshow ?thesis by (rule wf_subset) qed
definition"rp_inv_image = (\(R,S) f. (inv_image R f, inv_image S f))"
lemma rp_inv_image_rp: "reduction_pair P \ reduction_pair (rp_inv_image P f)" unfolding reduction_pair_def rp_inv_image_def split_def by force
subsection \<open>Concrete orders for SCNP termination proofs\<close>
lemma wf_pair_less[simp]: "wf pair_less" by (auto simp: pair_less_def)
lemma total_pair_less [iff]: "total_on A pair_less"and trans_pair_less [iff]: "trans pair_less" by (auto simp: total_on_def pair_less_def)
text\<open>Introduction rules for \<open>pair_less\<close>/\<open>pair_leq\<close>\<close> lemma pair_leqI1: "a < b \ ((a, s), (b, t)) \ pair_leq" and pair_leqI2: "a \ b \ s \ t \ ((a, s), (b, t)) \ pair_leq" and pair_lessI1: "a < b \ ((a, s), (b, t)) \ pair_less" and pair_lessI2: "a \ b \ s < t \ ((a, s), (b, t)) \ pair_less" by (auto simp: pair_leq_def pair_less_def)
lemma pair_less_iff1 [simp]: "((x,y), (x,z)) \ pair_less \ y by (simp add: pair_less_def)
text\<open>Introduction rules for max\<close> lemma smax_emptyI: "finite Y \ Y \ {} \ ({}, Y) \ max_strict" and smax_insertI: "y \ Y \ (x, y) \ pair_less \ (X, Y) \ max_strict \ (insert x X, Y) \ max_strict" and wmax_emptyI: "finite X \ ({}, X) \ max_weak" and wmax_insertI: "y \ YS \ (x, y) \ pair_leq \ (XS, YS) \ max_weak \ (insert x XS, YS) \ max_weak" by (auto simp: max_strict_def max_weak_def elim!: max_ext.cases)
text\<open>Introduction rules for min\<close> lemma smin_emptyI: "X \ {} \ (X, {}) \ min_strict" and smin_insertI: "x \ XS \ (x, y) \ pair_less \ (XS, YS) \ min_strict \ (XS, insert y YS) \ min_strict" and wmin_emptyI: "(X, {}) \ min_weak" and wmin_insertI: "x \ XS \ (x, y) \ pair_leq \ (XS, YS) \ min_weak \ (XS, insert y YS) \ min_weak" by (auto simp: min_strict_def min_weak_def min_ext_def)
text\<open>Reduction Pairs.\<close>
lemma max_ext_compat: assumes"R O S \ R" shows"max_ext R O (max_ext S \ {({}, {})}) \ max_ext R" proof - have"\X Y Z. (X, Y) \ max_ext R \ (Y, Z) \ max_ext S \ (X, Z) \ max_ext R" proof - fix X Y Z assume"(X,Y)\max_ext R" "(Y, Z)\max_ext S" thenhave *: "finite X""finite Y""finite Z""Y\{}" "Z\{}" "(\x. x\X \ \y\Y. (x, y)\R)" "(\y. y\Y \ \z\Z. (y, z)\S)" by (auto elim: max_ext.cases) moreoverhave"\x. x\X \ \z\Z. (x, z)\R" proof - fix x assume"x\X" thenobtain y where 1: "y\Y" "(x, y)\R" using * by auto thenobtain z where"z\Z" "(y, z)\S" using * by auto thenshow"\z\Z. (x, z)\R" using assms 1 by (auto elim: max_ext.cases) qed ultimatelyshow"(X,Z)\max_ext R" by auto qed thenshow"max_ext R O (max_ext S \ {({}, {})}) \ max_ext R" by auto qed
lemma min_ext_compat: assumes"R O S \ R" shows"min_ext R O (min_ext S \ {({},{})}) \ min_ext R" proof - have"\X Y Z z. \y\Y. \x\X. (x, y) \ R \ \z\Z. \y\Y. (y, z) \ S \<Longrightarrow> z \<in> Z \<Longrightarrow> \<exists>x\<in>X. (x, z) \<in> R" proof - fix X Y Z z assume *: "\y\Y. \x\X. (x, y) \ R" "\z\Z. \y\Y. (y, z) \ S" "z\Z" thenobtain y' where 1: "y'\<in>Y" "(y', z) \<in> S" by auto thenobtain x' where 2: "x'\<in>X" "(x', y') \<in> R" using * by auto show"\x\X. (x, z) \ R" using 1 2 assms by auto qed thenshow ?thesis using assms by (auto simp: min_ext_def) qed
subsection \<open>Yet more induction principles on the natural numbers\<close>
lemma nat_descend_induct [case_names base descend]: fixes P :: "nat \ bool" assumes H1: "\k. k > n \ P k" assumes H2: "\k. k \ n \ (\i. i > k \ P i) \ P k" shows"P m" using assms by induction_schema (force intro!: wf_measure [of "\k. Suc n - k"])+
lemma induct_nat_012[case_names 0 1 ge2]: "P 0 \ P (Suc 0) \ (\n. P n \ P (Suc n) \ P (Suc (Suc n))) \ P n" proof (induction_schema, pat_completeness) show"wf (Wellfounded.measure id)" by simp qed auto
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.