| author | wenzelm | 
| Sat, 14 Oct 2023 20:48:12 +0200 | |
| changeset 78778 | d495e71707d4 | 
| parent 76987 | 4c275405faae | 
| permissions | -rw-r--r-- | 
| 74546 | 1 | (* Title: HOL/Analysis/Metric_Arith.thy | 
| 2 | Author: Maximilian Schäffeler (port from HOL Light) | |
| 70951 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 3 | *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 4 | |
| 71198 | 5 | chapter \<open>Functional Analysis\<close> | 
| 6 | ||
| 7 | section\<^marker>\<open>tag unimportant\<close> \<open>A decision procedure for metric spaces\<close> | |
| 70951 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 8 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 9 | theory Metric_Arith | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 10 | imports HOL.Real_Vector_Spaces | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 11 | begin | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 12 | |
| 71198 | 13 | text\<^marker>\<open>tag unimportant\<close> \<open> | 
| 70953 | 14 | A port of the decision procedure ``Formalization of metric spaces in HOL Light'' | 
| 76987 | 15 | \<^cite>\<open>"DBLP:journals/jar/Maggesi18"\<close> for the type class @{class metric_space},
 | 
| 70953 | 16 | with the \<open>Argo\<close> solver as backend. | 
| 17 | \<close> | |
| 18 | ||
| 70951 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 19 | named_theorems metric_prenex | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 20 | named_theorems metric_nnf | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 21 | named_theorems metric_unfold | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 22 | named_theorems metric_pre_arith | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 23 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 24 | lemmas pre_arith_simps = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 25 | max.bounded_iff max_less_iff_conj | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 26 | le_max_iff_disj less_max_iff_disj | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 27 | simp_thms HOL.eq_commute | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 28 | declare pre_arith_simps [metric_pre_arith] | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 29 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 30 | lemmas unfold_simps = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 31 | Un_iff subset_iff disjoint_iff_not_equal | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 32 | Ball_def Bex_def | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 33 | declare unfold_simps [metric_unfold] | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 34 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 35 | declare HOL.nnf_simps(4) [metric_prenex] | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 36 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 37 | lemma imp_prenex [metric_prenex]: | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 38 | "\<And>P Q. (\<exists>x. P x) \<longrightarrow> Q \<equiv> \<forall>x. (P x \<longrightarrow> Q)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 39 | "\<And>P Q. P \<longrightarrow> (\<exists>x. Q x) \<equiv> \<exists>x. (P \<longrightarrow> Q x)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 40 | "\<And>P Q. (\<forall>x. P x) \<longrightarrow> Q \<equiv> \<exists>x. (P x \<longrightarrow> Q)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 41 | "\<And>P Q. P \<longrightarrow> (\<forall>x. Q x) \<equiv> \<forall>x. (P \<longrightarrow> Q x)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 42 | by simp_all | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 43 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 44 | lemma ex_prenex [metric_prenex]: | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 45 | "\<And>P Q. (\<exists>x. P x) \<and> Q \<equiv> \<exists>x. (P x \<and> Q)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 46 | "\<And>P Q. P \<and> (\<exists>x. Q x) \<equiv> \<exists>x. (P \<and> Q x)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 47 | "\<And>P Q. (\<exists>x. P x) \<or> Q \<equiv> \<exists>x. (P x \<or> Q)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 48 | "\<And>P Q. P \<or> (\<exists>x. Q x) \<equiv> \<exists>x. (P \<or> Q x)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 49 | "\<And>P. \<not>(\<exists>x. P x) \<equiv> \<forall>x. \<not>P x" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 50 | by simp_all | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 51 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 52 | lemma all_prenex [metric_prenex]: | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 53 | "\<And>P Q. (\<forall>x. P x) \<and> Q \<equiv> \<forall>x. (P x \<and> Q)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 54 | "\<And>P Q. P \<and> (\<forall>x. Q x) \<equiv> \<forall>x. (P \<and> Q x)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 55 | "\<And>P Q. (\<forall>x. P x) \<or> Q \<equiv> \<forall>x. (P x \<or> Q)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 56 | "\<And>P Q. P \<or> (\<forall>x. Q x) \<equiv> \<forall>x. (P \<or> Q x)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 57 | "\<And>P. \<not>(\<forall>x. P x) \<equiv> \<exists>x. \<not>P x" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 58 | by simp_all | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 59 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 60 | lemma nnf_thms [metric_nnf]: | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 61 | "(\<not> (P \<and> Q)) = (\<not> P \<or> \<not> Q)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 62 | "(\<not> (P \<or> Q)) = (\<not> P \<and> \<not> Q)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 63 | "(P \<longrightarrow> Q) = (\<not> P \<or> Q)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 64 | "(P = Q) \<longleftrightarrow> (P \<or> \<not> Q) \<and> (\<not> P \<or> Q)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 65 | "(\<not> (P = Q)) \<longleftrightarrow> (\<not> P \<or> \<not> Q) \<and> (P \<or> Q)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 66 | "(\<not> \<not> P) = P" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 67 | by blast+ | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 68 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 69 | lemmas nnf_simps = nnf_thms linorder_not_less linorder_not_le | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 70 | declare nnf_simps[metric_nnf] | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 71 | |
| 70954 | 72 | lemma ball_insert: "(\<forall>x\<in>insert a B. P x) = (P a \<and> (\<forall>x\<in>B. P x))" | 
| 73 | by blast | |
| 74 | ||
| 70951 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 75 | lemma Sup_insert_insert: | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 76 | fixes a::real | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 77 | shows "Sup (insert a (insert b s)) = Sup (insert (max a b) s)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 78 | by (simp add: Sup_real_def) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 79 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 80 | lemma real_abs_dist: "\<bar>dist x y\<bar> = dist x y" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 81 | by simp | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 82 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 83 | lemma maxdist_thm [THEN HOL.eq_reflection]: | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 84 | assumes "finite s" "x \<in> s" "y \<in> s" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 85 | defines "\<And>a. f a \<equiv> \<bar>dist x a - dist a y\<bar>" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 86 | shows "dist x y = Sup (f ` s)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 87 | proof - | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 88 | have "dist x y \<le> Sup (f ` s)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 89 | proof - | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 90 | have "finite (f ` s)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 91 | by (simp add: \<open>finite s\<close>) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 92 | moreover have "\<bar>dist x y - dist y y\<bar> \<in> f ` s" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 93 | by (metis \<open>y \<in> s\<close> f_def imageI) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 94 | ultimately show ?thesis | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 95 | using le_cSup_finite by simp | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 96 | qed | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 97 | also have "Sup (f ` s) \<le> dist x y" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 98 | using \<open>x \<in> s\<close> cSUP_least[of s f] abs_dist_diff_le | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 99 | unfolding f_def | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 100 | by blast | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 101 | finally show ?thesis . | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 102 | qed | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 103 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 104 | theorem metric_eq_thm [THEN HOL.eq_reflection]: | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 105 | "x \<in> s \<Longrightarrow> y \<in> s \<Longrightarrow> x = y \<longleftrightarrow> (\<forall>a\<in>s. dist x a = dist y a)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 106 | by auto | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 107 | |
| 76923 | 108 | ML_file \<open>metric_arith.ML\<close> | 
| 70951 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 109 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 110 | method_setup metric = \<open> | 
| 74546 | 111 | Scan.succeed (SIMPLE_METHOD' o Metric_Arith.metric_arith_tac) | 
| 70951 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 112 | \<close> "prove simple linear statements in metric spaces (\<forall>\<exists>\<^sub>p fragment)" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 113 | |
| 74546 | 114 | end |