36 |
36 |
37 fun trace_msg ctxt msg = if Config.get ctxt trace then tracing (msg ()) else () |
37 fun trace_msg ctxt msg = if Config.get ctxt trace then tracing (msg ()) else () |
38 fun verbose_warning ctxt msg = |
38 fun verbose_warning ctxt msg = |
39 if Config.get ctxt verbose then warning msg else () |
39 if Config.get ctxt verbose then warning msg else () |
40 |
40 |
|
41 val is_zapped_var_name = |
|
42 String.isPrefix Meson_Clausify.new_skolem_var_prefix orf |
|
43 String.isPrefix Meson_Clausify.new_nonskolem_var_prefix |
|
44 |
41 datatype term_or_type = SomeTerm of term | SomeType of typ |
45 datatype term_or_type = SomeTerm of term | SomeType of typ |
42 |
46 |
43 fun terms_of [] = [] |
47 fun terms_of [] = [] |
44 | terms_of (SomeTerm t :: tts) = t :: terms_of tts |
48 | terms_of (SomeTerm t :: tts) = t :: terms_of tts |
45 | terms_of (SomeType _ :: tts) = terms_of tts; |
49 | terms_of (SomeType _ :: tts) = terms_of tts; |
46 |
50 |
47 fun types_of [] = [] |
51 fun types_of [] = [] |
48 | types_of (SomeTerm (Var ((a,idx), _)) :: tts) = |
52 | types_of (SomeTerm (Var ((a,idx), _)) :: tts) = |
49 if String.isPrefix "_" a then |
53 if String.isPrefix metis_generated_var_prefix a then |
50 (*Variable generated by Metis, which might have been a type variable.*) |
54 (*Variable generated by Metis, which might have been a type variable.*) |
51 TVar (("'" ^ a, idx), HOLogic.typeS) :: types_of tts |
55 TVar (("'" ^ a, idx), HOLogic.typeS) :: types_of tts |
52 else types_of tts |
56 else types_of tts |
53 | types_of (SomeTerm _ :: tts) = types_of tts |
57 | types_of (SomeTerm _ :: tts) = types_of tts |
54 | types_of (SomeType T :: tts) = T :: types_of tts; |
58 | types_of (SomeType T :: tts) = T :: types_of tts; |
654 if k > j then t else t $ u |
658 if k > j then t else t $ u |
655 | (t, u) => t $ u) |
659 | (t, u) => t $ u) |
656 | repair t = t |
660 | repair t = t |
657 val t' = t |> repair |> fold (curry absdummy) (map snd params) |
661 val t' = t |> repair |> fold (curry absdummy) (map snd params) |
658 fun do_instantiate th = |
662 fun do_instantiate th = |
659 let val var = Term.add_vars (prop_of th) [] |> the_single in |
663 let |
660 th |> term_instantiate thy [(Var var, t')] |
664 val var = Term.add_vars (prop_of th) [] |
661 end |
665 |> filter (is_zapped_var_name o fst o fst) |
|
666 |> the_single |
|
667 in th |> term_instantiate thy [(Var var, t')] end |
662 in |
668 in |
663 (etac @{thm allE} i |
669 (etac @{thm allE} i |
664 THEN rotate_tac ~1 i |
670 THEN rotate_tac ~1 i |
665 THEN PRIMITIVE do_instantiate) st |
671 THEN PRIMITIVE do_instantiate) st |
666 end |
672 end |
743 let |
749 let |
744 val (tyenv, tenv) = |
750 val (tyenv, tenv) = |
745 Pattern.first_order_match thy p (Vartab.empty, Vartab.empty) |
751 Pattern.first_order_match thy p (Vartab.empty, Vartab.empty) |
746 val tsubst = |
752 val tsubst = |
747 tenv |> Vartab.dest |
753 tenv |> Vartab.dest |
|
754 |> filter (is_zapped_var_name o fst o fst) |
748 |> sort (cluster_ord |
755 |> sort (cluster_ord |
749 o pairself (Meson_Clausify.cluster_of_zapped_var_name |
756 o pairself (Meson_Clausify.cluster_of_zapped_var_name |
750 o fst o fst)) |
757 o fst o fst)) |
751 |> map (Meson.term_pair_of |
758 |> map (Meson.term_pair_of |
752 #> pairself (Envir.subst_term_types tyenv)) |
759 #> pairself (Envir.subst_term_types tyenv)) |
760 match_term (nth axioms ax_no |> the |> snd, t))) |
767 match_term (nth axioms ax_no |> the |> snd, t))) |
761 end |
768 end |
762 | _ => raise TERM ("discharge_skolem_premises: Malformed premise", |
769 | _ => raise TERM ("discharge_skolem_premises: Malformed premise", |
763 [prem]) |
770 [prem]) |
764 fun cluster_of_var_name skolem s = |
771 fun cluster_of_var_name skolem s = |
765 let |
772 case try Meson_Clausify.cluster_of_zapped_var_name s of |
766 val ((ax_no, (cluster_no, _)), skolem') = |
773 NONE => NONE |
767 Meson_Clausify.cluster_of_zapped_var_name s |
774 | SOME ((ax_no, (cluster_no, _)), skolem') => |
768 in |
|
769 if skolem' = skolem andalso cluster_no > 0 then |
775 if skolem' = skolem andalso cluster_no > 0 then |
770 SOME (ax_no, cluster_no) |
776 SOME (ax_no, cluster_no) |
771 else |
777 else |
772 NONE |
778 NONE |
773 end |
|
774 fun clusters_in_term skolem t = |
779 fun clusters_in_term skolem t = |
775 Term.add_var_names t [] |> map_filter (cluster_of_var_name skolem o fst) |
780 Term.add_var_names t [] |> map_filter (cluster_of_var_name skolem o fst) |
776 fun deps_for_term_subst (var, t) = |
781 fun deps_for_term_subst (var, t) = |
777 case clusters_in_term false var of |
782 case clusters_in_term false var of |
778 [] => NONE |
783 [] => NONE |
794 handle Int_Pair_Graph.CYCLES _ => |
799 handle Int_Pair_Graph.CYCLES _ => |
795 error "Cannot replay Metis proof in Isabelle without \ |
800 error "Cannot replay Metis proof in Isabelle without \ |
796 \\"Hilbert_Choice\"." |
801 \\"Hilbert_Choice\"." |
797 val outer_param_names = |
802 val outer_param_names = |
798 [] |> fold (Term.add_var_names o snd) (map_filter I axioms) |
803 [] |> fold (Term.add_var_names o snd) (map_filter I axioms) |
|
804 |> filter (is_zapped_var_name o fst) |
799 |> map (`(Meson_Clausify.cluster_of_zapped_var_name o fst)) |
805 |> map (`(Meson_Clausify.cluster_of_zapped_var_name o fst)) |
800 |> filter (fn (((_, (cluster_no, _)), skolem), _) => |
806 |> filter (fn (((_, (cluster_no, _)), skolem), _) => |
801 cluster_no = 0 andalso skolem) |
807 cluster_no = 0 andalso skolem) |
802 |> sort shuffle_ord |> map (fst o snd) |
808 |> sort shuffle_ord |> map (fst o snd) |
803 val ax_counts = |
809 val ax_counts = |