| author | wenzelm | 
| Thu, 09 Feb 2012 19:34:23 +0100 | |
| changeset 46295 | 2548a85b0e02 | 
| parent 45701 | 615da8b8d758 | 
| child 46460 | 68cf3d3550b5 | 
| permissions | -rw-r--r-- | 
| 
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  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
15  | 
-> Thm.thm  | 
| 
 
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 Core_Data;  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
23  | 
open Mode_Inference;  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
24  | 
|
| 
 
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  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
27  | 
fun print_tac options s =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
28  | 
if show_proof_trace options then Tactical.print_tac s else Seq.single;  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
29  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
30  | 
(** auxiliary **)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
31  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
32  | 
datatype assertion = Max_number_of_subgoals of int  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
33  | 
fun assert_tac (Max_number_of_subgoals i) st =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
34  | 
if (nprems_of st <= i) then Seq.single st  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
35  | 
  else raise Fail ("assert_tac: Numbers of subgoals mismatch at goal state :"
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
36  | 
^ "\n" ^ Pretty.string_of (Pretty.chunks  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
37  | 
(Goal_Display.pretty_goals_without_context st)));  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
38  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
39  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
40  | 
(** special setup for simpset **)  | 
| 45654 | 41  | 
val HOL_basic_ss' = HOL_basic_ss addsimps @{thms simp_thms Pair_eq}
 | 
| 
40052
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
42  | 
setSolver (mk_solver "all_tac_solver" (fn _ => fn _ => all_tac))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
43  | 
  setSolver (mk_solver "True_solver" (fn _ => rtac @{thm TrueI}))
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
44  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
45  | 
(* auxillary functions *)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
46  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
47  | 
fun is_Type (Type _) = true  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
48  | 
| is_Type _ = false  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
49  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
50  | 
(* returns true if t is an application of an datatype constructor *)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
51  | 
(* which then consequently would be splitted *)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
52  | 
(* else false *)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
53  | 
fun is_constructor thy t =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
54  | 
if (is_Type (fastype_of t)) then  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
55  | 
(case Datatype.get_info thy ((fst o dest_Type o fastype_of) t) of  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
56  | 
NONE => false  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
57  | 
| SOME info => (let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
58  | 
val constr_consts = maps (fn (_, (_, _, constrs)) => map fst constrs) (#descr info)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
59  | 
val (c, _) = strip_comb t  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
60  | 
in (case c of  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
61  | 
Const (name, _) => member (op =) constr_consts name  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
62  | 
| _ => false) end))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
63  | 
else false  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
64  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
65  | 
(* 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
 | 
66  | 
- different form of introrule for parameters ? *)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
67  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
68  | 
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
 | 
69  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
70  | 
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
 | 
71  | 
val mode = head_mode_of deriv  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
72  | 
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
 | 
73  | 
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
 | 
74  | 
val f_tac = case f of  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
75  | 
Const (name, T) => simp_tac (HOL_basic_ss addsimps  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
76  | 
         [@{thm eval_pred}, predfun_definition_of ctxt name mode,
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
77  | 
         @{thm split_eta}, @{thm split_beta}, @{thm fst_conv},
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
78  | 
         @{thm snd_conv}, @{thm pair_collapse}, @{thm Product_Type.split_conv}]) 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
79  | 
| Free _ =>  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
80  | 
      Subgoal.FOCUS_PREMS (fn {context = ctxt, params = params, prems, asms, concl, schematics} =>
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
81  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
82  | 
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
 | 
83  | 
in  | 
| 41225 | 84  | 
Simplifier.rewrite_goal_tac  | 
| 
40052
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
85  | 
            (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
 | 
86  | 
end) ctxt 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
87  | 
| Abs _ => raise Fail "prove_param: No valid parameter term"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
88  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
89  | 
    REPEAT_DETERM (rtac @{thm ext} 1)
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
90  | 
THEN print_tac options "prove_param"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
91  | 
THEN f_tac  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
92  | 
THEN print_tac options "after prove_param"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
93  | 
THEN (REPEAT_DETERM (atac 1))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
94  | 
THEN (EVERY (map2 (prove_param options ctxt nargs) ho_args param_derivations))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
95  | 
    THEN REPEAT_DETERM (rtac @{thm refl} 1)
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
96  | 
end  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
97  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
98  | 
fun prove_expr options ctxt nargs (premposition : int) (t, deriv) =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
99  | 
case strip_comb t of  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
100  | 
(Const (name, T), args) =>  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
101  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
102  | 
val mode = head_mode_of deriv  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
103  | 
val introrule = predfun_intro_of ctxt name mode  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
104  | 
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
 | 
105  | 
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
 | 
106  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
107  | 
print_tac options "before intro rule:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
108  | 
THEN rtac introrule 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
109  | 
THEN print_tac options "after intro rule"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
110  | 
(* 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
 | 
111  | 
THEN rotate_tac premposition 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
112  | 
THEN atac 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
113  | 
THEN print_tac options "parameter goal"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
114  | 
(* work with parameter arguments *)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
115  | 
THEN (EVERY (map2 (prove_param options ctxt nargs) ho_args param_derivations))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
116  | 
THEN (REPEAT_DETERM (atac 1))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
117  | 
end  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
118  | 
| (Free _, _) =>  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
119  | 
print_tac options "proving parameter call.."  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
120  | 
    THEN Subgoal.FOCUS_PREMS (fn {context = ctxt, params, prems, asms, concl, schematics} =>
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
121  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
122  | 
val param_prem = nth prems premposition  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
123  | 
val (param, _) = strip_comb (HOLogic.dest_Trueprop (prop_of param_prem))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
124  | 
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
 | 
125  | 
fun param_rewrite prem =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
126  | 
param = snd (HOLogic.dest_eq (HOLogic.dest_Trueprop (prop_of prem)))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
127  | 
val SOME rew_eq = find_first param_rewrite prems'  | 
| 
41228
 
e1fce873b814
renamed structure MetaSimplifier to raw_Simplifer, to emphasize its meaning;
 
wenzelm 
parents: 
41225 
diff
changeset
 | 
128  | 
val param_prem' = Raw_Simplifier.rewrite_rule  | 
| 
40052
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
129  | 
            (map (fn th => th RS @{thm eq_reflection})
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
130  | 
              [rew_eq RS @{thm sym}, @{thm split_beta}, @{thm fst_conv}, @{thm snd_conv}])
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
131  | 
param_prem  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
132  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
133  | 
rtac param_prem' 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
134  | 
end) ctxt 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
135  | 
THEN print_tac options "after prove parameter call"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
136  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
137  | 
fun SOLVED tac st = FILTER (fn st' => nprems_of st' = nprems_of st - 1) tac st;  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
138  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
139  | 
fun SOLVEDALL tac st = FILTER (fn st' => nprems_of st' = 0) tac st  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
140  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
141  | 
fun check_format ctxt st =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
142  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
143  | 
val concl' = Logic.strip_assums_concl (hd (prems_of st))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
144  | 
val concl = HOLogic.dest_Trueprop concl'  | 
| 45450 | 145  | 
val expr = fst (strip_comb (fst (Predicate_Comp_Funs.dest_Eval concl)))  | 
| 
40052
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
146  | 
    fun valid_expr (Const (@{const_name Predicate.bind}, _)) = true
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
147  | 
      | valid_expr (Const (@{const_name Predicate.single}, _)) = true
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
148  | 
| valid_expr _ = false  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
149  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
150  | 
if valid_expr expr then  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
151  | 
((*tracing "expression is valid";*) Seq.single st)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
152  | 
else  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
153  | 
((*tracing "expression is not valid";*) Seq.empty) (* error "check_format: wrong format" *)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
154  | 
end  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
155  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
156  | 
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
 | 
157  | 
let  | 
| 42361 | 158  | 
val thy = Proof_Context.theory_of ctxt  | 
| 
40052
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
159  | 
val eval_if_P =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
160  | 
      @{lemma "P ==> Predicate.eval x z ==> Predicate.eval (if P then x else y) z" by simp} 
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
161  | 
fun get_case_rewrite t =  | 
| 45701 | 162  | 
if (is_constructor thy t) then  | 
163  | 
let  | 
|
164  | 
          val {case_rewrites, ...} = Datatype.the_info thy (fst (dest_Type (fastype_of t)))
 | 
|
165  | 
in  | 
|
166  | 
fold (union Thm.eq_thm) (case_rewrites :: map get_case_rewrite (snd (strip_comb t))) []  | 
|
167  | 
end  | 
|
| 
40052
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
168  | 
else []  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
169  | 
    val simprules = insert Thm.eq_thm @{thm "unit.cases"} (insert Thm.eq_thm @{thm "prod.cases"}
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
170  | 
(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
 | 
171  | 
(* 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
 | 
172  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
173  | 
(* make this simpset better! *)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
174  | 
asm_full_simp_tac (HOL_basic_ss' addsimps simprules) 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
175  | 
THEN print_tac options "after prove_match:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
176  | 
THEN (DETERM (TRY  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
177  | 
(rtac eval_if_P 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
178  | 
           THEN (SUBPROOF (fn {context = ctxt, params, prems, asms, concl, schematics} =>
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
179  | 
             (REPEAT_DETERM (rtac @{thm conjI} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
180  | 
THEN (SOLVED (asm_simp_tac HOL_basic_ss' 1))))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
181  | 
THEN print_tac options "if condition to be solved:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
182  | 
THEN asm_simp_tac HOL_basic_ss' 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
183  | 
THEN TRY (  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
184  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
185  | 
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
 | 
186  | 
in  | 
| 41225 | 187  | 
Simplifier.rewrite_goal_tac  | 
| 
40052
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
188  | 
                    (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
 | 
189  | 
end  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
190  | 
             THEN REPEAT_DETERM (rtac @{thm refl} 1))
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
191  | 
THEN print_tac options "after if simp; in SUBPROOF") ctxt 1))))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
192  | 
THEN print_tac options "after if simplification"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
193  | 
end;  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
194  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
195  | 
(* 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
 | 
196  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
197  | 
fun prove_sidecond ctxt t =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
198  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
199  | 
fun preds_of t nameTs = case strip_comb t of  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
200  | 
(f as Const (name, T), args) =>  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
201  | 
if is_registered ctxt name then (name, T) :: nameTs  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
202  | 
else fold preds_of args nameTs  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
203  | 
| _ => nameTs  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
204  | 
val preds = preds_of t []  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
205  | 
val defs = map  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
206  | 
(fn (pred, T) => predfun_definition_of ctxt pred  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
207  | 
(all_input_of T))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
208  | 
preds  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
209  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
210  | 
simp_tac (HOL_basic_ss addsimps  | 
| 45654 | 211  | 
      (@{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
 | 
212  | 
(* need better control here! *)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
213  | 
end  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
214  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
215  | 
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
 | 
216  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
217  | 
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
 | 
218  | 
fun prove_prems out_ts [] =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
219  | 
(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
 | 
220  | 
THEN print_tac options "before simplifying assumptions"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
221  | 
THEN asm_full_simp_tac HOL_basic_ss' 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
222  | 
THEN print_tac options "before single intro rule"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
223  | 
THEN Subgoal.FOCUS_PREMS  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
224  | 
             (fn {context = ctxt, params = params, prems, asms, concl, schematics} =>
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
225  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
226  | 
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
 | 
227  | 
in  | 
| 41225 | 228  | 
Simplifier.rewrite_goal_tac  | 
| 
40052
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
229  | 
                  (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
 | 
230  | 
end) ctxt 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
231  | 
      THEN (rtac (if null clause_out_ts then @{thm singleI_unit} else @{thm singleI}) 1)
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
232  | 
| prove_prems out_ts ((p, deriv) :: ps) =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
233  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
234  | 
val premposition = (find_index (equal p) clauses) + nargs  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
235  | 
val mode = head_mode_of deriv  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
236  | 
val rest_tac =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
237  | 
          rtac @{thm bindI} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
238  | 
THEN (case p of Prem t =>  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
239  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
240  | 
val (_, us) = strip_comb t  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
241  | 
val (_, out_ts''') = split_mode mode us  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
242  | 
val rec_tac = prove_prems out_ts''' ps  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
243  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
244  | 
print_tac options "before clause:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
245  | 
(*THEN asm_simp_tac HOL_basic_ss 1*)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
246  | 
THEN print_tac options "before prove_expr:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
247  | 
THEN prove_expr options ctxt nargs premposition (t, deriv)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
248  | 
THEN print_tac options "after prove_expr:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
249  | 
THEN rec_tac  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
250  | 
end  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
251  | 
| Negprem t =>  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
252  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
253  | 
val (t, args) = strip_comb t  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
254  | 
val (_, out_ts''') = split_mode mode args  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
255  | 
val rec_tac = prove_prems out_ts''' ps  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
256  | 
val name = (case strip_comb t of (Const (c, _), _) => SOME c | _ => NONE)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
257  | 
val neg_intro_rule =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
258  | 
Option.map (fn name =>  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
259  | 
the (predfun_neg_intro_of ctxt name mode)) name  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
260  | 
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
 | 
261  | 
val params = ho_args_of mode args  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
262  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
263  | 
print_tac options "before prove_neg_expr:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
264  | 
THEN full_simp_tac (HOL_basic_ss addsimps  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
265  | 
                [@{thm split_eta}, @{thm split_beta}, @{thm fst_conv},
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
266  | 
                 @{thm snd_conv}, @{thm pair_collapse}, @{thm Product_Type.split_conv}]) 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
267  | 
THEN (if (is_some name) then  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
268  | 
print_tac options "before applying not introduction rule"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
269  | 
THEN Subgoal.FOCUS_PREMS  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
270  | 
                    (fn {context = ctxt, params = params, prems, asms, concl, schematics} =>
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
271  | 
rtac (the neg_intro_rule) 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
272  | 
THEN rtac (nth prems premposition) 1) ctxt 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
273  | 
THEN print_tac options "after applying not introduction rule"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
274  | 
THEN (EVERY (map2 (prove_param options ctxt nargs) params param_derivations))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
275  | 
THEN (REPEAT_DETERM (atac 1))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
276  | 
else  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
277  | 
                  rtac @{thm not_predI'} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
278  | 
(* test: *)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
279  | 
                  THEN dtac @{thm sym} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
280  | 
                  THEN asm_full_simp_tac (HOL_basic_ss addsimps [@{thm not_False_eq_True}]) 1)
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
281  | 
                  THEN simp_tac (HOL_basic_ss addsimps [@{thm not_False_eq_True}]) 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
282  | 
THEN rec_tac  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
283  | 
end  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
284  | 
| Sidecond t =>  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
285  | 
           rtac @{thm if_predI} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
286  | 
THEN print_tac options "before sidecond:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
287  | 
THEN prove_sidecond ctxt t  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
288  | 
THEN print_tac options "after sidecond:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
289  | 
THEN prove_prems [] ps)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
290  | 
in (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
 | 
291  | 
THEN rest_tac  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
292  | 
end;  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
293  | 
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
 | 
294  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
295  | 
print_tac options "Proving clause..."  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
296  | 
    THEN rtac @{thm bindI} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
297  | 
    THEN rtac @{thm singleI} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
298  | 
THEN prems_tac  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
299  | 
end;  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
300  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
301  | 
fun select_sup 1 1 = []  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
302  | 
  | select_sup _ 1 = [rtac @{thm supI1}]
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
303  | 
  | select_sup n i = (rtac @{thm supI2})::(select_sup (n - 1) (i - 1));
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
304  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
305  | 
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
 | 
306  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
307  | 
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
 | 
308  | 
val nargs = length (binder_types T)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
309  | 
val pred_case_rule = the_elim_of ctxt pred  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
310  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
311  | 
    REPEAT_DETERM (CHANGED (rewtac @{thm "split_paired_all"}))
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
312  | 
THEN print_tac options "before applying elim rule"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
313  | 
THEN etac (predfun_elim_of ctxt pred mode) 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
314  | 
THEN etac pred_case_rule 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
315  | 
THEN print_tac options "after applying elim rule"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
316  | 
THEN (EVERY (map  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
317  | 
(fn i => EVERY' (select_sup (length moded_clauses) i) i)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
318  | 
(1 upto (length moded_clauses))))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
319  | 
THEN (EVERY (map2 (prove_clause options ctxt nargs mode) clauses moded_clauses))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
320  | 
THEN print_tac options "proved one direction"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
321  | 
end;  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
322  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
323  | 
(** Proof in the other direction **)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
324  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
325  | 
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
 | 
326  | 
let  | 
| 42361 | 327  | 
val thy = Proof_Context.theory_of ctxt  | 
| 
40052
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
328  | 
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
 | 
329  | 
| split_term_tac t =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
330  | 
if (is_constructor thy t) then  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
331  | 
let  | 
| 45701 | 332  | 
            val {case_rewrites, split_asm, ...} =
 | 
333  | 
Datatype.the_info thy (fst (dest_Type (fastype_of t)))  | 
|
334  | 
val num_of_constrs = length case_rewrites  | 
|
| 
40052
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
335  | 
val (_, ts) = strip_comb t  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
336  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
337  | 
            print_tac options ("Term " ^ (Syntax.string_of_term ctxt t) ^ 
 | 
| 45701 | 338  | 
"splitting with rules \n" ^ Display.string_of_thm ctxt split_asm)  | 
339  | 
THEN TRY (Splitter.split_asm_tac [split_asm] 1  | 
|
| 
40052
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
340  | 
THEN (print_tac options "after splitting with split_asm rules")  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
341  | 
(* THEN (Simplifier.asm_full_simp_tac HOL_basic_ss 1)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
342  | 
              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
 | 
343  | 
THEN (REPEAT_DETERM_N (num_of_constrs - 1)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
344  | 
                (etac @{thm botE} 1 ORELSE etac @{thm botE} 2)))
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
345  | 
THEN (assert_tac (Max_number_of_subgoals 2))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
346  | 
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
 | 
347  | 
end  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
348  | 
else all_tac  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
349  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
350  | 
split_term_tac (HOLogic.mk_tuple out_ts)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
351  | 
    THEN (DETERM (TRY ((Splitter.split_asm_tac [@{thm "split_if_asm"}] 1)
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
352  | 
    THEN (etac @{thm botE} 2))))
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
353  | 
end  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
354  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
355  | 
(* VERY LARGE SIMILIRATIY to function prove_param  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
356  | 
-- join both functions  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
357  | 
*)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
358  | 
(* TODO: remove function *)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
359  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
360  | 
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
 | 
361  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
362  | 
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
 | 
363  | 
val mode = head_mode_of deriv  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
364  | 
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
 | 
365  | 
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
 | 
366  | 
val f_tac = case f of  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
367  | 
Const (name, T) => full_simp_tac (HOL_basic_ss addsimps  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
368  | 
           (@{thm eval_pred}::(predfun_definition_of ctxt name mode)
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
369  | 
           :: @{thm "Product_Type.split_conv"}::[])) 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
370  | 
| Free _ => all_tac  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
371  | 
| _ => error "prove_param2: illegal parameter term"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
372  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
373  | 
print_tac options "before simplification in prove_args:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
374  | 
THEN f_tac  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
375  | 
THEN print_tac options "after simplification in prove_args"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
376  | 
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
 | 
377  | 
end  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
378  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
379  | 
fun prove_expr2 options ctxt (t, deriv) =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
380  | 
(case strip_comb t of  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
381  | 
(Const (name, T), args) =>  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
382  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
383  | 
val mode = head_mode_of deriv  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
384  | 
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
 | 
385  | 
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
 | 
386  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
387  | 
          etac @{thm bindE} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
388  | 
          THEN (REPEAT_DETERM (CHANGED (rewtac @{thm "split_paired_all"})))
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
389  | 
THEN print_tac options "prove_expr2-before"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
390  | 
THEN etac (predfun_elim_of ctxt name mode) 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
391  | 
THEN print_tac options "prove_expr2"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
392  | 
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
 | 
393  | 
THEN print_tac options "finished prove_expr2"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
394  | 
end  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
395  | 
      | _ => etac @{thm bindE} 1)
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
396  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
397  | 
fun prove_sidecond2 options ctxt t = let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
398  | 
fun preds_of t nameTs = case strip_comb t of  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
399  | 
(f as Const (name, T), args) =>  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
400  | 
if is_registered ctxt name then (name, T) :: nameTs  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
401  | 
else fold preds_of args nameTs  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
402  | 
| _ => nameTs  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
403  | 
val preds = preds_of t []  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
404  | 
val defs = map  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
405  | 
(fn (pred, T) => predfun_definition_of ctxt pred  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
406  | 
(all_input_of T))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
407  | 
preds  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
408  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
409  | 
(* only simplify the one assumption *)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
410  | 
   full_simp_tac (HOL_basic_ss' addsimps @{thm eval_pred} :: defs) 1 
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
411  | 
(* need better control here! *)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
412  | 
THEN print_tac options "after sidecond2 simplification"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
413  | 
end  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
414  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
415  | 
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
 | 
416  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
417  | 
val pred_intro_rule = nth (intros_of ctxt pred) (i - 1)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
418  | 
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
 | 
419  | 
    val split_ss = HOL_basic_ss' addsimps [@{thm split_eta}, @{thm split_beta},
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
420  | 
      @{thm fst_conv}, @{thm snd_conv}, @{thm pair_collapse}]
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
421  | 
fun prove_prems2 out_ts [] =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
422  | 
print_tac options "before prove_match2 - last call:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
423  | 
THEN prove_match2 options ctxt out_ts  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
424  | 
THEN print_tac options "after prove_match2 - last call:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
425  | 
      THEN (etac @{thm singleE} 1)
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
426  | 
      THEN (REPEAT_DETERM (etac @{thm Pair_inject} 1))
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
427  | 
THEN (asm_full_simp_tac HOL_basic_ss' 1)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
428  | 
THEN TRY (  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
429  | 
        (REPEAT_DETERM (etac @{thm Pair_inject} 1))
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
430  | 
THEN (asm_full_simp_tac HOL_basic_ss' 1)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
431  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
432  | 
THEN SOLVED (print_tac options "state before applying intro rule:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
433  | 
THEN (rtac pred_intro_rule  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
434  | 
(* How to handle equality correctly? *)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
435  | 
THEN_ALL_NEW (K (print_tac options "state before assumption matching")  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
436  | 
THEN' (atac ORELSE' ((CHANGED o asm_full_simp_tac split_ss) THEN' (TRY o atac)))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
437  | 
THEN' (K (print_tac options "state after pre-simplification:"))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
438  | 
THEN' (K (print_tac options "state after assumption matching:")))) 1))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
439  | 
| 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
 | 
440  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
441  | 
val mode = head_mode_of deriv  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
442  | 
val rest_tac = (case p of  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
443  | 
Prem t =>  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
444  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
445  | 
val (_, us) = strip_comb t  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
446  | 
val (_, out_ts''') = split_mode mode us  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
447  | 
val rec_tac = prove_prems2 out_ts''' ps  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
448  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
449  | 
(prove_expr2 options ctxt (t, deriv)) THEN rec_tac  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
450  | 
end  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
451  | 
| Negprem t =>  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
452  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
453  | 
val (_, args) = strip_comb t  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
454  | 
val (_, out_ts''') = split_mode mode args  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
455  | 
val rec_tac = prove_prems2 out_ts''' ps  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
456  | 
val name = (case strip_comb t of (Const (c, _), _) => SOME c | _ => NONE)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
457  | 
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
 | 
458  | 
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
 | 
459  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
460  | 
print_tac options "before neg prem 2"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
461  | 
            THEN etac @{thm bindE} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
462  | 
THEN (if is_some name then  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
463  | 
full_simp_tac (HOL_basic_ss addsimps  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
464  | 
[predfun_definition_of ctxt (the name) mode]) 1  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
465  | 
                THEN etac @{thm not_predE} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
466  | 
                THEN simp_tac (HOL_basic_ss addsimps [@{thm not_False_eq_True}]) 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
467  | 
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
 | 
468  | 
else  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
469  | 
                etac @{thm not_predE'} 1)
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
470  | 
THEN rec_tac  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
471  | 
end  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
472  | 
| Sidecond t =>  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
473  | 
          etac @{thm bindE} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
474  | 
          THEN etac @{thm if_predE} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
475  | 
THEN prove_sidecond2 options ctxt t  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
476  | 
THEN prove_prems2 [] ps)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
477  | 
in print_tac options "before prove_match2:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
478  | 
THEN prove_match2 options ctxt out_ts  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
479  | 
THEN print_tac options "after prove_match2:"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
480  | 
THEN rest_tac  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
481  | 
end;  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
482  | 
val prems_tac = prove_prems2 in_ts ps  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
483  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
484  | 
print_tac options "starting prove_clause2"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
485  | 
    THEN etac @{thm bindE} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
486  | 
    THEN (etac @{thm singleE'} 1)
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
487  | 
    THEN (TRY (etac @{thm Pair_inject} 1))
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
488  | 
THEN print_tac options "after singleE':"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
489  | 
THEN prems_tac  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
490  | 
end;  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
491  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
492  | 
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
 | 
493  | 
let  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
494  | 
fun prove_clause clause i =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
495  | 
      (if i < length moded_clauses then etac @{thm supE} 1 else all_tac)
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
496  | 
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
 | 
497  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
498  | 
    (DETERM (TRY (rtac @{thm unit.induct} 1)))
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
499  | 
     THEN (REPEAT_DETERM (CHANGED (rewtac @{thm split_paired_all})))
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
500  | 
THEN (rtac (predfun_intro_of ctxt pred mode) 1)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
501  | 
     THEN (REPEAT_DETERM (rtac @{thm refl} 2))
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
502  | 
THEN (if null moded_clauses then  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
503  | 
         etac @{thm botE} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
504  | 
else EVERY (map2 prove_clause moded_clauses (1 upto (length moded_clauses))))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
505  | 
end;  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
506  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
507  | 
(** proof procedure **)  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
508  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
509  | 
fun prove_pred options thy clauses preds pred (pol, mode) (moded_clauses, compiled_term) =  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
510  | 
let  | 
| 42361 | 511  | 
val ctxt = Proof_Context.init_global thy  | 
| 
40052
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
512  | 
val clauses = case AList.lookup (op =) clauses pred of SOME rs => rs | NONE => []  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
513  | 
in  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
514  | 
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
 | 
515  | 
(if not (skip_proof options) then  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
516  | 
(fn _ =>  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
517  | 
        rtac @{thm pred_iffI} 1
 | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
518  | 
THEN print_tac options "after pred_iffI"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
519  | 
THEN 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
 | 
520  | 
THEN print_tac options "proved one direction"  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
521  | 
THEN 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
 | 
522  | 
THEN print_tac options "proved other direction")  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
523  | 
else (fn _ => Skip_Proof.cheat_tac thy))  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
524  | 
end;  | 
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
525  | 
|
| 
 
ea46574ca815
splitting large core file into core_data, mode_inference and predicate_compile_proof
 
bulwahn 
parents:  
diff
changeset
 | 
526  | 
end;  |