src/HOL/Tools/Predicate_Compile/predicate_compile_proof.ML
author haftmann
Tue, 13 Oct 2015 09:21:15 +0200
changeset 61424 c3658c18b7bc
parent 61268 abe08fb15a12
child 62121 c8a93680b80d
permissions -rw-r--r--
prod_case as canonical name for product type eliminator
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
     1
(*  Title:      HOL/Tools/Predicate_Compile/predicate_compile_proof.ML
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
     2
    Author:     Lukas Bulwahn, TU Muenchen
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
     3
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
     4
Proof procedure for the compiler from predicates specified by intro/elim rules to equations.
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
     5
*)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
     6
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
     7
signature PREDICATE_COMPILE_PROOF =
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
     8
sig
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
     9
  type indprem = Predicate_Compile_Aux.indprem;
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    10
  type mode = Predicate_Compile_Aux.mode
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    11
  val prove_pred : Predicate_Compile_Aux.options -> theory
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    12
    -> (string * (term list * indprem list) list) list
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    13
    -> (string * typ) list -> string -> bool * mode
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    14
    -> (term list * (indprem * Mode_Inference.mode_derivation) list) list * term
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
    15
    -> thm
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    16
end;
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    17
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    18
structure Predicate_Compile_Proof : PREDICATE_COMPILE_PROOF =
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    19
struct
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    20
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    21
open Predicate_Compile_Aux;
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    22
open Mode_Inference;
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    23
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
    24
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    25
(* debug stuff *)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    26
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
    27
fun trace_tac ctxt options s =
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
    28
  if show_proof_trace options then print_tac ctxt s else Seq.single;
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    29
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
    30
fun assert_tac ctxt pos pred =
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
    31
  COND pred all_tac (print_tac ctxt ("Assertion failed" ^ Position.here pos) THEN no_tac);
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    32
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    33
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    34
(** special setup for simpset **)
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
    35
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 51552
diff changeset
    36
val HOL_basic_ss' =
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 51552
diff changeset
    37
  simpset_of (put_simpset HOL_basic_ss @{context}
61424
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 61268
diff changeset
    38
    addsimps @{thms simp_thms prod.inject}
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 51552
diff changeset
    39
    setSolver (mk_solver "all_tac_solver" (fn _ => fn _ => all_tac))
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
    40
    setSolver (mk_solver "True_solver" (fn ctxt => resolve_tac ctxt @{thms TrueI})))
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    41
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
    42
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    43
(* auxillary functions *)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    44
55399
5c8e91f884af ported predicate compiler to 'ctr_sugar'
blanchet
parents: 54742
diff changeset
    45
(* returns true if t is an application of a datatype constructor *)
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    46
(* which then consequently would be splitted *)
55399
5c8e91f884af ported predicate compiler to 'ctr_sugar'
blanchet
parents: 54742
diff changeset
    47
fun is_constructor ctxt t =
5c8e91f884af ported predicate compiler to 'ctr_sugar'
blanchet
parents: 54742
diff changeset
    48
  (case fastype_of t of
5c8e91f884af ported predicate compiler to 'ctr_sugar'
blanchet
parents: 54742
diff changeset
    49
    Type (s, _) => s <> @{type_name fun} andalso can (Ctr_Sugar.dest_ctr ctxt s) t
55440
721b4561007a merged, resolving some conflicts;
wenzelm
parents: 55420 55437
diff changeset
    50
  | _ => false)
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    51
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    52
(* MAJOR FIXME:  prove_params should be simple
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    53
 - different form of introrule for parameters ? *)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    54
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    55
fun prove_param options ctxt nargs t deriv =
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    56
  let
55399
5c8e91f884af ported predicate compiler to 'ctr_sugar'
blanchet
parents: 54742
diff changeset
    57
    val (f, args) = strip_comb (Envir.eta_contract t)
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    58
    val mode = head_mode_of deriv
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    59
    val param_derivations = param_derivations_of deriv
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    60
    val ho_args = ho_args_of mode args
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
    61
    val f_tac =
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
    62
      (case f of
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
    63
        Const (name, _) => simp_tac (put_simpset HOL_basic_ss ctxt addsimps
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
    64
           [@{thm eval_pred}, Core_Data.predfun_definition_of ctxt name mode,
61424
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 61268
diff changeset
    65
           @{thm case_prod_eta}, @{thm case_prod_beta}, @{thm fst_conv},
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 61268
diff changeset
    66
           @{thm snd_conv}, @{thm prod.collapse}, @{thm Product_Type.split_conv}]) 1
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
    67
      | Free _ =>
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
    68
        Subgoal.FOCUS_PREMS (fn {context = ctxt', prems, ...} =>
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
    69
          let
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
    70
            val prems' = maps dest_conjunct_prem (take nargs prems)
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
    71
          in
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
    72
            rewrite_goal_tac ctxt' (map (fn th => th RS @{thm sym} RS @{thm eq_reflection}) prems') 1
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
    73
          end) ctxt 1
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
    74
      | Abs _ => raise Fail "prove_param: No valid parameter term")
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    75
  in
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
    76
    REPEAT_DETERM (resolve_tac ctxt @{thms ext} 1)
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
    77
    THEN trace_tac ctxt options "prove_param"
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
    78
    THEN f_tac
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
    79
    THEN trace_tac ctxt options "after prove_param"
58963
26bf09b95dda proper context for assume_tac (atac remains as fall-back without context);
wenzelm
parents: 58956
diff changeset
    80
    THEN (REPEAT_DETERM (assume_tac ctxt 1))
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    81
    THEN (EVERY (map2 (prove_param options ctxt nargs) ho_args param_derivations))
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
    82
    THEN REPEAT_DETERM (resolve_tac ctxt @{thms refl} 1)
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    83
  end
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    84
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    85
fun prove_expr options ctxt nargs (premposition : int) (t, deriv) =
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
    86
  (case strip_comb t of
50056
72efd6b4038d dropped dead code
haftmann
parents: 46460
diff changeset
    87
    (Const (name, _), args) =>
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    88
      let
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    89
        val mode = head_mode_of deriv
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
    90
        val introrule = Core_Data.predfun_intro_of ctxt name mode
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    91
        val param_derivations = param_derivations_of deriv
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    92
        val ho_args = ho_args_of mode args
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    93
      in
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
    94
        trace_tac ctxt options "before intro rule:"
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
    95
        THEN resolve_tac ctxt [introrule] 1
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
    96
        THEN trace_tac ctxt options "after intro rule"
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    97
        (* for the right assumption in first position *)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
    98
        THEN rotate_tac premposition 1
58963
26bf09b95dda proper context for assume_tac (atac remains as fall-back without context);
wenzelm
parents: 58956
diff changeset
    99
        THEN assume_tac ctxt 1
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   100
        THEN trace_tac ctxt options "parameter goal"
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   101
        (* work with parameter arguments *)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   102
        THEN (EVERY (map2 (prove_param options ctxt nargs) ho_args param_derivations))
58963
26bf09b95dda proper context for assume_tac (atac remains as fall-back without context);
wenzelm
parents: 58956
diff changeset
   103
        THEN (REPEAT_DETERM (assume_tac ctxt 1))
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   104
      end
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   105
  | (Free _, _) =>
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   106
      trace_tac ctxt options "proving parameter call.."
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   107
      THEN Subgoal.FOCUS_PREMS (fn {context = ctxt', prems, concl, ...} =>
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   108
          let
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   109
            val param_prem = nth prems premposition
59582
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 59498
diff changeset
   110
            val (param, _) = strip_comb (HOLogic.dest_Trueprop (Thm.prop_of param_prem))
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   111
            val prems' = maps dest_conjunct_prem (take nargs prems)
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   112
            fun param_rewrite prem =
59582
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 59498
diff changeset
   113
              param = snd (HOLogic.dest_eq (HOLogic.dest_Trueprop (Thm.prop_of prem)))
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   114
            val SOME rew_eq = find_first param_rewrite prems'
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   115
            val param_prem' = rewrite_rule ctxt'
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   116
              (map (fn th => th RS @{thm eq_reflection})
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   117
                [rew_eq RS @{thm sym}, @{thm split_beta}, @{thm fst_conv}, @{thm snd_conv}])
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   118
              param_prem
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   119
          in
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   120
            resolve_tac ctxt' [param_prem'] 1
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   121
          end) ctxt 1
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   122
      THEN trace_tac ctxt options "after prove parameter call")
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   123
59582
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 59498
diff changeset
   124
fun SOLVED tac st = FILTER (fn st' => Thm.nprems_of st' = Thm.nprems_of st - 1) tac st
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   125
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   126
fun prove_match options ctxt nargs out_ts =
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   127
  let
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   128
    val eval_if_P =
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   129
      @{lemma "P ==> Predicate.eval x z ==> Predicate.eval (if P then x else y) z" by simp}
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   130
    fun get_case_rewrite t =
55399
5c8e91f884af ported predicate compiler to 'ctr_sugar'
blanchet
parents: 54742
diff changeset
   131
      if is_constructor ctxt t then
45701
615da8b8d758 discontinued obsolete datatype "alt_names";
wenzelm
parents: 45654
diff changeset
   132
        let
55399
5c8e91f884af ported predicate compiler to 'ctr_sugar'
blanchet
parents: 54742
diff changeset
   133
          val SOME {case_thms, ...} = Ctr_Sugar.ctr_sugar_of ctxt (fst (dest_Type (fastype_of t)))
45701
615da8b8d758 discontinued obsolete datatype "alt_names";
wenzelm
parents: 45654
diff changeset
   134
        in
55399
5c8e91f884af ported predicate compiler to 'ctr_sugar'
blanchet
parents: 54742
diff changeset
   135
          fold (union Thm.eq_thm) (case_thms :: map get_case_rewrite (snd (strip_comb t))) []
45701
615da8b8d758 discontinued obsolete datatype "alt_names";
wenzelm
parents: 45654
diff changeset
   136
        end
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   137
      else []
55642
63beb38e9258 adapted to renaming of datatype 'cases' and 'recs' to 'case' and 'rec'
blanchet
parents: 55440
diff changeset
   138
    val simprules = insert Thm.eq_thm @{thm "unit.case"} (insert Thm.eq_thm @{thm "prod.case"}
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   139
      (fold (union Thm.eq_thm) (map get_case_rewrite out_ts) []))
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   140
  (* replace TRY by determining if it necessary - are there equations when calling compile match? *)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   141
  in
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   142
    (* make this simpset better! *)
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 51552
diff changeset
   143
    asm_full_simp_tac (put_simpset HOL_basic_ss' ctxt addsimps simprules) 1
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   144
    THEN trace_tac ctxt options "after prove_match:"
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   145
    THEN (DETERM (TRY
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   146
           (resolve_tac ctxt [eval_if_P] 1
60696
8304fb4fb823 clarified context;
wenzelm
parents: 59582
diff changeset
   147
           THEN (SUBPROOF (fn {prems, context = ctxt', ...} =>
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   148
             (REPEAT_DETERM (resolve_tac ctxt' @{thms conjI} 1
60696
8304fb4fb823 clarified context;
wenzelm
parents: 59582
diff changeset
   149
             THEN (SOLVED (asm_simp_tac (put_simpset HOL_basic_ss' ctxt') 1))))
8304fb4fb823 clarified context;
wenzelm
parents: 59582
diff changeset
   150
             THEN trace_tac ctxt' options "if condition to be solved:"
8304fb4fb823 clarified context;
wenzelm
parents: 59582
diff changeset
   151
             THEN asm_simp_tac (put_simpset HOL_basic_ss' ctxt') 1
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   152
             THEN TRY (
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   153
                let
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   154
                  val prems' = maps dest_conjunct_prem (take nargs prems)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   155
                in
60696
8304fb4fb823 clarified context;
wenzelm
parents: 59582
diff changeset
   156
                  rewrite_goal_tac ctxt'
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   157
                    (map (fn th => th RS @{thm sym} RS @{thm eq_reflection}) prems') 1
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   158
                end
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   159
             THEN REPEAT_DETERM (resolve_tac ctxt' @{thms refl} 1))
60696
8304fb4fb823 clarified context;
wenzelm
parents: 59582
diff changeset
   160
             THEN trace_tac ctxt' options "after if simp; in SUBPROOF") ctxt 1))))
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   161
    THEN trace_tac ctxt options "after if simplification"
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   162
  end;
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   163
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   164
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   165
(* corresponds to compile_fun -- maybe call that also compile_sidecond? *)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   166
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   167
fun prove_sidecond ctxt t =
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   168
  let
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   169
    fun preds_of t nameTs =
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   170
      (case strip_comb t of
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   171
        (Const (name, T), args) =>
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   172
          if Core_Data.is_registered ctxt name then (name, T) :: nameTs
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   173
          else fold preds_of args nameTs
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   174
      | _ => nameTs)
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   175
    val preds = preds_of t []
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   176
    val defs = map
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   177
      (fn (pred, T) => Core_Data.predfun_definition_of ctxt pred
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   178
        (all_input_of T))
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   179
        preds
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   180
  in
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 51552
diff changeset
   181
    simp_tac (put_simpset HOL_basic_ss ctxt
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 51552
diff changeset
   182
      addsimps (@{thms HOL.simp_thms eval_pred} @ defs)) 1
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   183
    (* need better control here! *)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   184
  end
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   185
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   186
fun prove_clause options ctxt nargs mode (_, clauses) (ts, moded_ps) =
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   187
  let
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   188
    val (in_ts, clause_out_ts) = split_mode mode ts;
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   189
    fun prove_prems out_ts [] =
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   190
        (prove_match options ctxt nargs out_ts)
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   191
        THEN trace_tac ctxt options "before simplifying assumptions"
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   192
        THEN asm_full_simp_tac (put_simpset HOL_basic_ss' ctxt) 1
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   193
        THEN trace_tac ctxt options "before single intro rule"
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   194
        THEN Subgoal.FOCUS_PREMS
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   195
           (fn {context = ctxt', prems, ...} =>
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   196
            let
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   197
              val prems' = maps dest_conjunct_prem (take nargs prems)
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   198
            in
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   199
              rewrite_goal_tac ctxt' (map (fn th => th RS @{thm sym} RS @{thm eq_reflection}) prems') 1
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   200
            end) ctxt 1
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   201
        THEN (resolve_tac ctxt [if null clause_out_ts then @{thm singleI_unit} else @{thm singleI}] 1)
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   202
    | prove_prems out_ts ((p, deriv) :: ps) =
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   203
        let
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   204
          val premposition = (find_index (equal p) clauses) + nargs
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   205
          val mode = head_mode_of deriv
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   206
          val rest_tac =
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   207
            resolve_tac ctxt @{thms bindI} 1
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   208
            THEN (case p of Prem t =>
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   209
              let
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   210
                val (_, us) = strip_comb t
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   211
                val (_, out_ts''') = split_mode mode us
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   212
                val rec_tac = prove_prems out_ts''' ps
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   213
              in
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   214
                trace_tac ctxt options "before clause:"
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   215
                (*THEN asm_simp_tac (put_simpset HOL_basic_ss ctxt) 1*)
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   216
                THEN trace_tac ctxt options "before prove_expr:"
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   217
                THEN prove_expr options ctxt nargs premposition (t, deriv)
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   218
                THEN trace_tac ctxt options "after prove_expr:"
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   219
                THEN rec_tac
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   220
              end
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   221
            | Negprem t =>
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   222
              let
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   223
                val (t, args) = strip_comb t
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   224
                val (_, out_ts''') = split_mode mode args
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   225
                val rec_tac = prove_prems out_ts''' ps
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   226
                val name = (case strip_comb t of (Const (c, _), _) => SOME c | _ => NONE)
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   227
                val neg_intro_rule =
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   228
                  Option.map (fn name =>
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   229
                    the (Core_Data.predfun_neg_intro_of ctxt name mode)) name
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   230
                val param_derivations = param_derivations_of deriv
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   231
                val params = ho_args_of mode args
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   232
              in
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   233
                trace_tac ctxt options "before prove_neg_expr:"
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   234
                THEN full_simp_tac (put_simpset HOL_basic_ss ctxt addsimps
61424
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 61268
diff changeset
   235
                  [@{thm case_prod_eta}, @{thm case_prod_beta}, @{thm fst_conv},
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 61268
diff changeset
   236
                   @{thm snd_conv}, @{thm prod.collapse}, @{thm Product_Type.split_conv}]) 1
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   237
                THEN (if (is_some name) then
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   238
                    trace_tac ctxt options "before applying not introduction rule"
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   239
                    THEN Subgoal.FOCUS_PREMS (fn {prems, ...} =>
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   240
                      resolve_tac ctxt [the neg_intro_rule] 1
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   241
                      THEN resolve_tac ctxt [nth prems premposition] 1) ctxt 1
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   242
                    THEN trace_tac ctxt options "after applying not introduction rule"
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   243
                    THEN (EVERY (map2 (prove_param options ctxt nargs) params param_derivations))
58963
26bf09b95dda proper context for assume_tac (atac remains as fall-back without context);
wenzelm
parents: 58956
diff changeset
   244
                    THEN (REPEAT_DETERM (assume_tac ctxt 1))
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   245
                  else
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   246
                    resolve_tac ctxt @{thms not_predI'} 1
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   247
                    (* test: *)
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   248
                    THEN dresolve_tac ctxt @{thms sym} 1
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   249
                    THEN asm_full_simp_tac
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   250
                      (put_simpset HOL_basic_ss ctxt addsimps [@{thm not_False_eq_True}]) 1)
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   251
                    THEN simp_tac
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   252
                      (put_simpset HOL_basic_ss ctxt addsimps [@{thm not_False_eq_True}]) 1
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   253
                THEN rec_tac
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   254
              end
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   255
            | Sidecond t =>
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   256
             resolve_tac ctxt @{thms if_predI} 1
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   257
             THEN trace_tac ctxt options "before sidecond:"
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   258
             THEN prove_sidecond ctxt t
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   259
             THEN trace_tac ctxt options "after sidecond:"
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   260
             THEN prove_prems [] ps)
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   261
        in (prove_match options ctxt nargs out_ts)
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   262
            THEN rest_tac
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   263
        end
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   264
    val prems_tac = prove_prems in_ts moded_ps
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   265
  in
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   266
    trace_tac ctxt options "Proving clause..."
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   267
    THEN resolve_tac ctxt @{thms bindI} 1
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   268
    THEN resolve_tac ctxt @{thms singleI} 1
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   269
    THEN prems_tac
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   270
  end
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   271
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   272
fun select_sup _ 1 1 = []
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   273
  | select_sup ctxt _ 1 = [resolve_tac ctxt @{thms supI1}]
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   274
  | select_sup ctxt n i = resolve_tac ctxt @{thms supI2} :: select_sup ctxt (n - 1) (i - 1);
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   275
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   276
fun prove_one_direction options ctxt clauses preds pred mode moded_clauses =
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   277
  let
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   278
    val T = the (AList.lookup (op =) preds pred)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   279
    val nargs = length (binder_types T)
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   280
    val pred_case_rule = Core_Data.the_elim_of ctxt pred
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   281
  in
54742
7a86358a3c0b proper context for basic Simplifier operations: rewrite_rule, rewrite_goals_rule, rewrite_goals_tac etc.;
wenzelm
parents: 52732
diff changeset
   282
    REPEAT_DETERM (CHANGED (rewrite_goals_tac ctxt @{thms split_paired_all}))
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   283
    THEN trace_tac ctxt options "before applying elim rule"
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   284
    THEN eresolve_tac ctxt [Core_Data.predfun_elim_of ctxt pred mode] 1
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   285
    THEN eresolve_tac ctxt [pred_case_rule] 1
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   286
    THEN trace_tac ctxt options "after applying elim rule"
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   287
    THEN (EVERY (map
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   288
           (fn i => EVERY' (select_sup ctxt (length moded_clauses) i) i)
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   289
             (1 upto (length moded_clauses))))
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   290
    THEN (EVERY (map2 (prove_clause options ctxt nargs mode) clauses moded_clauses))
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   291
    THEN trace_tac ctxt options "proved one direction"
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   292
  end
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   293
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   294
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   295
(** Proof in the other direction **)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   296
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   297
fun prove_match2 options ctxt out_ts =
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   298
  let
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   299
    fun split_term_tac (Free _) = all_tac
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   300
      | split_term_tac t =
55399
5c8e91f884af ported predicate compiler to 'ctr_sugar'
blanchet
parents: 54742
diff changeset
   301
        if is_constructor ctxt t then
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   302
          let
55399
5c8e91f884af ported predicate compiler to 'ctr_sugar'
blanchet
parents: 54742
diff changeset
   303
            val SOME {case_thms, split_asm, ...} =
5c8e91f884af ported predicate compiler to 'ctr_sugar'
blanchet
parents: 54742
diff changeset
   304
              Ctr_Sugar.ctr_sugar_of ctxt (fst (dest_Type (fastype_of t)))
5c8e91f884af ported predicate compiler to 'ctr_sugar'
blanchet
parents: 54742
diff changeset
   305
            val num_of_constrs = length case_thms
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   306
            val (_, ts) = strip_comb t
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   307
          in
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   308
            trace_tac ctxt options ("Term " ^ (Syntax.string_of_term ctxt t) ^
61268
abe08fb15a12 moved remaining display.ML to more_thm.ML;
wenzelm
parents: 61114
diff changeset
   309
              " splitting with rules \n" ^ Thm.string_of_thm ctxt split_asm)
58956
a816aa3ff391 proper context for compose_tac, Splitter.split_tac (relevant for unify trace options);
wenzelm
parents: 56491
diff changeset
   310
            THEN TRY (Splitter.split_asm_tac ctxt [split_asm] 1
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   311
              THEN (trace_tac ctxt options "after splitting with split_asm rules")
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 51552
diff changeset
   312
            (* THEN (Simplifier.asm_full_simp_tac (put_simpset HOL_basic_ss ctxt) 1)
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   313
              THEN (DETERM (TRY (etac @{thm Pair_inject} 1)))*)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   314
              THEN (REPEAT_DETERM_N (num_of_constrs - 1)
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   315
                (eresolve_tac ctxt @{thms botE} 1 ORELSE eresolve_tac ctxt @{thms botE} 2)))
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   316
            THEN assert_tac ctxt @{here} (fn st => Thm.nprems_of st <= 2)
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   317
            THEN (EVERY (map split_term_tac ts))
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   318
          end
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   319
      else all_tac
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   320
  in
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   321
    split_term_tac (HOLogic.mk_tuple out_ts)
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   322
    THEN (DETERM (TRY ((Splitter.split_asm_tac ctxt @{thms split_if_asm} 1)
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   323
    THEN (eresolve_tac ctxt @{thms botE} 2))))
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   324
  end
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   325
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   326
(* VERY LARGE SIMILIRATIY to function prove_param
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   327
-- join both functions
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   328
*)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   329
(* TODO: remove function *)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   330
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   331
fun prove_param2 options ctxt t deriv =
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   332
  let
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   333
    val (f, args) = strip_comb (Envir.eta_contract t)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   334
    val mode = head_mode_of deriv
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   335
    val param_derivations = param_derivations_of deriv
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   336
    val ho_args = ho_args_of mode args
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   337
    val f_tac =
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   338
      (case f of
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   339
        Const (name, _) => full_simp_tac (put_simpset HOL_basic_ss ctxt addsimps
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   340
           [@{thm eval_pred}, Core_Data.predfun_definition_of ctxt name mode,
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   341
            @{thm Product_Type.split_conv}]) 1
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   342
      | Free _ => all_tac
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   343
      | _ => error "prove_param2: illegal parameter term")
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   344
  in
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   345
    trace_tac ctxt options "before simplification in prove_args:"
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   346
    THEN f_tac
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   347
    THEN trace_tac ctxt options "after simplification in prove_args"
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   348
    THEN EVERY (map2 (prove_param2 options ctxt) ho_args param_derivations)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   349
  end
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   350
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   351
fun prove_expr2 options ctxt (t, deriv) =
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   352
  (case strip_comb t of
50056
72efd6b4038d dropped dead code
haftmann
parents: 46460
diff changeset
   353
      (Const (name, _), args) =>
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   354
        let
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   355
          val mode = head_mode_of deriv
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   356
          val param_derivations = param_derivations_of deriv
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   357
          val ho_args = ho_args_of mode args
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   358
        in
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   359
          eresolve_tac ctxt @{thms bindE} 1
54742
7a86358a3c0b proper context for basic Simplifier operations: rewrite_rule, rewrite_goals_rule, rewrite_goals_tac etc.;
wenzelm
parents: 52732
diff changeset
   360
          THEN (REPEAT_DETERM (CHANGED (rewrite_goals_tac ctxt @{thms split_paired_all})))
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   361
          THEN trace_tac ctxt options "prove_expr2-before"
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   362
          THEN eresolve_tac ctxt [Core_Data.predfun_elim_of ctxt name mode] 1
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   363
          THEN trace_tac ctxt options "prove_expr2"
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   364
          THEN (EVERY (map2 (prove_param2 options ctxt) ho_args param_derivations))
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   365
          THEN trace_tac ctxt options "finished prove_expr2"
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   366
        end
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   367
      | _ => eresolve_tac ctxt @{thms bindE} 1)
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   368
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   369
fun prove_sidecond2 options ctxt t =
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   370
  let
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   371
    fun preds_of t nameTs =
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   372
      (case strip_comb t of
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   373
        (Const (name, T), args) =>
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   374
          if Core_Data.is_registered ctxt name then (name, T) :: nameTs
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   375
          else fold preds_of args nameTs
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   376
      | _ => nameTs)
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   377
    val preds = preds_of t []
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   378
    val defs = map
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   379
      (fn (pred, T) => Core_Data.predfun_definition_of ctxt pred
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   380
        (all_input_of T))
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   381
        preds
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   382
  in
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   383
    (* only simplify the one assumption *)
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   384
    full_simp_tac (put_simpset HOL_basic_ss' ctxt addsimps @{thm eval_pred} :: defs) 1
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   385
    (* need better control here! *)
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   386
    THEN trace_tac ctxt options "after sidecond2 simplification"
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   387
  end
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   388
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   389
fun prove_clause2 options ctxt pred mode (ts, ps) i =
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   390
  let
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   391
    val pred_intro_rule = nth (Core_Data.intros_of ctxt pred) (i - 1)
50056
72efd6b4038d dropped dead code
haftmann
parents: 46460
diff changeset
   392
    val (in_ts, _) = split_mode mode ts;
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 51552
diff changeset
   393
    val split_simpset =
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 51552
diff changeset
   394
      put_simpset HOL_basic_ss' ctxt
61424
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 61268
diff changeset
   395
      addsimps [@{thm case_prod_eta}, @{thm case_prod_beta},
c3658c18b7bc prod_case as canonical name for product type eliminator
haftmann
parents: 61268
diff changeset
   396
        @{thm fst_conv}, @{thm snd_conv}, @{thm prod.collapse}]
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   397
    fun prove_prems2 out_ts [] =
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   398
      trace_tac ctxt options "before prove_match2 - last call:"
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   399
      THEN prove_match2 options ctxt out_ts
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   400
      THEN trace_tac ctxt options "after prove_match2 - last call:"
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   401
      THEN (eresolve_tac ctxt @{thms singleE} 1)
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   402
      THEN (REPEAT_DETERM (eresolve_tac ctxt @{thms Pair_inject} 1))
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 51552
diff changeset
   403
      THEN (asm_full_simp_tac (put_simpset HOL_basic_ss' ctxt) 1)
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   404
      THEN TRY (
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   405
        (REPEAT_DETERM (eresolve_tac ctxt @{thms Pair_inject} 1))
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 51552
diff changeset
   406
        THEN (asm_full_simp_tac (put_simpset HOL_basic_ss' ctxt) 1)
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   407
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   408
        THEN SOLVED (trace_tac ctxt options "state before applying intro rule:"
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   409
        THEN (resolve_tac ctxt [pred_intro_rule]
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   410
        (* How to handle equality correctly? *)
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   411
        THEN_ALL_NEW (K (trace_tac ctxt options "state before assumption matching")
58963
26bf09b95dda proper context for assume_tac (atac remains as fall-back without context);
wenzelm
parents: 58956
diff changeset
   412
        THEN' (assume_tac ctxt ORELSE'
26bf09b95dda proper context for assume_tac (atac remains as fall-back without context);
wenzelm
parents: 58956
diff changeset
   413
          ((CHANGED o asm_full_simp_tac split_simpset) THEN'
26bf09b95dda proper context for assume_tac (atac remains as fall-back without context);
wenzelm
parents: 58956
diff changeset
   414
            (TRY o assume_tac ctxt))) THEN'
26bf09b95dda proper context for assume_tac (atac remains as fall-back without context);
wenzelm
parents: 58956
diff changeset
   415
          (K (trace_tac ctxt options "state after pre-simplification:"))
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   416
        THEN' (K (trace_tac ctxt options "state after assumption matching:")))) 1))
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   417
    | prove_prems2 out_ts ((p, deriv) :: ps) =
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   418
      let
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   419
        val mode = head_mode_of deriv
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   420
        val rest_tac =
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   421
          (case p of
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   422
            Prem t =>
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   423
              let
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   424
                val (_, us) = strip_comb t
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   425
                val (_, out_ts''') = split_mode mode us
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   426
                val rec_tac = prove_prems2 out_ts''' ps
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   427
              in
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   428
                (prove_expr2 options ctxt (t, deriv)) THEN rec_tac
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   429
              end
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   430
          | Negprem t =>
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   431
              let
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   432
                val (_, args) = strip_comb t
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   433
                val (_, out_ts''') = split_mode mode args
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   434
                val rec_tac = prove_prems2 out_ts''' ps
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   435
                val name = (case strip_comb t of (Const (c, _), _) => SOME c | _ => NONE)
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   436
                val param_derivations = param_derivations_of deriv
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   437
                val ho_args = ho_args_of mode args
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   438
              in
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   439
                trace_tac ctxt options "before neg prem 2"
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   440
                THEN eresolve_tac ctxt @{thms bindE} 1
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   441
                THEN (if is_some name then
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   442
                    full_simp_tac (put_simpset HOL_basic_ss ctxt addsimps
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   443
                      [Core_Data.predfun_definition_of ctxt (the name) mode]) 1
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   444
                    THEN eresolve_tac ctxt @{thms not_predE} 1
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   445
                    THEN simp_tac (put_simpset HOL_basic_ss ctxt addsimps @{thms not_False_eq_True}) 1
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   446
                    THEN (EVERY (map2 (prove_param2 options ctxt) ho_args param_derivations))
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   447
                  else
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   448
                    eresolve_tac ctxt @{thms not_predE'} 1)
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   449
                THEN rec_tac
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   450
              end
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   451
          | Sidecond t =>
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   452
              eresolve_tac ctxt @{thms bindE} 1
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   453
              THEN eresolve_tac ctxt @{thms if_predE} 1
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   454
              THEN prove_sidecond2 options ctxt t
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   455
              THEN prove_prems2 [] ps)
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   456
      in
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   457
        trace_tac ctxt options "before prove_match2:"
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   458
        THEN prove_match2 options ctxt out_ts
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   459
        THEN trace_tac ctxt options "after prove_match2:"
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   460
        THEN rest_tac
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   461
      end
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   462
    val prems_tac = prove_prems2 in_ts ps
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   463
  in
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   464
    trace_tac ctxt options "starting prove_clause2"
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   465
    THEN eresolve_tac ctxt @{thms bindE} 1
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   466
    THEN (eresolve_tac ctxt @{thms singleE'} 1)
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   467
    THEN (TRY (eresolve_tac ctxt @{thms Pair_inject} 1))
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   468
    THEN trace_tac ctxt options "after singleE':"
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   469
    THEN prems_tac
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   470
  end;
56490
16d00478b518 more conventional tactic programming;
wenzelm
parents: 55642
diff changeset
   471
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   472
fun prove_other_direction options ctxt pred mode moded_clauses =
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   473
  let
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   474
    fun prove_clause clause i =
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   475
      (if i < length moded_clauses then eresolve_tac ctxt @{thms supE} 1 else all_tac)
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   476
      THEN (prove_clause2 options ctxt pred mode clause i)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   477
  in
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   478
    (DETERM (TRY (resolve_tac ctxt @{thms unit.induct} 1)))
54742
7a86358a3c0b proper context for basic Simplifier operations: rewrite_rule, rewrite_goals_rule, rewrite_goals_tac etc.;
wenzelm
parents: 52732
diff changeset
   479
     THEN (REPEAT_DETERM (CHANGED (rewrite_goals_tac ctxt @{thms split_paired_all})))
61114
dcfc28144858 tuned -- do not open ML structures;
wenzelm
parents: 60752
diff changeset
   480
     THEN (resolve_tac ctxt [Core_Data.predfun_intro_of ctxt pred mode] 1)
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   481
     THEN (REPEAT_DETERM (resolve_tac ctxt @{thms refl} 2))
54742
7a86358a3c0b proper context for basic Simplifier operations: rewrite_rule, rewrite_goals_rule, rewrite_goals_tac etc.;
wenzelm
parents: 52732
diff changeset
   482
     THEN (
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   483
       if null moded_clauses then eresolve_tac ctxt @{thms botE} 1
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   484
       else EVERY (map2 prove_clause moded_clauses (1 upto (length moded_clauses))))
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   485
  end
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   486
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   487
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   488
(** proof procedure **)
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   489
50056
72efd6b4038d dropped dead code
haftmann
parents: 46460
diff changeset
   490
fun prove_pred options thy clauses preds pred (_, mode) (moded_clauses, compiled_term) =
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   491
  let
51552
c713c9505f68 clarified Skip_Proof.cheat_tac: more standard tactic;
wenzelm
parents: 50056
diff changeset
   492
    val ctxt = Proof_Context.init_global thy   (* FIXME proper context!? *)
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   493
    val clauses = (case AList.lookup (op =) clauses pred of SOME rs => rs | NONE => [])
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   494
  in
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   495
    Goal.prove ctxt (Term.add_free_names compiled_term []) [] compiled_term
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   496
      (if not (skip_proof options) then
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   497
        (fn _ =>
60752
b48830b670a1 prefer tactics with explicit context;
wenzelm
parents: 60696
diff changeset
   498
        resolve_tac ctxt @{thms pred_iffI} 1
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   499
        THEN trace_tac ctxt options "after pred_iffI"
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   500
        THEN prove_one_direction options ctxt clauses preds pred mode moded_clauses
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   501
        THEN trace_tac ctxt options "proved one direction"
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   502
        THEN prove_other_direction options ctxt pred mode moded_clauses
56491
a8ccf3d6a6e4 proper context for print_tac;
wenzelm
parents: 56490
diff changeset
   503
        THEN trace_tac ctxt options "proved other direction")
59498
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58963
diff changeset
   504
      else (fn _ => ALLGOALS (Skip_Proof.cheat_tac ctxt)))
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   505
  end
40052
ea46574ca815 splitting large core file into core_data, mode_inference and predicate_compile_proof
bulwahn
parents:
diff changeset
   506
55437
3fd63b92ea3b tuned whitespace;
wenzelm
parents: 54742
diff changeset
   507
end