| author | Peter Lammich | 
| Thu, 17 Dec 2020 13:51:37 +0000 | |
| changeset 72943 | b945880827ff | 
| parent 70962 | e8207714d505 | 
| child 74239 | 914a214e110e | 
| permissions | -rw-r--r-- | 
| 70951 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 1 | signature METRIC_ARITH = sig | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 2 | val metric_arith_tac : Proof.context -> int -> tactic | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 3 | val trace: bool Config.T | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 4 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 5 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 6 | structure MetricArith : METRIC_ARITH = struct | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 7 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 8 | fun default d x = case x of SOME y => SOME y | NONE => d | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 9 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 10 | (* apply f to both cterms in ct_pair, merge results *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 11 | fun app_union_ct_pair f ct_pair = uncurry (union (op aconvc)) (apply2 f ct_pair) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 12 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 13 | val trace = Attrib.setup_config_bool \<^binding>\<open>metric_trace\<close> (K false) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 14 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 15 | fun trace_tac ctxt msg = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 16 | if Config.get ctxt trace then print_tac ctxt msg | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 17 | else all_tac | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 18 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 19 | fun argo_trace_ctxt ctxt = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 20 | if Config.get ctxt trace | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 21 | then Config.map (Argo_Tactic.trace) (K "basic") ctxt | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 22 | else ctxt | 
| 
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 | fun IF_UNSOLVED' tac i = IF_UNSOLVED (tac i) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 25 | fun REPEAT' tac i = REPEAT (tac i) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 26 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 27 | fun frees ct = Drule.cterm_add_frees ct [] | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 28 | fun free_in v ct = member (op aconvc) (frees ct) v | 
| 
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 | (* build a cterm set with elements cts of type ty *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 31 | fun mk_ct_set ctxt ty = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 32 | map Thm.term_of #> | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 33 | HOLogic.mk_set ty #> | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 34 | Thm.cterm_of ctxt | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 35 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 36 | fun prenex_tac ctxt = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 37 | let | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 38 |     val prenex_simps = Proof_Context.get_thms ctxt @{named_theorems metric_prenex}
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 39 | val prenex_ctxt = put_simpset HOL_basic_ss ctxt addsimps prenex_simps | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 40 | in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 41 | simp_tac prenex_ctxt THEN' | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 42 | K (trace_tac ctxt "Prenex form") | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 43 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 44 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 45 | fun nnf_tac ctxt = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 46 | let | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 47 |     val nnf_simps = Proof_Context.get_thms ctxt @{named_theorems metric_nnf}
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 48 | val nnf_ctxt = put_simpset HOL_basic_ss ctxt addsimps nnf_simps | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 49 | in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 50 | simp_tac nnf_ctxt THEN' | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 51 | K (trace_tac ctxt "NNF form") | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 52 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 53 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 54 | fun unfold_tac ctxt = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 55 | asm_full_simp_tac (put_simpset HOL_basic_ss ctxt addsimps ( | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 56 |     Proof_Context.get_thms ctxt @{named_theorems metric_unfold}))
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 57 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 58 | fun pre_arith_tac ctxt = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 59 | simp_tac (put_simpset HOL_basic_ss ctxt addsimps ( | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 60 |     Proof_Context.get_thms ctxt @{named_theorems metric_pre_arith})) THEN'
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 61 | K (trace_tac ctxt "Prepared for decision procedure") | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 62 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 63 | fun dist_refl_sym_tac ctxt = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 64 | let | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 65 |     val refl_sym_simps = @{thms dist_self dist_commute add_0_right add_0_left simp_thms}
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 66 | val refl_sym_ctxt = put_simpset HOL_basic_ss ctxt addsimps refl_sym_simps | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 67 | in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 68 | simp_tac refl_sym_ctxt THEN' | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 69 |     K (trace_tac ctxt ("Simplified using " ^ @{make_string} refl_sym_simps))
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 70 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 71 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 72 | fun is_exists ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 73 | case Thm.term_of ct of | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 74 | Const (\<^const_name>\<open>HOL.Ex\<close>,_)$_ => true | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 75 | | Const (\<^const_name>\<open>Trueprop\<close>,_)$_ => is_exists (Thm.dest_arg ct) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 76 | | _ => false | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 77 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 78 | fun is_forall ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 79 | case Thm.term_of ct of | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 80 | Const (\<^const_name>\<open>HOL.All\<close>,_)$_ => true | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 81 | | Const (\<^const_name>\<open>Trueprop\<close>,_)$_ => is_forall (Thm.dest_arg ct) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 82 | | _ => false | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 83 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 84 | fun dist_ty mty = mty --> mty --> \<^typ>\<open>real\<close> | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 85 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 86 | (* find all free points in ct of type metric_ty *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 87 | fun find_points ctxt metric_ty ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 88 | let | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 89 | fun find ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 90 | (if Thm.typ_of_cterm ct = metric_ty then [ct] else []) @ ( | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 91 | case Thm.term_of ct of | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 92 | _ $ _ => | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 93 | app_union_ct_pair find (Thm.dest_comb ct) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 94 | | Abs (_, _, _) => | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 95 | (* ensure the point doesn't contain the bound variable *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 96 | let val (var, bod) = Thm.dest_abs NONE ct in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 97 | filter (free_in var #> not) (find bod) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 98 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 99 | | _ => []) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 100 | val points = find ct | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 101 | in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 102 | case points of | 
| 
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 | (* if no point can be found, invent one *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 105 | let | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 106 |         val free_name = Term.variant_frees (Thm.term_of ct) [("x", metric_ty)]
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 107 | in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 108 | map (Free #> Thm.cterm_of ctxt) free_name | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 109 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 110 | | _ => points | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 111 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 112 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 113 | (* find all cterms "dist x y" in ct, where x and y have type metric_ty *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 114 | fun find_dist metric_ty ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 115 | let | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 116 | val dty = dist_ty metric_ty | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 117 | fun find ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 118 | case Thm.term_of ct of | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 119 | Const (\<^const_name>\<open>dist\<close>, ty) $ _ $ _ => | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 120 | if ty = dty then [ct] else [] | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 121 | | _ $ _ => | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 122 | app_union_ct_pair find (Thm.dest_comb ct) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 123 | | Abs (_, _, _) => | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 124 | let val (var, bod) = Thm.dest_abs NONE ct in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 125 | filter (free_in var #> not) (find bod) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 126 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 127 | | _ => [] | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 128 | in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 129 | find ct | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 130 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 131 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 132 | (* find all "x=y", where x has type metric_ty *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 133 | fun find_eq metric_ty ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 134 | let | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 135 | fun find ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 136 | case Thm.term_of ct of | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 137 | Const (\<^const_name>\<open>HOL.eq\<close>, ty) $ _ $ _ => | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 138 | if fst (dest_funT ty) = metric_ty | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 139 | then [ct] | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 140 | else app_union_ct_pair find (Thm.dest_binop ct) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 141 | | _ $ _ => app_union_ct_pair find (Thm.dest_comb ct) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 142 | | Abs (_, _, _) => | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 143 | let val (var, bod) = Thm.dest_abs NONE ct in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 144 | filter (free_in var #> not) (find bod) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 145 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 146 | | _ => [] | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 147 | in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 148 | find ct | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 149 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 150 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 151 | (* rewrite ct of the form "dist x y" using maxdist_thm *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 152 | fun maxdist_conv ctxt fset_ct ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 153 | let | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 154 | val (xct, yct) = Thm.dest_binop ct | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 155 | val solve_prems = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 156 | rule_by_tactic ctxt (ALLGOALS (simp_tac (put_simpset HOL_ss ctxt | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 157 |         addsimps @{thms finite.emptyI finite_insert empty_iff insert_iff})))
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 158 | val image_simp = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 159 |       Simplifier.rewrite (put_simpset HOL_ss ctxt addsimps @{thms image_empty image_insert})
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 160 | val dist_refl_sym_simp = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 161 |       Simplifier.rewrite (put_simpset HOL_ss ctxt addsimps @{thms dist_commute dist_self})
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 162 | val algebra_simp = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 163 | Simplifier.rewrite (put_simpset HOL_ss ctxt addsimps | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 164 |         @{thms diff_self diff_0_right diff_0 abs_zero abs_minus_cancel abs_minus_commute})
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 165 | val insert_simp = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 166 |       Simplifier.rewrite (put_simpset HOL_ss ctxt addsimps @{thms insert_absorb2 insert_commute})
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 167 | val sup_simp = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 168 |       Simplifier.rewrite (put_simpset HOL_ss ctxt addsimps @{thms cSup_singleton Sup_insert_insert})
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 169 | val real_abs_dist_simp = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 170 |       Simplifier.rewrite (put_simpset HOL_ss ctxt addsimps @{thms real_abs_dist})
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 171 | val maxdist_thm = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 172 |       @{thm maxdist_thm} |>
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 173 | infer_instantiate' ctxt [SOME fset_ct, SOME xct, SOME yct] |> | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 174 | solve_prems | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 175 | in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 176 | ((Conv.rewr_conv maxdist_thm) then_conv | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 177 | (* SUP to Sup *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 178 | image_simp then_conv | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 179 | dist_refl_sym_simp then_conv | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 180 | algebra_simp then_conv | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 181 | (* eliminate duplicate terms in set *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 182 | insert_simp then_conv | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 183 | (* Sup to max *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 184 | sup_simp then_conv | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 185 | real_abs_dist_simp) ct | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 186 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 187 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 188 | (* rewrite ct of the form "x=y" using metric_eq_thm *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 189 | fun metric_eq_conv ctxt fset_ct ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 190 | let | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 191 | val (xct, yct) = Thm.dest_binop ct | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 192 | val solve_prems = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 193 | rule_by_tactic ctxt (ALLGOALS (simp_tac (put_simpset HOL_ss ctxt | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 194 |         addsimps @{thms empty_iff insert_iff})))
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 195 | val ball_simp = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 196 | Simplifier.rewrite (put_simpset HOL_ss ctxt addsimps | 
| 70954 | 197 |         @{thms Set.ball_empty ball_insert})
 | 
| 70951 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 198 | val dist_refl_sym_simp = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 199 |       Simplifier.rewrite (put_simpset HOL_ss ctxt addsimps @{thms dist_commute dist_self})
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 200 | val metric_eq_thm = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 201 |       @{thm metric_eq_thm} |>
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 202 | infer_instantiate' ctxt [SOME xct, SOME fset_ct, SOME yct] |> | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 203 | solve_prems | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 204 | in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 205 | ((Conv.rewr_conv metric_eq_thm) then_conv | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 206 |     (* convert \<forall>x\<in>{x\<^sub>1,...,x\<^sub>n}. P x to P x\<^sub>1 \<and> ... \<and> P x\<^sub>n *)
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 207 | ball_simp then_conv | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 208 | dist_refl_sym_simp) ct | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 209 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 210 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 211 | (* build list of theorems "0 \<le> dist x y" for all dist terms in ct *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 212 | fun augment_dist_pos ctxt metric_ty ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 213 | let fun inst dist_ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 214 | let val (xct, yct) = Thm.dest_binop dist_ct | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 215 |     in infer_instantiate' ctxt [SOME xct, SOME yct] @{thm zero_le_dist} end
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 216 | in map inst (find_dist metric_ty ct) end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 217 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 218 | fun top_sweep_rewrs_tac ctxt thms = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 219 | CONVERSION (Conv.top_sweep_conv (K (Conv.rewrs_conv thms)) ctxt) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 220 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 221 | (* apply maxdist_conv and metric_eq_conv to the goal, thereby embedding the goal in (\<real>\<^sup>n,dist\<^sub>\<infinity>) *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 222 | fun embedding_tac ctxt metric_ty i goal = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 223 | let | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 224 | val ct = (Thm.cprem_of goal 1) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 225 | val points = find_points ctxt metric_ty ct | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 226 | val fset_ct = mk_ct_set ctxt metric_ty points | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 227 | (* embed all subterms of the form "dist x y" in (\<real>\<^sup>n,dist\<^sub>\<infinity>) *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 228 | val eq1 = map (maxdist_conv ctxt fset_ct) (find_dist metric_ty ct) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 229 | (* replace point equality by equality of components in \<real>\<^sup>n *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 230 | val eq2 = map (metric_eq_conv ctxt fset_ct) (find_eq metric_ty ct) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 231 | in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 232 | ( K (trace_tac ctxt "Embedding into \<real>\<^sup>n") THEN' top_sweep_rewrs_tac ctxt (eq1 @ eq2))i goal | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 233 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 234 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 235 | (* decision procedure for linear real arithmetic *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 236 | fun lin_real_arith_tac ctxt metric_ty i goal = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 237 | let | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 238 | val dist_thms = augment_dist_pos ctxt metric_ty (Thm.cprem_of goal 1) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 239 | val ctxt' = argo_trace_ctxt ctxt | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 240 | in (Argo_Tactic.argo_tac ctxt' dist_thms) i goal end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 241 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 242 | fun basic_metric_arith_tac ctxt metric_ty = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 243 | HEADGOAL (dist_refl_sym_tac ctxt THEN' | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 244 | IF_UNSOLVED' (embedding_tac ctxt metric_ty) THEN' | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 245 | IF_UNSOLVED' (pre_arith_tac ctxt) THEN' | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 246 | IF_UNSOLVED' (lin_real_arith_tac ctxt metric_ty)) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 247 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 248 | (* tries to infer the metric space from ct from dist terms, | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 249 | if no dist terms are present, equality terms will be used *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 250 | fun guess_metric ctxt ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 251 | let | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 252 | fun find_dist ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 253 | case Thm.term_of ct of | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 254 | Const (\<^const_name>\<open>dist\<close>, ty) $ _ $ _ => SOME (fst (dest_funT ty)) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 255 | | _ $ _ => | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 256 | let val (s, t) = Thm.dest_comb ct in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 257 | default (find_dist t) (find_dist s) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 258 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 259 | | Abs (_, _, _) => find_dist (snd (Thm.dest_abs NONE ct)) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 260 | | _ => NONE | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 261 | fun find_eq ct = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 262 | case Thm.term_of ct of | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 263 | Const (\<^const_name>\<open>HOL.eq\<close>, ty) $ x $ _ => | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 264 | let val (l, r) = Thm.dest_binop ct in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 265 | if Sign.of_sort (Proof_Context.theory_of ctxt) (type_of x, \<^sort>\<open>metric_space\<close>) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 266 | then SOME (fst (dest_funT ty)) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 267 | else default (find_dist r) (find_eq l) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 268 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 269 | | _ $ _ => | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 270 | let val (s, t) = Thm.dest_comb ct in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 271 | default (find_eq t) (find_eq s) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 272 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 273 | | Abs (_, _, _) => find_eq (snd (Thm.dest_abs NONE ct)) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 274 | | _ => NONE | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 275 | in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 276 | case default (find_eq ct) (find_dist ct) of | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 277 | SOME ty => ty | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 278 | | NONE => error "No Metric Space was found" | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 279 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 280 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 281 | (* eliminate \<exists> by proving the goal for a single witness from the metric space *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 282 | fun elim_exists ctxt goal = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 283 | let | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 284 | val ct = Thm.cprem_of goal 1 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 285 | val metric_ty = guess_metric ctxt ct | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 286 | val points = find_points ctxt metric_ty ct | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 287 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 288 | fun try_point ctxt pt = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 289 |       let val ex_rule = infer_instantiate' ctxt [NONE, SOME pt] @{thm exI}
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 290 | in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 291 | HEADGOAL (resolve_tac ctxt [ex_rule] ORELSE' | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 292 | (* variable doesn't occur in body *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 293 |         resolve_tac ctxt @{thms exI}) THEN
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 294 |         trace_tac ctxt ("Removed existential quantifier, try " ^ @{make_string} pt) THEN
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 295 | try_points ctxt | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 296 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 297 | and try_points ctxt goal = ( | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 298 | if is_exists (Thm.cprem_of goal 1) then | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 299 | FIRST (map (try_point ctxt) points) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 300 | else if is_forall (Thm.cprem_of goal 1) then | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 301 |         HEADGOAL (resolve_tac ctxt @{thms HOL.allI} THEN'
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 302 |         Subgoal.FOCUS (fn {context = ctxt', ...} =>
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 303 | trace_tac ctxt "Removed universal quantifier" THEN | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 304 | try_points ctxt') ctxt) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 305 | else basic_metric_arith_tac ctxt metric_ty) goal | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 306 | in | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 307 | try_points ctxt goal | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 308 | end | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 309 | |
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 310 | fun metric_arith_tac ctxt = | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 311 | (* unfold common definitions to get rid of sets *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 312 | unfold_tac ctxt THEN' | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 313 | (* remove all meta-level connectives *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 314 | IF_UNSOLVED' (Object_Logic.full_atomize_tac ctxt) THEN' | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 315 | (* convert goal to prenex form *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 316 | IF_UNSOLVED' (prenex_tac ctxt) THEN' | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 317 | (* and NNF to ? *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 318 | IF_UNSOLVED' (nnf_tac ctxt) THEN' | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 319 | (* turn all universally quantified variables into free variables, by focusing the subgoal *) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 320 |   REPEAT' (resolve_tac ctxt @{thms HOL.allI}) THEN'
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 321 |   IF_UNSOLVED' (SUBPROOF (fn {context=ctxt', ...} =>
 | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 322 | trace_tac ctxt' "Focused on subgoal" THEN | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 323 | elim_exists ctxt') ctxt) | 
| 
678b2abe9f7d
decision procedure for metric spaces, implemented by Maximilian Schäffeler
 immler parents: diff
changeset | 324 | end |