| author | wenzelm | 
| Fri, 23 Dec 2016 20:06:54 +0100 | |
| changeset 64668 | 39a6c88c059b | 
| parent 63859 | dca6fabd8060 | 
| child 67703 | 8c4806fe827f | 
| permissions | -rw-r--r-- | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
1  | 
(* Title: HOL/Tools/Transfer/transfer_bnf.ML  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
2  | 
Author: Ondrej Kuncar, TU Muenchen  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
3  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
4  | 
Setup for Transfer for types that are BNF.  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
5  | 
*)  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
6  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
7  | 
signature TRANSFER_BNF =  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
8  | 
sig  | 
| 
59823
 
a03696dc3283
more graceful failure if some of the involved BNFs have no data
 
blanchet 
parents: 
59621 
diff
changeset
 | 
9  | 
exception NO_PRED_DATA of unit  | 
| 
 
a03696dc3283
more graceful failure if some of the involved BNFs have no data
 
blanchet 
parents: 
59621 
diff
changeset
 | 
10  | 
|
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
11  | 
val base_name_of_bnf: BNF_Def.bnf -> binding  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
12  | 
val type_name_of_bnf: BNF_Def.bnf -> string  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
13  | 
val lookup_defined_pred_data: Proof.context -> string -> Transfer.pred_data  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
14  | 
val bnf_only_type_ctr: (BNF_Def.bnf -> 'a -> 'a) -> BNF_Def.bnf -> 'a -> 'a  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
15  | 
end  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
16  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
17  | 
structure Transfer_BNF : TRANSFER_BNF =  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
18  | 
struct  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
19  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
20  | 
open BNF_Util  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
21  | 
open BNF_Def  | 
| 56651 | 22  | 
open BNF_FP_Util  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
23  | 
open BNF_FP_Def_Sugar  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
24  | 
|
| 
59823
 
a03696dc3283
more graceful failure if some of the involved BNFs have no data
 
blanchet 
parents: 
59621 
diff
changeset
 | 
25  | 
exception NO_PRED_DATA of unit  | 
| 
 
a03696dc3283
more graceful failure if some of the involved BNFs have no data
 
blanchet 
parents: 
59621 
diff
changeset
 | 
26  | 
|
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
27  | 
(* util functions *)  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
28  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
29  | 
fun base_name_of_bnf bnf = Binding.name (Binding.name_of (name_of_bnf bnf))  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
30  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
31  | 
fun mk_Domainp P =  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
32  | 
let  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
33  | 
val PT = fastype_of P  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
34  | 
val argT = hd (binder_types PT)  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
35  | 
in  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
36  | 
    Const (@{const_name Domainp}, PT --> argT --> HOLogic.boolT) $ P
 | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
37  | 
end  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
38  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
39  | 
fun type_name_of_bnf bnf = T_of_bnf bnf |> dest_Type |> fst  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
40  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
41  | 
fun is_Type (Type _) = true  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
42  | 
| is_Type _ = false  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
43  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
44  | 
fun bnf_only_type_ctr f bnf = if is_Type (T_of_bnf bnf) then f bnf else I  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
45  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
46  | 
fun bnf_of_fp_sugar (fp_sugar:fp_sugar) = nth (#bnfs (#fp_res fp_sugar)) (#fp_res_index fp_sugar)  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
47  | 
|
| 
61768
 
99f1eaf70c3d
reverted inadvertently qfinished/pushed change r164eeb2ab675
 
blanchet 
parents: 
61761 
diff
changeset
 | 
48  | 
fun fp_sugar_only_type_ctr f fp_sugars =  | 
| 
 
99f1eaf70c3d
reverted inadvertently qfinished/pushed change r164eeb2ab675
 
blanchet 
parents: 
61761 
diff
changeset
 | 
49  | 
(case filter (is_Type o T_of_bnf o bnf_of_fp_sugar) fp_sugars of  | 
| 
 
99f1eaf70c3d
reverted inadvertently qfinished/pushed change r164eeb2ab675
 
blanchet 
parents: 
61761 
diff
changeset
 | 
50  | 
[] => I  | 
| 
 
99f1eaf70c3d
reverted inadvertently qfinished/pushed change r164eeb2ab675
 
blanchet 
parents: 
61761 
diff
changeset
 | 
51  | 
| fp_sugars' => f fp_sugars')  | 
| 
 
99f1eaf70c3d
reverted inadvertently qfinished/pushed change r164eeb2ab675
 
blanchet 
parents: 
61761 
diff
changeset
 | 
52  | 
|
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
53  | 
(* relation constraints - bi_total & co. *)  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
54  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
55  | 
fun mk_relation_constraint name arg =  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
56  | 
(Const (name, fastype_of arg --> HOLogic.boolT)) $ arg  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
57  | 
|
| 62334 | 58  | 
fun side_constraint_tac bnf constr_defs ctxt =  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
59  | 
let  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
60  | 
val thms = constr_defs @ map mk_sym [rel_eq_of_bnf bnf, rel_conversep_of_bnf bnf,  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
61  | 
rel_OO_of_bnf bnf]  | 
| 57399 | 62  | 
in  | 
| 63170 | 63  | 
SELECT_GOAL (Local_Defs.unfold0_tac ctxt thms) THEN' rtac ctxt (rel_mono_of_bnf bnf)  | 
| 62334 | 64  | 
THEN_ALL_NEW assume_tac ctxt  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
65  | 
end  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
66  | 
|
| 62334 | 67  | 
fun bi_constraint_tac constr_iff sided_constr_intros ctxt =  | 
| 63170 | 68  | 
SELECT_GOAL (Local_Defs.unfold0_tac ctxt [constr_iff]) THEN'  | 
| 60728 | 69  | 
CONJ_WRAP' (fn thm => rtac ctxt thm THEN_ALL_NEW  | 
| 62334 | 70  | 
(REPEAT_DETERM o etac ctxt conjE THEN' assume_tac ctxt)) sided_constr_intros  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
71  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
72  | 
fun generate_relation_constraint_goal ctxt bnf constraint_def =  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
73  | 
let  | 
| 59582 | 74  | 
val constr_name =  | 
75  | 
constraint_def |> Thm.prop_of |> HOLogic.dest_Trueprop |> fst o HOLogic.dest_eq  | 
|
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
76  | 
|> head_of |> fst o dest_Const  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
77  | 
val live = live_of_bnf bnf  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
78  | 
val (((As, Bs), Ds), ctxt) = ctxt  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
79  | 
|> mk_TFrees live  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
80  | 
||>> mk_TFrees live  | 
| 60207 | 81  | 
||>> mk_TFrees' (map Type.sort_of_atyp (deads_of_bnf bnf))  | 
| 57399 | 82  | 
|
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
83  | 
val relator = mk_rel_of_bnf Ds As Bs bnf  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
84  | 
val relsT = map2 mk_pred2T As Bs  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
85  | 
val (args, ctxt) = Ctr_Sugar_Util.mk_Frees "R" relsT ctxt  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
86  | 
val concl = HOLogic.mk_Trueprop (mk_relation_constraint constr_name (list_comb (relator, args)))  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
87  | 
val assms = map (HOLogic.mk_Trueprop o (mk_relation_constraint constr_name)) args  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
88  | 
val goal = Logic.list_implies (assms, concl)  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
89  | 
in  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
90  | 
(goal, ctxt)  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
91  | 
end  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
92  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
93  | 
fun prove_relation_side_constraint ctxt bnf constraint_def =  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
94  | 
let  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
95  | 
val old_ctxt = ctxt  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
96  | 
val (goal, ctxt) = generate_relation_constraint_goal ctxt bnf constraint_def  | 
| 
57890
 
1e13f63fb452
use Goal.prove_sorry instead of Goal.prove where possible (= no schematics in goal and tactic is expected to succeed)
 
traytel 
parents: 
57399 
diff
changeset
 | 
97  | 
val thm = Goal.prove_sorry ctxt [] [] goal  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
98  | 
      (fn {context = ctxt, prems = _} => side_constraint_tac bnf [constraint_def] ctxt 1)
 | 
| 
57890
 
1e13f63fb452
use Goal.prove_sorry instead of Goal.prove where possible (= no schematics in goal and tactic is expected to succeed)
 
traytel 
parents: 
57399 
diff
changeset
 | 
99  | 
|> Thm.close_derivation  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
100  | 
in  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
101  | 
Drule.zero_var_indexes (singleton (Variable.export ctxt old_ctxt) thm)  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
102  | 
end  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
103  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
104  | 
fun prove_relation_bi_constraint ctxt bnf constraint_def side_constraints =  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
105  | 
let  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
106  | 
val old_ctxt = ctxt  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
107  | 
val (goal, ctxt) = generate_relation_constraint_goal ctxt bnf constraint_def  | 
| 
57890
 
1e13f63fb452
use Goal.prove_sorry instead of Goal.prove where possible (= no schematics in goal and tactic is expected to succeed)
 
traytel 
parents: 
57399 
diff
changeset
 | 
108  | 
val thm = Goal.prove_sorry ctxt [] [] goal  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
109  | 
      (fn {context = ctxt, prems = _} => bi_constraint_tac constraint_def side_constraints ctxt 1)
 | 
| 
57890
 
1e13f63fb452
use Goal.prove_sorry instead of Goal.prove where possible (= no schematics in goal and tactic is expected to succeed)
 
traytel 
parents: 
57399 
diff
changeset
 | 
110  | 
|> Thm.close_derivation  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
111  | 
in  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
112  | 
Drule.zero_var_indexes (singleton (Variable.export ctxt old_ctxt) thm)  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
113  | 
end  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
114  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
115  | 
val defs = [("left_total_rel", @{thm left_total_alt_def}), ("right_total_rel", @{thm right_total_alt_def}),
 | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
116  | 
  ("left_unique_rel", @{thm left_unique_alt_def}), ("right_unique_rel", @{thm right_unique_alt_def})]
 | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
117  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
118  | 
fun prove_relation_constraints bnf lthy =  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
119  | 
let  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
120  | 
    val transfer_attr = @{attributes [transfer_rule]}
 | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
121  | 
val Tname = base_name_of_bnf bnf  | 
| 57399 | 122  | 
|
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
123  | 
val defs = map (apsnd (prove_relation_side_constraint lthy bnf)) defs  | 
| 57399 | 124  | 
    val bi_total = prove_relation_bi_constraint lthy bnf @{thm bi_total_alt_def}
 | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
125  | 
[snd (nth defs 0), snd (nth defs 1)]  | 
| 57399 | 126  | 
    val bi_unique = prove_relation_bi_constraint lthy bnf @{thm bi_unique_alt_def}
 | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
127  | 
[snd (nth defs 2), snd (nth defs 3)]  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
128  | 
    val defs = ("bi_total_rel", bi_total) :: ("bi_unique_rel", bi_unique) :: defs
 | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
129  | 
in  | 
| 63003 | 130  | 
maps (fn (a, thm) => [((Binding.qualify_name true Tname a, []), [([thm], transfer_attr)])]) defs  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
131  | 
end  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
132  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
133  | 
(* relator_eq *)  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
134  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
135  | 
fun relator_eq bnf =  | 
| 63352 | 136  | 
  [(Binding.empty_atts, [([rel_eq_of_bnf bnf], @{attributes [relator_eq]})])]
 | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
137  | 
|
| 58722 | 138  | 
(* transfer rules *)  | 
139  | 
||
140  | 
fun bnf_transfer_rules bnf =  | 
|
141  | 
let  | 
|
| 62329 | 142  | 
val transfer_rules = map_transfer_of_bnf bnf :: pred_transfer_of_bnf bnf  | 
143  | 
:: rel_transfer_of_bnf bnf :: set_transfer_of_bnf bnf  | 
|
| 58722 | 144  | 
    val transfer_attr = @{attributes [transfer_rule]}
 | 
145  | 
in  | 
|
| 63352 | 146  | 
map (fn thm => (Binding.empty_atts, [([thm],transfer_attr)])) transfer_rules  | 
| 58722 | 147  | 
end  | 
148  | 
||
| 62324 | 149  | 
(* Domainp theorem for predicator *)  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
150  | 
|
| 62334 | 151  | 
fun Domainp_tac bnf pred_def ctxt =  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
152  | 
let  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
153  | 
val n = live_of_bnf bnf  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
154  | 
val set_map's = set_map_of_bnf bnf  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
155  | 
in  | 
| 63170 | 156  | 
    EVERY' [rtac ctxt ext, SELECT_GOAL (Local_Defs.unfold0_tac ctxt [@{thm Domainp.simps},
 | 
| 60728 | 157  | 
in_rel_of_bnf bnf, pred_def]), rtac ctxt iffI,  | 
| 
59498
 
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
 
wenzelm 
parents: 
59276 
diff
changeset
 | 
158  | 
REPEAT_DETERM o eresolve_tac ctxt [exE, conjE, CollectE], hyp_subst_tac ctxt,  | 
| 60728 | 159  | 
CONJ_WRAP' (fn set_map => EVERY' [rtac ctxt ballI, dtac ctxt (set_map RS equalityD1 RS set_mp),  | 
160  | 
etac ctxt imageE, dtac ctxt set_rev_mp, assume_tac ctxt,  | 
|
| 
59498
 
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
 
wenzelm 
parents: 
59276 
diff
changeset
 | 
161  | 
          REPEAT_DETERM o eresolve_tac ctxt [CollectE, @{thm case_prodE}],
 | 
| 60728 | 162  | 
          hyp_subst_tac ctxt, rtac ctxt @{thm iffD2[OF arg_cong2[of _ _ _ _ Domainp, OF refl fst_conv]]},
 | 
163  | 
          etac ctxt @{thm DomainPI}]) set_map's,
 | 
|
164  | 
REPEAT_DETERM o etac ctxt conjE,  | 
|
| 
59498
 
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
 
wenzelm 
parents: 
59276 
diff
changeset
 | 
165  | 
REPEAT_DETERM o resolve_tac ctxt [exI, (refl RS conjI), rotate_prems 1 conjI],  | 
| 60728 | 166  | 
rtac ctxt refl, rtac ctxt (box_equals OF [map_cong0_of_bnf bnf, map_comp_of_bnf bnf RS sym,  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
167  | 
map_id_of_bnf bnf]),  | 
| 60728 | 168  | 
        REPEAT_DETERM_N n o (EVERY' [rtac ctxt @{thm box_equals[OF _ sym[OF o_apply] sym[OF id_apply]]},
 | 
169  | 
          rtac ctxt @{thm fst_conv}]), rtac ctxt CollectI,
 | 
|
170  | 
        CONJ_WRAP' (fn set_map => EVERY' [rtac ctxt (set_map RS @{thm ord_eq_le_trans}),
 | 
|
| 
59498
 
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
 
wenzelm 
parents: 
59276 
diff
changeset
 | 
171  | 
          REPEAT_DETERM o resolve_tac ctxt [@{thm image_subsetI}, CollectI, @{thm case_prodI}],
 | 
| 60728 | 172  | 
dtac ctxt (rotate_prems 1 bspec), assume_tac ctxt,  | 
173  | 
          etac ctxt @{thm DomainpE}, etac ctxt @{thm someI}]) set_map's
 | 
|
| 62334 | 174  | 
]  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
175  | 
end  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
176  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
177  | 
fun prove_Domainp_rel ctxt bnf pred_def =  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
178  | 
let  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
179  | 
val live = live_of_bnf bnf  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
180  | 
val old_ctxt = ctxt  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
181  | 
val (((As, Bs), Ds), ctxt) = ctxt  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
182  | 
|> mk_TFrees live  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
183  | 
||>> mk_TFrees live  | 
| 60207 | 184  | 
||>> mk_TFrees' (map Type.sort_of_atyp (deads_of_bnf bnf))  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
185  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
186  | 
val relator = mk_rel_of_bnf Ds As Bs bnf  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
187  | 
val relsT = map2 mk_pred2T As Bs  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
188  | 
val (args, ctxt) = Ctr_Sugar_Util.mk_Frees "R" relsT ctxt  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
189  | 
val lhs = mk_Domainp (list_comb (relator, args))  | 
| 62324 | 190  | 
val rhs = Term.list_comb (mk_pred_of_bnf Ds As bnf, map mk_Domainp args)  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
191  | 
val goal = HOLogic.mk_eq (lhs, rhs) |> HOLogic.mk_Trueprop  | 
| 
57890
 
1e13f63fb452
use Goal.prove_sorry instead of Goal.prove where possible (= no schematics in goal and tactic is expected to succeed)
 
traytel 
parents: 
57399 
diff
changeset
 | 
192  | 
val thm = Goal.prove_sorry ctxt [] [] goal  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
193  | 
      (fn {context = ctxt, prems = _} => Domainp_tac bnf pred_def ctxt 1)
 | 
| 
57890
 
1e13f63fb452
use Goal.prove_sorry instead of Goal.prove where possible (= no schematics in goal and tactic is expected to succeed)
 
traytel 
parents: 
57399 
diff
changeset
 | 
194  | 
|> Thm.close_derivation  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
195  | 
in  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
196  | 
Drule.zero_var_indexes (singleton (Variable.export ctxt old_ctxt) thm)  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
197  | 
end  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
198  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
199  | 
fun predicator bnf lthy =  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
200  | 
let  | 
| 62324 | 201  | 
val pred_def = pred_set_of_bnf bnf  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
202  | 
val Domainp_rel = prove_Domainp_rel lthy bnf pred_def  | 
| 62324 | 203  | 
val rel_eq_onp = rel_eq_onp_of_bnf bnf  | 
| 63003 | 204  | 
val Domainp_rel_thm_name = Binding.qualify_name true (base_name_of_bnf bnf) "Domainp_rel"  | 
| 60220 | 205  | 
val pred_data = Transfer.mk_pred_data pred_def rel_eq_onp []  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
206  | 
val type_name = type_name_of_bnf bnf  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
207  | 
    val relator_domain_attr = @{attributes [relator_domain]}
 | 
| 62324 | 208  | 
val notes = [((Domainp_rel_thm_name, []), [([Domainp_rel], relator_domain_attr)])]  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
209  | 
in  | 
| 58356 | 210  | 
lthy  | 
211  | 
|> Local_Theory.notes notes  | 
|
212  | 
|> snd  | 
|
213  | 
    |> Local_Theory.declaration {syntax = false, pervasive = true}
 | 
|
214  | 
(fn phi => Transfer.update_pred_data type_name (Transfer.morph_pred_data phi pred_data))  | 
|
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
215  | 
end  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
216  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
217  | 
(* BNF interpretation *)  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
218  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
219  | 
fun transfer_bnf_interpretation bnf lthy =  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
220  | 
let  | 
| 58356 | 221  | 
val dead = dead_of_bnf bnf  | 
222  | 
val constr_notes = if dead > 0 then [] else prove_relation_constraints bnf lthy  | 
|
223  | 
val relator_eq_notes = if dead > 0 then [] else relator_eq bnf  | 
|
| 58722 | 224  | 
val transfer_rule_notes = if dead > 0 then [] else bnf_transfer_rules bnf  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
225  | 
in  | 
| 58356 | 226  | 
lthy  | 
| 58722 | 227  | 
|> Local_Theory.notes (constr_notes @ relator_eq_notes @ transfer_rule_notes)  | 
| 58356 | 228  | 
|> snd  | 
229  | 
|> predicator bnf  | 
|
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
230  | 
end  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
231  | 
|
| 
58659
 
6c9821c32dd5
Local_Interpretation is superseded by Plugin with formal Plugin_Name management, avoiding undeclared strings;
 
wenzelm 
parents: 
58458 
diff
changeset
 | 
232  | 
val _ =  | 
| 
 
6c9821c32dd5
Local_Interpretation is superseded by Plugin with formal Plugin_Name management, avoiding undeclared strings;
 
wenzelm 
parents: 
58458 
diff
changeset
 | 
233  | 
Theory.setup  | 
| 
 
6c9821c32dd5
Local_Interpretation is superseded by Plugin with formal Plugin_Name management, avoiding undeclared strings;
 
wenzelm 
parents: 
58458 
diff
changeset
 | 
234  | 
(bnf_interpretation transfer_plugin (bnf_only_type_ctr transfer_bnf_interpretation))  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
235  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
236  | 
(* simplification rules for the predicator *)  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
237  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
238  | 
fun lookup_defined_pred_data lthy name =  | 
| 
59823
 
a03696dc3283
more graceful failure if some of the involved BNFs have no data
 
blanchet 
parents: 
59621 
diff
changeset
 | 
239  | 
case Transfer.lookup_pred_data lthy name of  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
240  | 
SOME data => data  | 
| 
59823
 
a03696dc3283
more graceful failure if some of the involved BNFs have no data
 
blanchet 
parents: 
59621 
diff
changeset
 | 
241  | 
| NONE => raise NO_PRED_DATA ()  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
242  | 
|
| 
56677
 
660ffb526069
predicator simplification rules: support also partially specialized types e.g. 'a * nat
 
kuncar 
parents: 
56651 
diff
changeset
 | 
243  | 
|
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
244  | 
(* fp_sugar interpretation *)  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
245  | 
|
| 58722 | 246  | 
fun fp_sugar_transfer_rules (fp_sugar:fp_sugar) =  | 
247  | 
let  | 
|
248  | 
val fp_ctr_sugar = #fp_ctr_sugar fp_sugar  | 
|
| 62531 | 249  | 
val transfer_rules = #ctr_transfers fp_ctr_sugar @ #case_transfers fp_ctr_sugar  | 
250  | 
@ #disc_transfers fp_ctr_sugar @ #sel_transfers fp_ctr_sugar  | 
|
| 
63859
 
dca6fabd8060
make (co)induct component of 'fp_sugar' optional, for the benefit of nonuniform (co)datatypes and other similar extensions
 
blanchet 
parents: 
63352 
diff
changeset
 | 
251  | 
@ these (Option.map #co_rec_transfers (#fp_co_induct_sugar fp_sugar))  | 
| 58722 | 252  | 
    val transfer_attr = @{attributes [transfer_rule]}
 | 
253  | 
in  | 
|
| 63352 | 254  | 
map (fn thm => (Binding.empty_atts, [([thm], transfer_attr)])) transfer_rules  | 
| 58722 | 255  | 
end  | 
256  | 
||
| 62335 | 257  | 
fun register_pred_injects fp_sugar lthy =  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
258  | 
let  | 
| 62335 | 259  | 
val pred_injects = #pred_injects (#fp_bnf_sugar fp_sugar)  | 
| 60220 | 260  | 
val type_name = type_name_of_bnf (#fp_bnf fp_sugar)  | 
| 62531 | 261  | 
val pred_data = lookup_defined_pred_data lthy type_name  | 
| 60220 | 262  | 
|> Transfer.update_pred_simps pred_injects  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
263  | 
in  | 
| 62531 | 264  | 
lthy  | 
| 60220 | 265  | 
    |> Local_Theory.declaration {syntax = false, pervasive = true}
 | 
| 62334 | 266  | 
(fn phi => Transfer.update_pred_data type_name (Transfer.morph_pred_data phi pred_data))  | 
| 58722 | 267  | 
end  | 
268  | 
||
269  | 
fun transfer_fp_sugars_interpretation fp_sugar lthy =  | 
|
270  | 
let  | 
|
| 62335 | 271  | 
val lthy = register_pred_injects fp_sugar lthy  | 
| 58722 | 272  | 
val transfer_rules_notes = fp_sugar_transfer_rules fp_sugar  | 
273  | 
in  | 
|
274  | 
lthy  | 
|
| 60220 | 275  | 
|> Local_Theory.notes transfer_rules_notes  | 
| 58722 | 276  | 
|> snd  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
277  | 
end  | 
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
278  | 
|
| 
58659
 
6c9821c32dd5
Local_Interpretation is superseded by Plugin with formal Plugin_Name management, avoiding undeclared strings;
 
wenzelm 
parents: 
58458 
diff
changeset
 | 
279  | 
val _ =  | 
| 
61768
 
99f1eaf70c3d
reverted inadvertently qfinished/pushed change r164eeb2ab675
 
blanchet 
parents: 
61761 
diff
changeset
 | 
280  | 
Theory.setup (fp_sugars_interpretation transfer_plugin  | 
| 
 
99f1eaf70c3d
reverted inadvertently qfinished/pushed change r164eeb2ab675
 
blanchet 
parents: 
61761 
diff
changeset
 | 
281  | 
(fp_sugar_only_type_ctr (fold transfer_fp_sugars_interpretation)))  | 
| 
56524
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
282  | 
|
| 
 
f4ba736040fa
setup for Transfer and Lifting from BNF; tuned thm names
 
kuncar 
parents:  
diff
changeset
 | 
283  | 
end  |