author | Cezary Kaliszyk <kaliszyk@in.tum.de> |
Mon, 22 Nov 2010 16:14:47 +0900 | |
changeset 2574 | 50da1be9a7e5 |
parent 2476 | 8f8652a8107f |
child 2595 | 07f775729e90 |
permissions | -rw-r--r-- |
2337
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
1 |
(* Title: nominal_dt_alpha.ML |
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
2 |
Author: Christian Urban |
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
3 |
Author: Cezary Kaliszyk |
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
4 |
|
2426
deb5be0115a7
moved lifting code from Lift.thy to nominal_dt_quot.ML
Christian Urban <urbanc@in.tum.de>
parents:
2401
diff
changeset
|
5 |
Performing quotient constructions and lifting theorems |
2337
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
6 |
*) |
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
7 |
|
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
8 |
signature NOMINAL_DT_QUOT = |
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
9 |
sig |
2400
c6d30d5f5ba1
defined qperms and qsizes
Christian Urban <urbanc@in.tum.de>
parents:
2398
diff
changeset
|
10 |
val define_qtypes: (string list * binding * mixfix) list -> typ list -> term list -> |
2337
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
11 |
thm list -> local_theory -> Quotient_Info.quotdata_info list * local_theory |
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
12 |
|
2400
c6d30d5f5ba1
defined qperms and qsizes
Christian Urban <urbanc@in.tum.de>
parents:
2398
diff
changeset
|
13 |
val define_qconsts: typ list -> (string * term * mixfix) list -> local_theory -> |
2337
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
14 |
Quotient_Info.qconsts_info list * local_theory |
2346 | 15 |
|
2431
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
16 |
val define_qperms: typ list -> string list -> (string * sort) list -> |
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
17 |
(string * term * mixfix) list -> thm list -> local_theory -> local_theory |
2400
c6d30d5f5ba1
defined qperms and qsizes
Christian Urban <urbanc@in.tum.de>
parents:
2398
diff
changeset
|
18 |
|
2431
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
19 |
val define_qsizes: typ list -> string list -> (string * sort) list -> |
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
20 |
(string * term * mixfix) list -> local_theory -> local_theory |
2426
deb5be0115a7
moved lifting code from Lift.thy to nominal_dt_quot.ML
Christian Urban <urbanc@in.tum.de>
parents:
2401
diff
changeset
|
21 |
|
2434 | 22 |
val lift_thms: typ list -> thm list -> thm list -> Proof.context -> thm list * Proof.context |
2475
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
Christian Urban <urbanc@in.tum.de>
parents:
2434
diff
changeset
|
23 |
|
2337
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
24 |
end |
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
25 |
|
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
26 |
structure Nominal_Dt_Quot: NOMINAL_DT_QUOT = |
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
27 |
struct |
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
28 |
|
2475
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
Christian Urban <urbanc@in.tum.de>
parents:
2434
diff
changeset
|
29 |
|
2337
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
30 |
(* defines the quotient types *) |
2400
c6d30d5f5ba1
defined qperms and qsizes
Christian Urban <urbanc@in.tum.de>
parents:
2398
diff
changeset
|
31 |
fun define_qtypes qtys_descr alpha_tys alpha_trms alpha_equivp_thms lthy = |
2476
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
32 |
let |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
33 |
val qty_args1 = map2 (fn ty => fn trm => (ty, trm, false)) alpha_tys alpha_trms |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
34 |
val qty_args2 = (qtys_descr ~~ qty_args1) ~~ alpha_equivp_thms |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
35 |
in |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
36 |
fold_map Quotient_Type.add_quotient_type qty_args2 lthy |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
37 |
end |
2337
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
38 |
|
2338 | 39 |
|
2337
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
40 |
(* defines quotient constants *) |
2400
c6d30d5f5ba1
defined qperms and qsizes
Christian Urban <urbanc@in.tum.de>
parents:
2398
diff
changeset
|
41 |
fun define_qconsts qtys consts_specs lthy = |
2476
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
42 |
let |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
43 |
val (qconst_infos, lthy') = |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
44 |
fold_map (Quotient_Def.lift_raw_const qtys) consts_specs lthy |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
45 |
val phi = ProofContext.export_morphism lthy' lthy |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
46 |
in |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
47 |
(map (Quotient_Info.transform_qconsts phi) qconst_infos, lthy') |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
48 |
end |
2337
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
49 |
|
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
50 |
|
2400
c6d30d5f5ba1
defined qperms and qsizes
Christian Urban <urbanc@in.tum.de>
parents:
2398
diff
changeset
|
51 |
(* defines the quotient permutations and proves pt-class *) |
2431
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
52 |
fun define_qperms qtys qfull_ty_names tvs perm_specs raw_perm_laws lthy = |
2476
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
53 |
let |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
54 |
val lthy1 = |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
55 |
lthy |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
56 |
|> Local_Theory.exit_global |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
57 |
|> Class.instantiation (qfull_ty_names, tvs, @{sort pt}) |
2398 | 58 |
|
2476
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
59 |
val (qs, lthy2) = define_qconsts qtys perm_specs lthy1 |
2431
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
60 |
|
2476
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
61 |
val ((_, raw_perm_laws'), lthy3) = Variable.importT raw_perm_laws lthy2 |
2398 | 62 |
|
2476
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
63 |
val lifted_perm_laws = |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
64 |
map (Quotient_Tacs.lifted lthy3 qtys []) raw_perm_laws' |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
65 |
|> Variable.exportT lthy3 lthy2 |
2398 | 66 |
|
2476
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
67 |
fun tac _ = |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
68 |
Class.intro_classes_tac [] THEN |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
69 |
(ALLGOALS (resolve_tac lifted_perm_laws)) |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
70 |
in |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
71 |
lthy2 |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
72 |
|> Class.prove_instantiation_exit tac |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
73 |
|> Named_Target.theory_init |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
74 |
end |
2346 | 75 |
|
2337
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
76 |
|
2400
c6d30d5f5ba1
defined qperms and qsizes
Christian Urban <urbanc@in.tum.de>
parents:
2398
diff
changeset
|
77 |
(* defines the size functions and proves size-class *) |
2431
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
78 |
fun define_qsizes qtys qfull_ty_names tvs size_specs lthy = |
2476
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
79 |
let |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
80 |
val tac = K (Class.intro_classes_tac []) |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
81 |
in |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
82 |
lthy |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
83 |
|> Local_Theory.exit_global |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
84 |
|> Class.instantiation (qfull_ty_names, tvs, @{sort size}) |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
85 |
|> snd o (define_qconsts qtys size_specs) |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
86 |
|> Class.prove_instantiation_exit tac |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
87 |
|> Named_Target.theory_init |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
88 |
end |
2400
c6d30d5f5ba1
defined qperms and qsizes
Christian Urban <urbanc@in.tum.de>
parents:
2398
diff
changeset
|
89 |
|
2426
deb5be0115a7
moved lifting code from Lift.thy to nominal_dt_quot.ML
Christian Urban <urbanc@in.tum.de>
parents:
2401
diff
changeset
|
90 |
|
2475
486d4647bb37
supp-proofs work except for CoreHaskell and Modules (induct is probably not finding the correct instance)
Christian Urban <urbanc@in.tum.de>
parents:
2434
diff
changeset
|
91 |
(* lifts a theorem and cleans all "_raw" parts |
2431
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
92 |
from variable names *) |
2426
deb5be0115a7
moved lifting code from Lift.thy to nominal_dt_quot.ML
Christian Urban <urbanc@in.tum.de>
parents:
2401
diff
changeset
|
93 |
|
2431
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
94 |
local |
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
95 |
val any = Scan.one (Symbol.not_eof) |
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
96 |
val raw = Scan.this_string "_raw" |
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
97 |
val exclude = |
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
98 |
Scan.repeat (Scan.unless raw any) --| raw >> implode |
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
99 |
val parser = Scan.repeat (exclude || any) |
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
100 |
in |
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
101 |
fun unraw_str s = |
2574 | 102 |
s |> raw_explode |
2476
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
103 |
|> Scan.finite Symbol.stopper parser >> implode |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
104 |
|> fst |
2431
331873ebc5cd
can now deal with type variables in nominal datatype definitions
Christian Urban <urbanc@in.tum.de>
parents:
2430
diff
changeset
|
105 |
end |
2426
deb5be0115a7
moved lifting code from Lift.thy to nominal_dt_quot.ML
Christian Urban <urbanc@in.tum.de>
parents:
2401
diff
changeset
|
106 |
|
deb5be0115a7
moved lifting code from Lift.thy to nominal_dt_quot.ML
Christian Urban <urbanc@in.tum.de>
parents:
2401
diff
changeset
|
107 |
fun unraw_vars_thm thm = |
2476
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
108 |
let |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
109 |
fun unraw_var_str ((s, i), T) = ((unraw_str s, i), T) |
2426
deb5be0115a7
moved lifting code from Lift.thy to nominal_dt_quot.ML
Christian Urban <urbanc@in.tum.de>
parents:
2401
diff
changeset
|
110 |
|
2476
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
111 |
val vars = Term.add_vars (prop_of thm) [] |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
112 |
val vars' = map (Var o unraw_var_str) vars |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
113 |
in |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
114 |
Thm.certify_instantiate ([], (vars ~~ vars')) thm |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
115 |
end |
2426
deb5be0115a7
moved lifting code from Lift.thy to nominal_dt_quot.ML
Christian Urban <urbanc@in.tum.de>
parents:
2401
diff
changeset
|
116 |
|
deb5be0115a7
moved lifting code from Lift.thy to nominal_dt_quot.ML
Christian Urban <urbanc@in.tum.de>
parents:
2401
diff
changeset
|
117 |
fun unraw_bounds_thm th = |
2476
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
118 |
let |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
119 |
val trm = Thm.prop_of th |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
120 |
val trm' = Term.map_abs_vars unraw_str trm |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
121 |
in |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
122 |
Thm.rename_boundvars trm trm' th |
8f8652a8107f
tuned (to conform with indentation policy of Markus)
Christian Urban <urbanc@in.tum.de>
parents:
2475
diff
changeset
|
123 |
end |
2426
deb5be0115a7
moved lifting code from Lift.thy to nominal_dt_quot.ML
Christian Urban <urbanc@in.tum.de>
parents:
2401
diff
changeset
|
124 |
|
2434 | 125 |
fun lift_thms qtys simps thms ctxt = |
126 |
(map (Quotient_Tacs.lifted ctxt qtys simps |
|
127 |
#> unraw_bounds_thm |
|
128 |
#> unraw_vars_thm |
|
129 |
#> Drule.zero_var_indexes) thms, ctxt) |
|
130 |
||
2337
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
131 |
end (* structure *) |
b151399bd2c3
fixed according to changes in quotient
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
132 |