author | wenzelm |
Tue, 05 Dec 2023 20:56:51 +0100 | |
changeset 79134 | 5f0bbed1c606 |
parent 78095 | bc42c074e58f |
child 80634 | a90ab1ea6458 |
permissions | -rw-r--r-- |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
1 |
(* Title: HOL/Tools/Lifting/lifting_def_code_dt.ML |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
2 |
Author: Ondrej Kuncar |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
3 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
4 |
Workaround that allows us to execute lifted constants that have |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
5 |
as a return type a datatype containing a subtype; lift_definition command |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
6 |
*) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
7 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
8 |
signature LIFTING_DEF_CODE_DT = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
9 |
sig |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
10 |
type rep_isom_data |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
11 |
val isom_of_rep_isom_data: rep_isom_data -> term |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
12 |
val transfer_of_rep_isom_data: rep_isom_data -> thm |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
13 |
val bundle_name_of_rep_isom_data: rep_isom_data -> string |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
14 |
val pointer_of_rep_isom_data: rep_isom_data -> string |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
15 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
16 |
type code_dt |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
17 |
val rty_of_code_dt: code_dt -> typ |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
18 |
val qty_of_code_dt: code_dt -> typ |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
19 |
val wit_of_code_dt: code_dt -> term |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
20 |
val wit_thm_of_code_dt: code_dt -> thm |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
21 |
val rep_isom_data_of_code_dt: code_dt -> rep_isom_data option |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
22 |
val morph_code_dt: morphism -> code_dt -> code_dt |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
23 |
val mk_witness_of_code_dt: typ -> code_dt -> term |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
24 |
val mk_rep_isom_of_code_dt: typ -> code_dt -> term option |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
25 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
26 |
val code_dt_of: Proof.context -> typ * typ -> code_dt option |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
27 |
val code_dt_of_global: theory -> typ * typ -> code_dt option |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
28 |
val all_code_dt_of: Proof.context -> code_dt list |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
29 |
val all_code_dt_of_global: theory -> code_dt list |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
30 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
31 |
type config_code_dt = { code_dt: bool, lift_config: Lifting_Def.config } |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
32 |
val default_config_code_dt: config_code_dt |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
33 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
34 |
val add_lift_def_code_dt: |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
35 |
config_code_dt -> binding * mixfix -> typ -> term -> thm -> thm list -> local_theory -> |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
36 |
Lifting_Def.lift_def * local_theory |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
37 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
38 |
val lift_def_code_dt: |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
39 |
config_code_dt -> binding * mixfix -> typ -> term -> (Proof.context -> tactic) -> thm list -> |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
40 |
local_theory -> Lifting_Def.lift_def * local_theory |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
41 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
42 |
val lift_def_cmd: |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
43 |
string list * (binding * string option * mixfix) * string * (Facts.ref * Token.src list) list -> |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
44 |
local_theory -> Proof.state |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
45 |
end |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
46 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
47 |
structure Lifting_Def_Code_Dt: LIFTING_DEF_CODE_DT = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
48 |
struct |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
49 |
|
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
50 |
open Ctr_Sugar_Util BNF_Util BNF_FP_Util BNF_FP_Def_Sugar Lifting_Def Lifting_Util |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
51 |
|
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
52 |
infix 0 MRSL |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
53 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
54 |
(** data structures **) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
55 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
56 |
(* all type variables in qty are in rty *) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
57 |
datatype rep_isom_data = REP_ISOM of { isom: term, transfer: thm, bundle_name: string, pointer: string } |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
58 |
fun isom_of_rep_isom_data (REP_ISOM rep_isom) = #isom rep_isom; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
59 |
fun transfer_of_rep_isom_data (REP_ISOM rep_isom) = #transfer rep_isom; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
60 |
fun bundle_name_of_rep_isom_data (REP_ISOM rep_isom) = #bundle_name rep_isom; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
61 |
fun pointer_of_rep_isom_data (REP_ISOM rep_isom) = #pointer rep_isom; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
62 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
63 |
datatype code_dt = CODE_DT of { rty: typ, qty: typ, wit: term, wit_thm: thm, |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
64 |
rep_isom_data: rep_isom_data option }; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
65 |
fun rty_of_code_dt (CODE_DT code_dt) = #rty code_dt; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
66 |
fun qty_of_code_dt (CODE_DT code_dt) = #qty code_dt; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
67 |
fun wit_of_code_dt (CODE_DT code_dt) = #wit code_dt; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
68 |
fun wit_thm_of_code_dt (CODE_DT code_dt) = #wit_thm code_dt; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
69 |
fun rep_isom_data_of_code_dt (CODE_DT code_dt) = #rep_isom_data code_dt; |
60232
29ac1c6a1fbb
equivalence in code_dt data structure must respect both rty and qty
kuncar
parents:
60231
diff
changeset
|
70 |
fun ty_alpha_equiv (T, U) = Type.raw_instance (T, U) andalso Type.raw_instance (U, T); |
29ac1c6a1fbb
equivalence in code_dt data structure must respect both rty and qty
kuncar
parents:
60231
diff
changeset
|
71 |
fun code_dt_eq c = (ty_alpha_equiv o apply2 rty_of_code_dt) c |
29ac1c6a1fbb
equivalence in code_dt data structure must respect both rty and qty
kuncar
parents:
60231
diff
changeset
|
72 |
andalso (ty_alpha_equiv o apply2 qty_of_code_dt) c; |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
73 |
fun term_of_code_dt code_dt = code_dt |> `rty_of_code_dt ||> qty_of_code_dt |> HOLogic.mk_prodT |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
74 |
|> Net.encode_type |> single; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
75 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
76 |
(* modulo renaming, typ must contain TVars *) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
77 |
fun is_code_dt_of_type (rty, qty) code_dt = code_dt |> `rty_of_code_dt ||> qty_of_code_dt |
60232
29ac1c6a1fbb
equivalence in code_dt data structure must respect both rty and qty
kuncar
parents:
60231
diff
changeset
|
78 |
|> HOLogic.mk_prodT |> curry ty_alpha_equiv (HOLogic.mk_prodT (rty, qty)); |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
79 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
80 |
fun mk_rep_isom_data isom transfer bundle_name pointer = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
81 |
REP_ISOM { isom = isom, transfer = transfer, bundle_name = bundle_name, pointer = pointer} |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
82 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
83 |
fun mk_code_dt rty qty wit wit_thm rep_isom_data = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
84 |
CODE_DT { rty = rty, qty = qty, wit = wit, wit_thm = wit_thm, rep_isom_data = rep_isom_data }; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
85 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
86 |
fun map_rep_isom_data f1 f2 f3 f4 |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
87 |
(REP_ISOM { isom = isom, transfer = transfer, bundle_name = bundle_name, pointer = pointer }) = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
88 |
REP_ISOM { isom = f1 isom, transfer = f2 transfer, bundle_name = f3 bundle_name, pointer = f4 pointer }; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
89 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
90 |
fun map_code_dt f1 f2 f3 f4 f5 f6 f7 f8 |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
91 |
(CODE_DT {rty = rty, qty = qty, wit = wit, wit_thm = wit_thm, rep_isom_data = rep_isom_data}) = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
92 |
CODE_DT {rty = f1 rty, qty = f2 qty, wit = f3 wit, wit_thm = f4 wit_thm, |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
93 |
rep_isom_data = Option.map (map_rep_isom_data f5 f6 f7 f8) rep_isom_data}; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
94 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
95 |
fun update_rep_isom isom transfer binding pointer i = mk_code_dt (rty_of_code_dt i) (qty_of_code_dt i) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
96 |
(wit_of_code_dt i) (wit_thm_of_code_dt i) (SOME (mk_rep_isom_data isom transfer binding pointer)) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
97 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
98 |
fun morph_code_dt phi = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
99 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
100 |
val mty = Morphism.typ phi |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
101 |
val mterm = Morphism.term phi |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
102 |
val mthm = Morphism.thm phi |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
103 |
in |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
104 |
map_code_dt mty mty mterm mthm mterm mthm I I |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
105 |
end |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
106 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
107 |
val transfer_code_dt = morph_code_dt o Morphism.transfer_morphism; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
108 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
109 |
structure Data = Generic_Data |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
110 |
( |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
111 |
type T = code_dt Item_Net.T |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
112 |
val empty = Item_Net.init code_dt_eq term_of_code_dt |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
113 |
val merge = Item_Net.merge |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
114 |
); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
115 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
116 |
fun code_dt_of_generic context (rty, qty) = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
117 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
118 |
val typ = HOLogic.mk_prodT (rty, qty) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
119 |
val prefiltred = Item_Net.retrieve_matching (Data.get context) (Net.encode_type typ) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
120 |
in |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
121 |
prefiltred |> filter (is_code_dt_of_type (rty, qty)) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
122 |
|> map (transfer_code_dt (Context.theory_of context)) |> find_first (fn _ => true) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
123 |
end; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
124 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
125 |
fun code_dt_of ctxt (rty, qty) = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
126 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
127 |
val sch_rty = Logic.type_map (singleton (Variable.polymorphic ctxt)) rty |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
128 |
val sch_qty = Logic.type_map (singleton (Variable.polymorphic ctxt)) qty |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
129 |
in |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
130 |
code_dt_of_generic (Context.Proof ctxt) (sch_rty, sch_qty) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
131 |
end; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
132 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
133 |
fun code_dt_of_global thy (rty, qty) = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
134 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
135 |
val sch_rty = Logic.varifyT_global rty |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
136 |
val sch_qty = Logic.varifyT_global qty |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
137 |
in |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
138 |
code_dt_of_generic (Context.Theory thy) (sch_rty, sch_qty) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
139 |
end; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
140 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
141 |
fun all_code_dt_of_generic context = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
142 |
Item_Net.content (Data.get context) |> map (transfer_code_dt (Context.theory_of context)); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
143 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
144 |
val all_code_dt_of = all_code_dt_of_generic o Context.Proof; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
145 |
val all_code_dt_of_global = all_code_dt_of_generic o Context.Theory; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
146 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
147 |
fun update_code_dt code_dt = |
72450 | 148 |
(snd o Local_Theory.begin_nested) |
78095 | 149 |
#> Local_Theory.declaration {syntax = false, pervasive = true, pos = \<^here>} |
66017 | 150 |
(fn phi => Data.map (Item_Net.update (morph_code_dt phi code_dt))) |
72450 | 151 |
#> Local_Theory.end_nested |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
152 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
153 |
fun mk_match_of_code_dt qty code_dt = Vartab.empty |> Type.raw_match (qty_of_code_dt code_dt, qty) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
154 |
|> Vartab.dest |> map (fn (x, (S, T)) => (TVar (x, S), T)); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
155 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
156 |
fun mk_witness_of_code_dt qty code_dt = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
157 |
Term.subst_atomic_types (mk_match_of_code_dt qty code_dt) (wit_of_code_dt code_dt) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
158 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
159 |
fun mk_rep_isom_of_code_dt qty code_dt = Option.map |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
160 |
(isom_of_rep_isom_data #> Term.subst_atomic_types (mk_match_of_code_dt qty code_dt)) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
161 |
(rep_isom_data_of_code_dt code_dt) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
162 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
163 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
164 |
(** unique name for a type **) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
165 |
|
69593 | 166 |
fun var_name name sort = if sort = \<^sort>\<open>{type}\<close> orelse sort = [] then ["x" ^ name] |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
167 |
else "x" ^ name :: "x_" :: sort @ ["x_"]; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
168 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
169 |
fun concat_Tnames (Type (name, ts)) = name :: maps concat_Tnames ts |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
170 |
| concat_Tnames (TFree (name, sort)) = var_name name sort |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
171 |
| concat_Tnames (TVar ((name, _), sort)) = var_name name sort; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
172 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
173 |
fun unique_Tname (rty, qty) = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
174 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
175 |
val Tnames = map Long_Name.base_name (concat_Tnames rty @ ["x_x"] @ concat_Tnames qty); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
176 |
in |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
177 |
fold (Binding.qualify false) (tl Tnames) (Binding.name (hd Tnames)) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
178 |
end; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
179 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
180 |
(** witnesses **) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
181 |
|
69593 | 182 |
fun mk_undefined T = Const (\<^const_name>\<open>undefined\<close>, T); |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
183 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
184 |
fun mk_witness quot_thm = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
185 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
186 |
val wit_thm = quot_thm RS @{thm type_definition_Quotient_not_empty_witness} |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
187 |
val wit = quot_thm_rep quot_thm $ mk_undefined (quot_thm_rty_qty quot_thm |> snd) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
188 |
in |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
189 |
(wit, wit_thm) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
190 |
end |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
191 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
192 |
(** config **) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
193 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
194 |
type config_code_dt = { code_dt: bool, lift_config: config } |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
195 |
val default_config_code_dt = { code_dt = false, lift_config = default_config } |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
196 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
197 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
198 |
(** Main code **) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
199 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
200 |
val ld_no_notes = { notes = false } |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
201 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
202 |
fun comp_lift_error _ _ = error "Composition of abstract types has not been implemented yet." |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
203 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
204 |
fun lift qty (quot_thm, (lthy, rel_eq_onps)) = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
205 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
206 |
val quot_thm = Lifting_Term.force_qty_type lthy qty quot_thm |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
207 |
val (rty, qty) = quot_thm_rty_qty quot_thm; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
208 |
in |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
209 |
if is_none (code_dt_of lthy (rty, qty)) then |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
210 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
211 |
val (wit, wit_thm) = (mk_witness quot_thm |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
212 |
handle THM _ => error ("code_dt: " ^ quote (Tname qty) ^ " was not defined as a subtype.")) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
213 |
val code_dt = mk_code_dt rty qty wit wit_thm NONE |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
214 |
in |
66017 | 215 |
(quot_thm, (update_code_dt code_dt lthy, rel_eq_onps)) |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
216 |
end |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
217 |
else |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
218 |
(quot_thm, (lthy, rel_eq_onps)) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
219 |
end; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
220 |
|
60784 | 221 |
fun case_tac rule = |
222 |
Subgoal.FOCUS_PARAMS (fn {context = ctxt, params, ...} => |
|
223 |
HEADGOAL (rtac ctxt (infer_instantiate' ctxt [SOME (snd (hd params))] rule))); |
|
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
224 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
225 |
fun bundle_name_of_bundle_binding binding phi context = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
226 |
Name_Space.full_name (Name_Space.naming_of context) (Morphism.binding phi binding); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
227 |
|
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
228 |
fun prove_schematic_quot_thm actions ctxt = |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
229 |
Lifting_Term.prove_schematic_quot_thm actions (Lifting_Info.get_quotients ctxt) ctxt |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
230 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
231 |
fun prove_code_dt (rty, qty) lthy = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
232 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
233 |
val (fold_quot_thm: (local_theory * thm list) Lifting_Term.fold_quot_thm) = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
234 |
{ constr = constr, lift = lift, comp_lift = comp_lift_error }; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
235 |
in prove_schematic_quot_thm fold_quot_thm lthy (rty, qty) (lthy, []) |> snd end |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
236 |
and add_lift_def_code_dt config var qty rhs rsp_thm par_thms lthy = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
237 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
238 |
fun binop_conv2 cv1 cv2 = Conv.combination_conv (Conv.arg_conv cv1) cv2 |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
239 |
fun ret_rel_conv conv ctm = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
240 |
case (Thm.term_of ctm) of |
69593 | 241 |
Const (\<^const_name>\<open>rel_fun\<close>, _) $ _ $ _ => |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
242 |
binop_conv2 Conv.all_conv conv ctm |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
243 |
| _ => conv ctm |
74545 | 244 |
fun R_conv rel_eq_onps ctxt = |
245 |
Conv.top_sweep_rewrs_conv @{thms eq_onp_top_eq_eq[symmetric, THEN eq_reflection]} ctxt |
|
246 |
then_conv Conv.bottom_rewrs_conv rel_eq_onps ctxt |
|
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
247 |
|
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
248 |
val (ret_lift_def, lthy1) = add_lift_def (#lift_config config) var qty rhs rsp_thm par_thms lthy |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
249 |
in |
60230
4857d553c52c
go back to the complicated code equation registration (because of type classes) that was lost in 922586b1bc87; make it even more hackish to get which code equation was used
kuncar
parents:
60229
diff
changeset
|
250 |
if (not (#code_dt config) orelse (code_eq_of_lift_def ret_lift_def <> NONE_EQ) |
4857d553c52c
go back to the complicated code equation registration (because of type classes) that was lost in 922586b1bc87; make it even more hackish to get which code equation was used
kuncar
parents:
60229
diff
changeset
|
251 |
andalso (code_eq_of_lift_def ret_lift_def <> UNKNOWN_EQ)) |
4857d553c52c
go back to the complicated code equation registration (because of type classes) that was lost in 922586b1bc87; make it even more hackish to get which code equation was used
kuncar
parents:
60229
diff
changeset
|
252 |
(* Let us try even in case of UNKNOWN_EQ. If this leads to problems, the user can always |
4857d553c52c
go back to the complicated code equation registration (because of type classes) that was lost in 922586b1bc87; make it even more hackish to get which code equation was used
kuncar
parents:
60229
diff
changeset
|
253 |
say that they do not want this workaround. *) |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
254 |
then (ret_lift_def, lthy1) |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
255 |
else |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
256 |
let |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
257 |
val lift_def = inst_of_lift_def lthy1 qty ret_lift_def |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
258 |
val rty = rty_of_lift_def lift_def |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
259 |
val rty_ret = body_type rty |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
260 |
val qty_ret = body_type qty |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
261 |
|
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
262 |
val (lthy2, rel_eq_onps) = prove_code_dt (rty_ret, qty_ret) lthy1 |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
263 |
val code_dt = code_dt_of lthy2 (rty_ret, qty_ret) |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
264 |
in |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
265 |
if is_none code_dt orelse is_none (rep_isom_data_of_code_dt (the code_dt)) |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
266 |
then (ret_lift_def, lthy2) |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
267 |
else |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
268 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
269 |
val code_dt = the code_dt |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
270 |
val rhs = dest_comb (rhs_of_lift_def lift_def) |> snd |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
271 |
val rep_isom_data = code_dt |> rep_isom_data_of_code_dt |> the |
60235
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
272 |
val pointer = pointer_of_rep_isom_data rep_isom_data |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
273 |
val quot_active = |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
274 |
Lifting_Info.lookup_restore_data lthy2 pointer |> the |> #quotient |> #quot_thm |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
275 |
|> Lifting_Info.lookup_quot_thm_quotients lthy2 |> is_some |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
276 |
val qty_code_dt_bundle_name = bundle_name_of_rep_isom_data rep_isom_data |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
277 |
val rep_isom = mk_rep_isom_of_code_dt qty_ret code_dt |> the |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
278 |
val lthy3 = if quot_active then lthy2 else Bundle.includes [qty_code_dt_bundle_name] lthy2 |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
279 |
fun qty_isom_of_rep_isom rep = rep |> dest_Const |> snd |> domain_type |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
280 |
val qty_isom = qty_isom_of_rep_isom rep_isom |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
281 |
val f'_var = (Binding.suffix_name "_aux" (fst var), NoSyn); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
282 |
val f'_qty = strip_type qty |> fst |> rpair qty_isom |> op ---> |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
283 |
val f'_rsp_rel = Lifting_Term.equiv_relation lthy3 (rty, f'_qty); |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
284 |
val rsp = rsp_thm_of_lift_def lift_def |
74545 | 285 |
val rel_eq_onps_conv = |
286 |
HOLogic.Trueprop_conv (Conv.fun2_conv (ret_rel_conv (R_conv rel_eq_onps lthy3))) |
|
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
287 |
val rsp_norm = Conv.fconv_rule rel_eq_onps_conv rsp |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
288 |
val f'_rsp_goal = HOLogic.mk_Trueprop (f'_rsp_rel $ rhs $ rhs); |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
289 |
val f'_rsp = Goal.prove_sorry lthy3 [] [] f'_rsp_goal |
60728 | 290 |
(fn {context = ctxt, prems = _} => |
291 |
HEADGOAL (CONVERSION (rel_eq_onps_conv) THEN' rtac ctxt rsp_norm)) |
|
70494 | 292 |
|> Thm.close_derivation \<^here> |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
293 |
val (f'_lift_def, lthy4) = add_lift_def ld_no_notes f'_var f'_qty rhs f'_rsp [] lthy3 |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
294 |
val f'_lift_def = inst_of_lift_def lthy4 f'_qty f'_lift_def |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
295 |
val f'_lift_const = mk_lift_const_of_lift_def f'_qty f'_lift_def |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
296 |
val (args, args_ctxt) = mk_Frees "x" (binder_types qty) lthy4 |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
297 |
val f_alt_def_goal_lhs = list_comb (lift_const_of_lift_def lift_def, args); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
298 |
val f_alt_def_goal_rhs = rep_isom $ list_comb (f'_lift_const, args); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
299 |
val f_alt_def_goal = HOLogic.mk_Trueprop (HOLogic.mk_eq (f_alt_def_goal_lhs, f_alt_def_goal_rhs)); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
300 |
fun f_alt_def_tac ctxt i = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
301 |
EVERY' [Transfer.gen_frees_tac [] ctxt, DETERM o Transfer.transfer_tac true ctxt, |
63170 | 302 |
SELECT_GOAL (Local_Defs.unfold0_tac ctxt [id_apply]), rtac ctxt refl] i; |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
303 |
val rep_isom_transfer = transfer_of_rep_isom_data rep_isom_data |
70321 | 304 |
val (_, transfer_ctxt) = args_ctxt |
305 |
|> Proof_Context.note_thms "" |
|
306 |
(Binding.empty_atts, [([rep_isom_transfer], [Transfer.transfer_add])]) |
|
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
307 |
val f_alt_def = |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
308 |
Goal.prove_sorry transfer_ctxt [] [] f_alt_def_goal |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
309 |
(fn {context = goal_ctxt, ...} => HEADGOAL (f_alt_def_tac goal_ctxt)) |
70494 | 310 |
|> Thm.close_derivation \<^here> |
70321 | 311 |
|> singleton (Variable.export transfer_ctxt lthy4) |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
312 |
val lthy5 = lthy4 |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
313 |
|> Local_Theory.note ((Binding.empty, @{attributes [code]}), [f_alt_def]) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
314 |
|> snd |
60235
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
315 |
(* if processing a mutual datatype (there is a cycle!) the corresponding quotient |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
316 |
will be needed later and will be forgotten later *) |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
317 |
|> (if quot_active then I else Lifting_Setup.lifting_forget pointer) |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
318 |
in |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
319 |
(ret_lift_def, lthy5) |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
320 |
end |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
321 |
end |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
322 |
end |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
323 |
and mk_rep_isom qty_isom_bundle (rty, qty, qty_isom) lthy0 = |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
324 |
let |
60235
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
325 |
(* logical definition of qty qty_isom isomorphism *) |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
326 |
val uTname = unique_Tname (rty, qty) |
63170 | 327 |
fun eq_onp_to_top_tac ctxt = SELECT_GOAL (Local_Defs.unfold0_tac ctxt |
60235
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
328 |
(@{thm eq_onp_top_eq_eq[symmetric]} :: Lifting_Info.get_relator_eq_onp_rules ctxt)) |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
329 |
fun lift_isom_tac ctxt = HEADGOAL (eq_onp_to_top_tac ctxt |
60728 | 330 |
THEN' (rtac ctxt @{thm id_transfer})); |
60235
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
331 |
|
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
332 |
val (rep_isom_lift_def, lthy1) = lthy0 |
72450 | 333 |
|> (snd o Local_Theory.begin_nested) |
66017 | 334 |
|> lift_def ld_no_notes (Binding.qualify_name true uTname "Rep_isom", NoSyn) |
335 |
(qty_isom --> qty) (HOLogic.id_const rty) lift_isom_tac [] |
|
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
336 |
|>> inst_of_lift_def lthy0 (qty_isom --> qty); |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
337 |
val (abs_isom, lthy2) = lthy1 |
66017 | 338 |
|> lift_def ld_no_notes (Binding.qualify_name true uTname "Abs_isom", NoSyn) |
339 |
(qty --> qty_isom) (HOLogic.id_const rty) lift_isom_tac [] |
|
340 |
|>> mk_lift_const_of_lift_def (qty --> qty_isom); |
|
60235
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
341 |
val rep_isom = lift_const_of_lift_def rep_isom_lift_def |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
342 |
|
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
343 |
val pointer = Lifting_Setup.pointer_of_bundle_binding lthy2 qty_isom_bundle |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
344 |
fun code_dt phi context = |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
345 |
code_dt_of lthy2 (rty, qty) |> the |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
346 |
|> update_rep_isom rep_isom (transfer_rules_of_lift_def rep_isom_lift_def |> hd) |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
347 |
(bundle_name_of_bundle_binding qty_isom_bundle phi context) pointer; |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
348 |
val lthy3 = lthy2 |
78095 | 349 |
|> Local_Theory.declaration {syntax = false, pervasive = true, pos = \<^here>} |
60235
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
350 |
(fn phi => fn context => Data.map (Item_Net.update (morph_code_dt phi (code_dt phi context))) context) |
72450 | 351 |
|> Local_Theory.end_nested |
60235
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
352 |
|
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
353 |
(* in order to make the qty qty_isom isomorphism executable we have to define discriminators |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
354 |
and selectors for qty_isom *) |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
355 |
val (rty_name, typs) = dest_Type rty |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
356 |
val (_, qty_typs) = dest_Type qty |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
357 |
val fp = BNF_FP_Def_Sugar.fp_sugar_of lthy3 rty_name |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
358 |
val fp = if is_some fp then the fp |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
359 |
else error ("code_dt: " ^ quote rty_name ^ " is not a datatype.") |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
360 |
val ctr_sugar = fp |> #fp_ctr_sugar |> #ctr_sugar |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
361 |
val ctrs = map (Ctr_Sugar.mk_ctr typs) (#ctrs ctr_sugar); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
362 |
val qty_ctrs = map (Ctr_Sugar.mk_ctr qty_typs) (#ctrs ctr_sugar); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
363 |
val ctr_Tss = map (dest_Const #> snd #> binder_types) ctrs; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
364 |
val qty_ctr_Tss = map (dest_Const #> snd #> binder_types) qty_ctrs; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
365 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
366 |
val n = length ctrs; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
367 |
val ks = 1 upto n; |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
368 |
val (xss, _) = mk_Freess "x" ctr_Tss lthy3; |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
369 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
370 |
fun sel_retT (rty' as Type (s, rtys'), qty' as Type (s', qtys')) = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
371 |
if (rty', qty') = (rty, qty) then qty_isom else (if s = s' |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
372 |
then Type (s, map sel_retT (rtys' ~~ qtys')) else qty') |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
373 |
| sel_retT (_, qty') = qty'; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
374 |
|
60233 | 375 |
val sel_retTs = map2 (map2 (sel_retT oo pair)) ctr_Tss qty_ctr_Tss |
376 |
||
377 |
fun lazy_prove_code_dt (rty, qty) lthy = |
|
378 |
if is_none (code_dt_of lthy (rty, qty)) then prove_code_dt (rty, qty) lthy |> fst else lthy; |
|
379 |
||
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
380 |
val lthy4 = fold2 (fold2 (lazy_prove_code_dt oo pair)) ctr_Tss sel_retTs lthy3 |
60233 | 381 |
|
382 |
val sel_argss = @{map 4} (fn k => fn xs => @{map 2} (fn x => fn qty_ret => |
|
383 |
(k, qty_ret, (xs, x)))) ks xss xss sel_retTs; |
|
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
384 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
385 |
fun mk_sel_casex (_, _, (_, x)) = Ctr_Sugar.mk_case typs (x |> dest_Free |> snd) (#casex ctr_sugar); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
386 |
val dis_casex = Ctr_Sugar.mk_case typs HOLogic.boolT (#casex ctr_sugar); |
60233 | 387 |
fun mk_sel_case_args lthy ctr_Tss ks (k, qty_ret, (xs, x)) = |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
388 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
389 |
val T = x |> dest_Free |> snd; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
390 |
fun gen_undef_wit Ts wits = |
60233 | 391 |
case code_dt_of lthy (T, qty_ret) of |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
392 |
SOME code_dt => |
60233 | 393 |
(fold_rev (Term.lambda o curry Free Name.uu) Ts (mk_witness_of_code_dt qty_ret code_dt), |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
394 |
wit_thm_of_code_dt code_dt :: wits) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
395 |
| NONE => (fold_rev (Term.lambda o curry Free Name.uu) Ts (mk_undefined T), wits) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
396 |
in |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
397 |
@{fold_map 2} (fn Ts => fn k' => fn wits => |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
398 |
(if k = k' then (fold_rev Term.lambda xs x, wits) else gen_undef_wit Ts wits)) ctr_Tss ks [] |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
399 |
end; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
400 |
fun mk_sel_rhs arg = |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
401 |
let val (sel_rhs, wits) = mk_sel_case_args lthy4 ctr_Tss ks arg |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
402 |
in (arg |> #2, wits, list_comb (mk_sel_casex arg, sel_rhs)) end; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
403 |
fun mk_dis_case_args args k = map (fn (k', arg) => (if k = k' |
74383 | 404 |
then fold_rev Term.lambda arg \<^Const>\<open>True\<close> else fold_rev Term.lambda arg \<^Const>\<open>False\<close>)) args; |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
405 |
val sel_rhs = map (map mk_sel_rhs) sel_argss |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
406 |
val dis_rhs = map (fn k => list_comb (dis_casex, mk_dis_case_args (ks ~~ xss) k)) ks |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
407 |
val dis_qty = qty_isom --> HOLogic.boolT; |
63003 | 408 |
val dis_names = map (fn k => Binding.qualify_name true uTname ("dis" ^ string_of_int k)) ks; |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
409 |
|
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
410 |
val (diss, lthy5) = @{fold_map 2} (fn b => fn rhs => fn lthy => |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
411 |
lift_def ld_no_notes (b, NoSyn) dis_qty rhs (K all_tac) [] lthy |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
412 |
|>> mk_lift_const_of_lift_def dis_qty) dis_names dis_rhs lthy4 |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
413 |
|
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
414 |
val unfold_lift_sel_rsp = @{lemma "(\<And>x. P1 x \<Longrightarrow> P2 (f x)) \<Longrightarrow> (rel_fun (eq_onp P1) (eq_onp P2)) f f" |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
415 |
by (simp add: eq_onp_same_args rel_fun_eq_onp_rel)} |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
416 |
|
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
417 |
fun lift_sel_tac exhaust_rule dt_rules wits ctxt i = |
61841
4d3527b94f2a
more general types Proof.method / context_tactic;
wenzelm
parents:
61466
diff
changeset
|
418 |
(Method.insert_tac ctxt wits THEN' |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
419 |
eq_onp_to_top_tac ctxt THEN' (* normalize *) |
60728 | 420 |
rtac ctxt unfold_lift_sel_rsp THEN' |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
421 |
case_tac exhaust_rule ctxt THEN_ALL_NEW ( |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
422 |
EVERY' [hyp_subst_tac ctxt, (* does not kill wits because = was rewritten to eq_onp top *) |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
423 |
Raw_Simplifier.rewrite_goal_tac ctxt (map safe_mk_meta_eq dt_rules), |
60752 | 424 |
REPEAT_DETERM o etac ctxt conjE, assume_tac ctxt])) i |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
425 |
val pred_simps = Transfer.lookup_pred_data lthy5 (Tname rty) |> the |> Transfer.pred_simps |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
426 |
val sel_tac = lift_sel_tac (#exhaust ctr_sugar) (#case_thms ctr_sugar @ pred_simps) |
63003 | 427 |
val sel_names = |
428 |
map (fn (k, xs) => |
|
429 |
map (fn k' => Binding.qualify_name true uTname ("sel" ^ string_of_int k ^ string_of_int k')) |
|
430 |
(1 upto length xs)) (ks ~~ ctr_Tss); |
|
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
431 |
val (selss, lthy6) = @{fold_map 2} (@{fold_map 2} (fn b => fn (qty_ret, wits, rhs) => fn lthy => |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
432 |
lift_def_code_dt { code_dt = true, lift_config = ld_no_notes } |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
433 |
(b, NoSyn) (qty_isom --> qty_ret) rhs (HEADGOAL o sel_tac wits) [] lthy |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
434 |
|>> mk_lift_const_of_lift_def (qty_isom --> qty_ret))) sel_names sel_rhs lthy5 |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
435 |
|
60235
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
436 |
(* now we can execute the qty qty_isom isomorphism *) |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
437 |
fun mk_type_definition newT oldT RepC AbsC A = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
438 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
439 |
val typedefC = |
69593 | 440 |
Const (\<^const_name>\<open>type_definition\<close>, |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
441 |
(newT --> oldT) --> (oldT --> newT) --> HOLogic.mk_setT oldT --> HOLogic.boolT); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
442 |
in typedefC $ RepC $ AbsC $ A end; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
443 |
val typedef_goal = mk_type_definition qty_isom qty rep_isom abs_isom (HOLogic.mk_UNIV qty) |> |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
444 |
HOLogic.mk_Trueprop; |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
445 |
fun typ_isom_tac ctxt i = |
63170 | 446 |
EVERY' [ SELECT_GOAL (Local_Defs.unfold0_tac ctxt @{thms type_definition_def}), |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
447 |
DETERM o Transfer.transfer_tac true ctxt, |
63170 | 448 |
SELECT_GOAL (Local_Defs.unfold0_tac ctxt @{thms eq_onp_top_eq_eq}) (* normalize *), |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
449 |
Raw_Simplifier.rewrite_goal_tac ctxt |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
450 |
(map safe_mk_meta_eq @{thms id_apply simp_thms Ball_def}), |
60728 | 451 |
rtac ctxt TrueI] i; |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
452 |
|
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
453 |
val (_, transfer_ctxt) = |
67713 | 454 |
Proof_Context.note_thms "" |
455 |
(Binding.empty_atts, |
|
456 |
[(@{thms right_total_UNIV_transfer}, [Transfer.transfer_add]), |
|
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
457 |
(@{thms Domain_eq_top}, [Transfer.transfer_domain_add])]) lthy6; |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
458 |
|
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
459 |
val quot_thm_isom = |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
460 |
Goal.prove_sorry transfer_ctxt [] [] typedef_goal |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
461 |
(fn {context = goal_ctxt, ...} => typ_isom_tac goal_ctxt 1) |
70494 | 462 |
|> Thm.close_derivation \<^here> |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
463 |
|> singleton (Variable.export transfer_ctxt lthy6) |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
464 |
|> (fn thm => @{thm UNIV_typedef_to_Quotient} OF [thm, @{thm reflexive}]) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
465 |
val qty_isom_name = Tname qty_isom; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
466 |
val quot_isom_rep = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
467 |
let |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
468 |
val (quotients : Lifting_Term.quotients) = |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
469 |
Symtab.insert (Lifting_Info.quotient_eq) |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
470 |
(qty_isom_name, {quot_thm = quot_thm_isom, pcr_info = NONE}) Symtab.empty |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
471 |
val id_actions = { constr = K I, lift = K I, comp_lift = K I } |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
472 |
in |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
473 |
fn ctxt => fn (rty, qty) => Lifting_Term.prove_schematic_quot_thm id_actions quotients |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
474 |
ctxt (rty, qty) () |> fst |> Lifting_Term.force_qty_type ctxt qty |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
475 |
|> quot_thm_rep |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
476 |
end; |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
477 |
val (x, x_ctxt) = yield_singleton (mk_Frees "x") qty_isom lthy6; |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
478 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
479 |
fun mk_ctr ctr ctr_Ts sels = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
480 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
481 |
val sel_ret_Ts = map (dest_Const #> snd #> body_type) sels; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
482 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
483 |
fun rep_isom lthy t (rty, qty) = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
484 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
485 |
val rep = quot_isom_rep lthy (rty, qty) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
486 |
in |
69593 | 487 |
if is_Const rep andalso (rep |> dest_Const |> fst) = \<^const_name>\<open>id\<close> then |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
488 |
t else rep $ t |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
489 |
end; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
490 |
in |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
491 |
@{fold 3} (fn sel => fn ctr_T => fn sel_ret_T => fn ctr => |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
492 |
ctr $ rep_isom x_ctxt (sel $ x) (ctr_T, sel_ret_T)) sels ctr_Ts sel_ret_Ts ctr |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
493 |
end; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
494 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
495 |
(* stolen from Metis *) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
496 |
exception BREAK_LIST |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
497 |
fun break_list (x :: xs) = (x, xs) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
498 |
| break_list _ = raise BREAK_LIST |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
499 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
500 |
val (ctr, ctrs) = qty_ctrs |> rev |> break_list; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
501 |
val (ctr_Ts, ctr_Tss) = qty_ctr_Tss |> rev |> break_list; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
502 |
val (sel, rselss) = selss |> rev |> break_list; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
503 |
val rdiss = rev diss |> tl; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
504 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
505 |
val first_ctr = mk_ctr ctr ctr_Ts sel; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
506 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
507 |
fun mk_If_ctr dis ctr ctr_Ts sel elsex = mk_If (dis$x) (mk_ctr ctr ctr_Ts sel) elsex; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
508 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
509 |
val rhs = @{fold 4} mk_If_ctr rdiss ctrs ctr_Tss rselss first_ctr; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
510 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
511 |
val rep_isom_code_goal = HOLogic.mk_Trueprop (HOLogic.mk_eq (rep_isom$x, rhs)); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
512 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
513 |
local |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
514 |
val rep_isom_code_tac_rules = map safe_mk_meta_eq @{thms refl id_apply if_splits simp_thms} |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
515 |
in |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
516 |
fun rep_isom_code_tac (ctr_sugar:Ctr_Sugar.ctr_sugar) ctxt i = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
517 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
518 |
val exhaust = ctr_sugar |> #exhaust |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
519 |
val cases = ctr_sugar |> #case_thms |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
520 |
val map_ids = fp |> #fp_nesting_bnfs |> map BNF_Def.map_id0_of_bnf |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
521 |
val simp_rules = map safe_mk_meta_eq (cases @ map_ids) @ rep_isom_code_tac_rules |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
522 |
in |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
523 |
EVERY' [Transfer.gen_frees_tac [] ctxt, DETERM o (Transfer.transfer_tac true ctxt), |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
524 |
case_tac exhaust ctxt THEN_ALL_NEW EVERY' [hyp_subst_tac ctxt, |
60728 | 525 |
Raw_Simplifier.rewrite_goal_tac ctxt simp_rules, rtac ctxt TrueI ]] i |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
526 |
end |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
527 |
end |
60234
17ff843807cb
more readable error message if some types do not correspond to sort constraints of the datatype
kuncar
parents:
60233
diff
changeset
|
528 |
|
17ff843807cb
more readable error message if some types do not correspond to sort constraints of the datatype
kuncar
parents:
60233
diff
changeset
|
529 |
(* stolen from bnf_fp_n2m.ML *) |
17ff843807cb
more readable error message if some types do not correspond to sort constraints of the datatype
kuncar
parents:
60233
diff
changeset
|
530 |
fun force_typ ctxt T = |
17ff843807cb
more readable error message if some types do not correspond to sort constraints of the datatype
kuncar
parents:
60233
diff
changeset
|
531 |
Term.map_types Type_Infer.paramify_vars |
17ff843807cb
more readable error message if some types do not correspond to sort constraints of the datatype
kuncar
parents:
60233
diff
changeset
|
532 |
#> Type.constraint T |
17ff843807cb
more readable error message if some types do not correspond to sort constraints of the datatype
kuncar
parents:
60233
diff
changeset
|
533 |
#> singleton (Type_Infer_Context.infer_types ctxt); |
17ff843807cb
more readable error message if some types do not correspond to sort constraints of the datatype
kuncar
parents:
60233
diff
changeset
|
534 |
|
17ff843807cb
more readable error message if some types do not correspond to sort constraints of the datatype
kuncar
parents:
60233
diff
changeset
|
535 |
(* The following tests that types in rty have corresponding arities imposed by constraints of |
17ff843807cb
more readable error message if some types do not correspond to sort constraints of the datatype
kuncar
parents:
60233
diff
changeset
|
536 |
the datatype fp. Otherwise rep_isom_code_tac could fail (especially transfer in it) is such |
17ff843807cb
more readable error message if some types do not correspond to sort constraints of the datatype
kuncar
parents:
60233
diff
changeset
|
537 |
a way that it is not easy to infer the problem with sorts. |
17ff843807cb
more readable error message if some types do not correspond to sort constraints of the datatype
kuncar
parents:
60233
diff
changeset
|
538 |
*) |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
539 |
val _ = yield_singleton (mk_Frees "x") (#T fp) x_ctxt |> fst |> force_typ x_ctxt qty |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
540 |
|
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
541 |
val rep_isom_code = |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
542 |
Goal.prove_sorry x_ctxt [] [] rep_isom_code_goal |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
543 |
(fn {context = goal_ctxt, ...} => rep_isom_code_tac ctr_sugar goal_ctxt 1) |
70494 | 544 |
|> Thm.close_derivation \<^here> |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
545 |
|> singleton(Variable.export x_ctxt lthy6) |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
546 |
in |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
547 |
lthy6 |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
548 |
|> snd o Local_Theory.note ((Binding.empty, @{attributes [code]}), [rep_isom_code]) |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
549 |
|> Lifting_Setup.lifting_forget pointer |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
550 |
|> pair (selss, diss, rep_isom_code) |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
551 |
end |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
552 |
and constr qty (quot_thm, (lthy0, rel_eq_onps)) = |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
553 |
let |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
554 |
val quot_thm = Lifting_Term.force_qty_type lthy0 qty quot_thm |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
555 |
val (rty, qty) = quot_thm_rty_qty quot_thm |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
556 |
val rty_name = Tname rty; |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
557 |
val pred_data = Transfer.lookup_pred_data lthy0 rty_name |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
558 |
val pred_data = if is_some pred_data then the pred_data |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
559 |
else error ("code_dt: " ^ quote rty_name ^ " is not a datatype.") |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
560 |
val rel_eq_onp = safe_mk_meta_eq (Transfer.rel_eq_onp pred_data); |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
561 |
val rel_eq_onps = insert Thm.eq_thm rel_eq_onp rel_eq_onps |
74545 | 562 |
fun R_conv ctxt = |
563 |
Conv.top_sweep_rewrs_conv @{thms eq_onp_top_eq_eq[symmetric, THEN eq_reflection]} ctxt |
|
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
564 |
then_conv Conv.rewr_conv rel_eq_onp |
74545 | 565 |
val quot_thm = |
566 |
Conv.fconv_rule (HOLogic.Trueprop_conv (Quotient_R_conv (R_conv lthy0))) quot_thm; |
|
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
567 |
in |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
568 |
if is_none (code_dt_of lthy0 (rty, qty)) then |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
569 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
570 |
val non_empty_pred = quot_thm RS @{thm type_definition_Quotient_not_empty} |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
571 |
val pred = quot_thm_rel quot_thm |> dest_comb |> snd; |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
572 |
val (pred, lthy1) = lthy0 |
72450 | 573 |
|> (snd o Local_Theory.begin_nested) |
66017 | 574 |
|> yield_singleton (Variable.import_terms true) pred; |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
575 |
val TFrees = Term.add_tfreesT qty [] |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
576 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
577 |
fun non_empty_typedef_tac non_empty_pred ctxt i = |
61841
4d3527b94f2a
more general types Proof.method / context_tactic;
wenzelm
parents:
61466
diff
changeset
|
578 |
(Method.insert_tac ctxt [non_empty_pred] THEN' |
63170 | 579 |
SELECT_GOAL (Local_Defs.unfold0_tac ctxt [mem_Collect_eq]) THEN' assume_tac ctxt) i |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
580 |
val uTname = unique_Tname (rty, qty) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
581 |
val Tdef_set = HOLogic.mk_Collect ("x", rty, pred $ Free("x", rty)); |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
582 |
val ((_, tcode_dt), lthy2) = lthy1 |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
583 |
|> conceal_naming_result |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
584 |
(typedef (Binding.concealed uTname, TFrees, NoSyn) |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
585 |
Tdef_set NONE (fn lthy => HEADGOAL (non_empty_typedef_tac non_empty_pred lthy))); |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
586 |
val type_definition_thm = tcode_dt |> snd |> #type_definition; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
587 |
val qty_isom = tcode_dt |> fst |> #abs_type; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
588 |
|
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
589 |
val (binding, lthy3) = lthy2 |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
590 |
|> conceal_naming_result |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
591 |
(Lifting_Setup.setup_by_typedef_thm {notes = false} type_definition_thm) |
72450 | 592 |
||> Local_Theory.end_nested |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
593 |
val (wit, wit_thm) = mk_witness quot_thm; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
594 |
val code_dt = mk_code_dt rty qty wit wit_thm NONE; |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
595 |
val lthy4 = lthy3 |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
596 |
|> update_code_dt code_dt |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
597 |
|> mk_rep_isom binding (rty, qty, qty_isom) |> snd |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
598 |
in |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
599 |
(quot_thm, (lthy4, rel_eq_onps)) |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
600 |
end |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
601 |
else |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
602 |
(quot_thm, (lthy0, rel_eq_onps)) |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
603 |
end |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
604 |
and lift_def_code_dt config = gen_lift_def (add_lift_def_code_dt config) |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
605 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
606 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
607 |
(** from parsed parameters to the config record **) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
608 |
|
60239 | 609 |
fun map_config_code_dt f1 f2 ({code_dt = code_dt, lift_config = lift_config}: config_code_dt) = |
610 |
{code_dt = f1 code_dt, lift_config = f2 lift_config} |
|
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
611 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
612 |
fun update_config_code_dt nval = map_config_code_dt (K nval) I |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
613 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
614 |
val config_flags = [("code_dt", update_config_code_dt true)] |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
615 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
616 |
fun evaluate_params params = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
617 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
618 |
fun eval_param param config = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
619 |
case AList.lookup (op =) config_flags param of |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
620 |
SOME update => update config |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
621 |
| NONE => error ("Unknown parameter: " ^ (quote param)) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
622 |
in |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
623 |
fold eval_param params default_config_code_dt |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
624 |
end |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
625 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
626 |
(** |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
627 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
628 |
lift_definition command. It opens a proof of a corresponding respectfulness |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
629 |
theorem in a user-friendly, readable form. Then add_lift_def_code_dt is called internally. |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
630 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
631 |
**) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
632 |
|
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
633 |
local |
69593 | 634 |
val eq_onp_assms_tac_fixed_rules = map (Transfer.prep_transfer_domain_thm \<^context>) |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
635 |
[@{thm pcr_Domainp_total}, @{thm pcr_Domainp_par_left_total}, @{thm pcr_Domainp_par}, |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
636 |
@{thm pcr_Domainp}] |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
637 |
in |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
638 |
fun mk_readable_rsp_thm_eq tm ctxt = |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
639 |
let |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
640 |
val ctm = Thm.cterm_of ctxt tm |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
641 |
|
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
642 |
fun assms_rewr_conv tactic rule ct = |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
643 |
let |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
644 |
fun prove_extra_assms thm = |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
645 |
let |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
646 |
val assms = cprems_of thm |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
647 |
fun finish thm = if Thm.no_prems thm then SOME (Goal.conclude thm) else NONE |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
648 |
fun prove ctm = Option.mapPartial finish (SINGLE tactic (Goal.init ctm)) |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
649 |
in |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
650 |
map_interrupt prove assms |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
651 |
end |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
652 |
|
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
653 |
fun cconl_of thm = Drule.strip_imp_concl (Thm.cprop_of thm) |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
654 |
fun lhs_of thm = fst (Thm.dest_equals (cconl_of thm)) |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
655 |
fun rhs_of thm = snd (Thm.dest_equals (cconl_of thm)) |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
656 |
val rule1 = Thm.incr_indexes (Thm.maxidx_of_cterm ct + 1) rule; |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
657 |
val lhs = lhs_of rule1; |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
658 |
val rule2 = Thm.rename_boundvars (Thm.term_of lhs) (Thm.term_of ct) rule1; |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
659 |
val rule3 = |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
660 |
Thm.instantiate (Thm.match (lhs, ct)) rule2 |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
661 |
handle Pattern.MATCH => raise CTERM ("assms_rewr_conv", [lhs, ct]); |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
662 |
val proved_assms = prove_extra_assms rule3 |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
663 |
in |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
664 |
case proved_assms of |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
665 |
SOME proved_assms => |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
666 |
let |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
667 |
val rule3 = proved_assms MRSL rule3 |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
668 |
val rule4 = |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
669 |
if lhs_of rule3 aconvc ct then rule3 |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
670 |
else |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
671 |
let val ceq = Thm.dest_fun2 (Thm.cprop_of rule3) |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
672 |
in rule3 COMP Thm.trivial (Thm.mk_binop ceq ct (rhs_of rule3)) end |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
673 |
in Thm.transitive rule4 (Thm.beta_conversion true (rhs_of rule4)) end |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
674 |
| NONE => Conv.no_conv ct |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
675 |
end |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
676 |
|
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
677 |
fun assms_rewrs_conv tactic rules = Conv.first_conv (map (assms_rewr_conv tactic) rules) |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
678 |
|
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
679 |
fun simp_arrows_conv ctm = |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
680 |
let |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
681 |
val unfold_conv = Conv.rewrs_conv |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
682 |
[@{thm rel_fun_eq_eq_onp[THEN eq_reflection]}, |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
683 |
@{thm rel_fun_eq_onp_rel[THEN eq_reflection]}, |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
684 |
@{thm rel_fun_eq[THEN eq_reflection]}, |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
685 |
@{thm rel_fun_eq_rel[THEN eq_reflection]}, |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
686 |
@{thm rel_fun_def[THEN eq_reflection]}] |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
687 |
fun binop_conv2 cv1 cv2 = Conv.combination_conv (Conv.arg_conv cv1) cv2 |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
688 |
val eq_onp_assms_tac_rules = @{thm left_unique_OO} :: |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
689 |
eq_onp_assms_tac_fixed_rules @ (Transfer.get_transfer_raw ctxt) |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
690 |
val intro_top_rule = @{thm eq_onp_top_eq_eq[symmetric, THEN eq_reflection]} |
74545 | 691 |
val kill_tops = Conv.top_sweep_rewrs_conv @{thms eq_onp_top_eq_eq[THEN eq_reflection]} ctxt |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
692 |
val eq_onp_assms_tac = (CONVERSION kill_tops THEN' |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
693 |
TRY o REPEAT_ALL_NEW (resolve_tac ctxt eq_onp_assms_tac_rules) |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
694 |
THEN_ALL_NEW (DETERM o Transfer.eq_tac ctxt)) 1 |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
695 |
val relator_eq_onp_conv = Conv.bottom_conv |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
696 |
(K (Conv.try_conv (assms_rewrs_conv eq_onp_assms_tac |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
697 |
(intro_top_rule :: Lifting_Info.get_relator_eq_onp_rules ctxt)))) ctxt |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
698 |
then_conv kill_tops |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
699 |
val relator_eq_conv = Conv.bottom_conv |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
700 |
(K (Conv.try_conv (Conv.rewrs_conv (Transfer.get_relator_eq ctxt)))) ctxt |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
701 |
in |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
702 |
case (Thm.term_of ctm) of |
69593 | 703 |
Const (\<^const_name>\<open>rel_fun\<close>, _) $ _ $ _ => |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
704 |
(binop_conv2 simp_arrows_conv simp_arrows_conv then_conv unfold_conv) ctm |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
705 |
| _ => (relator_eq_onp_conv then_conv relator_eq_conv) ctm |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
706 |
end |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
707 |
|
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
708 |
val unfold_ret_val_invs = Conv.bottom_conv |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
709 |
(K (Conv.try_conv (Conv.rewr_conv @{thm eq_onp_same_args[THEN eq_reflection]}))) ctxt |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
710 |
val unfold_inv_conv = |
74545 | 711 |
Conv.top_sweep_rewrs_conv @{thms eq_onp_def[THEN eq_reflection]} ctxt |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
712 |
val simp_conv = HOLogic.Trueprop_conv (Conv.fun2_conv simp_arrows_conv) |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
713 |
val univq_conv = Conv.rewr_conv @{thm HOL.all_simps(6)[symmetric, THEN eq_reflection]} |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
714 |
val univq_prenex_conv = Conv.top_conv (K (Conv.try_conv univq_conv)) ctxt |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
715 |
val beta_conv = Thm.beta_conversion true |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
716 |
val eq_thm = |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
717 |
(simp_conv then_conv univq_prenex_conv then_conv beta_conv then_conv unfold_ret_val_invs |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
718 |
then_conv unfold_inv_conv) ctm |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
719 |
in |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
720 |
Object_Logic.rulify ctxt (eq_thm RS Drule.equal_elim_rule2) |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
721 |
end |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
722 |
end |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
723 |
|
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
724 |
fun rename_to_tnames ctxt term = |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
725 |
let |
69593 | 726 |
fun all_typs (Const (\<^const_name>\<open>Pure.all\<close>, _) $ Abs (_, T, t)) = T :: all_typs t |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
727 |
| all_typs _ = [] |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
728 |
|
69593 | 729 |
fun rename (Const (\<^const_name>\<open>Pure.all\<close>, T1) $ Abs (_, T2, t)) (new_name :: names) = |
730 |
(Const (\<^const_name>\<open>Pure.all\<close>, T1) $ Abs (new_name, T2, rename t names)) |
|
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
731 |
| rename t _ = t |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
732 |
|
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
733 |
val (fixed_def_t, _) = yield_singleton (Variable.importT_terms) term ctxt |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
734 |
val new_names = Old_Datatype_Prop.make_tnames (all_typs fixed_def_t) |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
735 |
in |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
736 |
rename term new_names |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
737 |
end |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
738 |
|
60235
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
739 |
fun quot_thm_err ctxt (rty, qty) pretty_msg = |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
740 |
let |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
741 |
val error_msg = cat_lines |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
742 |
["Lifting failed for the following types:", |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
743 |
Pretty.string_of (Pretty.block |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
744 |
[Pretty.str "Raw type:", Pretty.brk 2, Syntax.pretty_typ ctxt rty]), |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
745 |
Pretty.string_of (Pretty.block |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
746 |
[Pretty.str "Abstract type:", Pretty.brk 2, Syntax.pretty_typ ctxt qty]), |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
747 |
"", |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
748 |
(Pretty.string_of (Pretty.block |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
749 |
[Pretty.str "Reason:", Pretty.brk 2, pretty_msg]))] |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
750 |
in |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
751 |
error error_msg |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
752 |
end |
3cab6f891c2f
reorder some steps in the construction to support mutual datatypes
kuncar
parents:
60234
diff
changeset
|
753 |
|
60236 | 754 |
fun check_rty_err ctxt (rty_schematic, rty_forced) (raw_var, rhs_raw) = |
755 |
let |
|
60379 | 756 |
val (_, ctxt') = Proof_Context.read_var raw_var ctxt |
60485 | 757 |
val rhs = Syntax.read_term ctxt' rhs_raw |
60236 | 758 |
val error_msg = cat_lines |
759 |
["Lifting failed for the following term:", |
|
760 |
Pretty.string_of (Pretty.block |
|
761 |
[Pretty.str "Term:", Pretty.brk 2, Syntax.pretty_term ctxt rhs]), |
|
762 |
Pretty.string_of (Pretty.block |
|
763 |
[Pretty.str "Type:", Pretty.brk 2, Syntax.pretty_typ ctxt rty_schematic]), |
|
764 |
"", |
|
765 |
(Pretty.string_of (Pretty.block |
|
766 |
[Pretty.str "Reason:", |
|
767 |
Pretty.brk 2, |
|
768 |
Pretty.str "The type of the term cannot be instantiated to", |
|
769 |
Pretty.brk 1, |
|
770 |
Pretty.quote (Syntax.pretty_typ ctxt rty_forced), |
|
771 |
Pretty.str "."]))] |
|
772 |
in |
|
773 |
error error_msg |
|
774 |
end |
|
775 |
||
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
776 |
fun lift_def_cmd (params, raw_var, rhs_raw, par_xthms) lthy0 = |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
777 |
let |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
778 |
val config = evaluate_params params |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
779 |
val ((binding, SOME qty, mx), lthy1) = Proof_Context.read_var raw_var lthy0 |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
780 |
val var = (binding, mx) |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
781 |
val rhs = Syntax.read_term lthy1 rhs_raw |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
782 |
val par_thms = Attrib.eval_thms lthy1 par_xthms |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
783 |
val (goal, after_qed) = lthy1 |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
784 |
|> prepare_lift_def (add_lift_def_code_dt config) var qty rhs par_thms |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
785 |
val (goal, after_qed) = |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
786 |
case goal of |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
787 |
NONE => (goal, K (after_qed Drule.dummy_thm)) |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
788 |
| SOME prsp_tm => |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
789 |
let |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
790 |
val readable_rsp_thm_eq = mk_readable_rsp_thm_eq prsp_tm lthy1 |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
791 |
val (readable_rsp_tm, _) = Logic.dest_implies (Thm.prop_of readable_rsp_thm_eq) |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
792 |
val readable_rsp_tm_tnames = rename_to_tnames lthy1 readable_rsp_tm |
60231
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
793 |
|
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
794 |
fun after_qed' [[thm]] lthy = |
0daab758e087
don't use the human-readable version of the rsp thm as a goal in the ML interface (there is no formal definition of its statement); make tactics more robust wrt. predicates in predicators; tuned
kuncar
parents:
60230
diff
changeset
|
795 |
let |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
796 |
val internal_rsp_thm = |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
797 |
Goal.prove lthy [] [] prsp_tm (fn {context = goal_ctxt, ...} => |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
798 |
rtac goal_ctxt readable_rsp_thm_eq 1 THEN |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
799 |
Proof_Context.fact_tac goal_ctxt [thm] 1) |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
800 |
in after_qed internal_rsp_thm lthy end |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
801 |
in (SOME readable_rsp_tm_tnames, after_qed') end |
60236 | 802 |
fun after_qed_with_err_handling thmss ctxt = (after_qed thmss ctxt |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
803 |
handle Lifting_Term.QUOT_THM (rty, qty, msg) => quot_thm_err lthy1 (rty, qty) msg) |
60236 | 804 |
handle Lifting_Term.CHECK_RTY (rty_schematic, rty_forced) => |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
805 |
check_rty_err lthy1 (rty_schematic, rty_forced) (raw_var, rhs_raw); |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
806 |
in |
70320
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
807 |
lthy1 |
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
wenzelm
parents:
69597
diff
changeset
|
808 |
|> Proof.theorem NONE (snd oo after_qed_with_err_handling) [map (rpair []) (the_list goal)] |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
809 |
end |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
810 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
811 |
fun lift_def_cmd_with_err_handling (params, (raw_var, rhs_raw, par_xthms)) lthy = |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
812 |
(lift_def_cmd (params, raw_var, rhs_raw, par_xthms) lthy |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
813 |
handle Lifting_Term.QUOT_THM (rty, qty, msg) => quot_thm_err lthy (rty, qty) msg) |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
814 |
handle Lifting_Term.CHECK_RTY (rty_schematic, rty_forced) => |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
815 |
check_rty_err lthy (rty_schematic, rty_forced) (raw_var, rhs_raw); |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
816 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
817 |
val parse_param = Parse.name |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
818 |
val parse_params = Scan.optional (Args.parens (Parse.list parse_param)) []; |
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
819 |
|
60669 | 820 |
|
821 |
(* command syntax *) |
|
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
822 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
823 |
val _ = |
69593 | 824 |
Outer_Syntax.local_theory_to_proof \<^command_keyword>\<open>lift_definition\<close> |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
825 |
"definition for constants over the quotient type" |
60669 | 826 |
(parse_params -- |
69593 | 827 |
(((Parse.binding -- (\<^keyword>\<open>::\<close> |-- (Parse.typ >> SOME) -- Parse.opt_mixfix') |
61466 | 828 |
>> Scan.triple2) -- |
69593 | 829 |
(\<^keyword>\<open>is\<close> |-- Parse.term) -- |
830 |
Scan.optional (\<^keyword>\<open>parametric\<close> |-- Parse.!!! Parse.thms1) []) >> Scan.triple1) |
|
60669 | 831 |
>> lift_def_cmd_with_err_handling); |
60229
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
832 |
|
4cd6462c1fda
Workaround that allows us to execute lifted constants that have as a return type a datatype containing a subtype
kuncar
parents:
diff
changeset
|
833 |
end |