0
+ − 1
theory QuotMain
6
+ − 2
imports QuotScript QuotList Prove
71
+ − 3
uses ("quotient.ML")
0
+ − 4
begin
+ − 5
+ − 6
locale QUOT_TYPE =
+ − 7
fixes R :: "'a \<Rightarrow> 'a \<Rightarrow> bool"
+ − 8
and Abs :: "('a \<Rightarrow> bool) \<Rightarrow> 'b"
+ − 9
and Rep :: "'b \<Rightarrow> ('a \<Rightarrow> bool)"
+ − 10
assumes equiv: "EQUIV R"
+ − 11
and rep_prop: "\<And>y. \<exists>x. Rep y = R x"
+ − 12
and rep_inverse: "\<And>x. Abs (Rep x) = x"
+ − 13
and abs_inverse: "\<And>x. (Rep (Abs (R x))) = (R x)"
+ − 14
and rep_inject: "\<And>x y. (Rep x = Rep y) = (x = y)"
15
+ − 15
begin
0
+ − 16
+ − 17
definition
+ − 18
"ABS x \<equiv> Abs (R x)"
+ − 19
+ − 20
definition
+ − 21
"REP a = Eps (Rep a)"
+ − 22
15
+ − 23
lemma lem9:
0
+ − 24
shows "R (Eps (R x)) = R x"
+ − 25
proof -
+ − 26
have a: "R x x" using equiv by (simp add: EQUIV_REFL_SYM_TRANS REFL_def)
+ − 27
then have "R x (Eps (R x))" by (rule someI)
15
+ − 28
then show "R (Eps (R x)) = R x"
0
+ − 29
using equiv unfolding EQUIV_def by simp
+ − 30
qed
+ − 31
+ − 32
theorem thm10:
24
+ − 33
shows "ABS (REP a) \<equiv> a"
+ − 34
apply (rule eq_reflection)
+ − 35
unfolding ABS_def REP_def
0
+ − 36
proof -
15
+ − 37
from rep_prop
0
+ − 38
obtain x where eq: "Rep a = R x" by auto
+ − 39
have "Abs (R (Eps (Rep a))) = Abs (R (Eps (R x)))" using eq by simp
+ − 40
also have "\<dots> = Abs (R x)" using lem9 by simp
+ − 41
also have "\<dots> = Abs (Rep a)" using eq by simp
+ − 42
also have "\<dots> = a" using rep_inverse by simp
+ − 43
finally
+ − 44
show "Abs (R (Eps (Rep a))) = a" by simp
+ − 45
qed
+ − 46
15
+ − 47
lemma REP_refl:
0
+ − 48
shows "R (REP a) (REP a)"
+ − 49
unfolding REP_def
+ − 50
by (simp add: equiv[simplified EQUIV_def])
+ − 51
+ − 52
lemma lem7:
22
+ − 53
shows "(R x = R y) = (Abs (R x) = Abs (R y))"
0
+ − 54
apply(rule iffI)
+ − 55
apply(simp)
+ − 56
apply(drule rep_inject[THEN iffD2])
+ − 57
apply(simp add: abs_inverse)
+ − 58
done
15
+ − 59
0
+ − 60
theorem thm11:
+ − 61
shows "R r r' = (ABS r = ABS r')"
+ − 62
unfolding ABS_def
+ − 63
by (simp only: equiv[simplified EQUIV_def] lem7)
+ − 64
4
+ − 65
2
+ − 66
lemma REP_ABS_rsp:
4
+ − 67
shows "R f (REP (ABS g)) = R f g"
+ − 68
and "R (REP (ABS g)) f = R g f"
23
+ − 69
by (simp_all add: thm10 thm11)
4
+ − 70
0
+ − 71
lemma QUOTIENT:
+ − 72
"QUOTIENT R ABS REP"
+ − 73
apply(unfold QUOTIENT_def)
+ − 74
apply(simp add: thm10)
+ − 75
apply(simp add: REP_refl)
+ − 76
apply(subst thm11[symmetric])
+ − 77
apply(simp add: equiv[simplified EQUIV_def])
+ − 78
done
+ − 79
21
+ − 80
lemma R_trans:
49
+ − 81
assumes ab: "R a b"
+ − 82
and bc: "R b c"
22
+ − 83
shows "R a c"
21
+ − 84
proof -
+ − 85
have tr: "TRANS R" using equiv EQUIV_REFL_SYM_TRANS[of R] by simp
+ − 86
moreover have ab: "R a b" by fact
+ − 87
moreover have bc: "R b c" by fact
22
+ − 88
ultimately show "R a c" unfolding TRANS_def by blast
21
+ − 89
qed
+ − 90
+ − 91
lemma R_sym:
49
+ − 92
assumes ab: "R a b"
22
+ − 93
shows "R b a"
21
+ − 94
proof -
+ − 95
have re: "SYM R" using equiv EQUIV_REFL_SYM_TRANS[of R] by simp
22
+ − 96
then show "R b a" using ab unfolding SYM_def by blast
21
+ − 97
qed
+ − 98
49
+ − 99
lemma R_trans2:
+ − 100
assumes ac: "R a c"
22
+ − 101
and bd: "R b d"
21
+ − 102
shows "R a b = R c d"
+ − 103
proof
23
+ − 104
assume "R a b"
21
+ − 105
then have "R b a" using R_sym by blast
+ − 106
then have "R b c" using ac R_trans by blast
+ − 107
then have "R c b" using R_sym by blast
+ − 108
then show "R c d" using bd R_trans by blast
+ − 109
next
23
+ − 110
assume "R c d"
21
+ − 111
then have "R a d" using ac R_trans by blast
+ − 112
then have "R d a" using R_sym by blast
+ − 113
then have "R b a" using bd R_trans by blast
+ − 114
then show "R a b" using R_sym by blast
+ − 115
qed
+ − 116
+ − 117
lemma REPS_same:
25
+ − 118
shows "R (REP a) (REP b) \<equiv> (a = b)"
38
+ − 119
proof -
+ − 120
have "R (REP a) (REP b) = (a = b)"
+ − 121
proof
+ − 122
assume as: "R (REP a) (REP b)"
+ − 123
from rep_prop
+ − 124
obtain x y
+ − 125
where eqs: "Rep a = R x" "Rep b = R y" by blast
+ − 126
from eqs have "R (Eps (R x)) (Eps (R y))" using as unfolding REP_def by simp
+ − 127
then have "R x (Eps (R y))" using lem9 by simp
+ − 128
then have "R (Eps (R y)) x" using R_sym by blast
+ − 129
then have "R y x" using lem9 by simp
+ − 130
then have "R x y" using R_sym by blast
+ − 131
then have "ABS x = ABS y" using thm11 by simp
+ − 132
then have "Abs (Rep a) = Abs (Rep b)" using eqs unfolding ABS_def by simp
+ − 133
then show "a = b" using rep_inverse by simp
+ − 134
next
+ − 135
assume ab: "a = b"
+ − 136
have "REFL R" using equiv EQUIV_REFL_SYM_TRANS[of R] by simp
+ − 137
then show "R (REP a) (REP b)" unfolding REFL_def using ab by auto
+ − 138
qed
+ − 139
then show "R (REP a) (REP b) \<equiv> (a = b)" by simp
21
+ − 140
qed
+ − 141
0
+ − 142
end
+ − 143
+ − 144
section {* type definition for the quotient type *}
+ − 145
71
+ − 146
use "quotient.ML"
0
+ − 147
79
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 148
term EQUIV
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 149
14
+ − 150
ML {*
+ − 151
val no_vars = Thm.rule_attribute (fn context => fn th =>
+ − 152
let
+ − 153
val ctxt = Variable.set_body false (Context.proof_of context);
+ − 154
val ((_, [th']), _) = Variable.import true [th] ctxt;
+ − 155
in th' end);
+ − 156
*}
+ − 157
0
+ − 158
section {* various tests for quotient types*}
+ − 159
datatype trm =
15
+ − 160
var "nat"
0
+ − 161
| app "trm" "trm"
+ − 162
| lam "nat" "trm"
13
+ − 163
49
+ − 164
axiomatization
+ − 165
RR :: "trm \<Rightarrow> trm \<Rightarrow> bool"
26
+ − 166
where
14
+ − 167
r_eq: "EQUIV RR"
0
+ − 168
81
+ − 169
quotient qtrm = trm / "RR"
79
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 170
apply(rule r_eq)
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 171
done
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 172
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 173
typ qtrm
0
+ − 174
term Rep_qtrm
2
+ − 175
term REP_qtrm
0
+ − 176
term Abs_qtrm
+ − 177
term ABS_qtrm
+ − 178
thm QUOT_TYPE_qtrm
+ − 179
thm QUOTIENT_qtrm
79
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 180
thm REP_qtrm_def
2
+ − 181
16
+ − 182
(* Test interpretation *)
+ − 183
thm QUOT_TYPE_I_qtrm.thm11
26
+ − 184
thm QUOT_TYPE.thm11
16
+ − 185
21
+ − 186
print_theorems
+ − 187
0
+ − 188
thm Rep_qtrm
+ − 189
+ − 190
text {* another test *}
+ − 191
datatype 'a trm' =
15
+ − 192
var' "'a"
0
+ − 193
| app' "'a trm'" "'a trm'"
+ − 194
| lam' "'a" "'a trm'"
15
+ − 195
0
+ − 196
consts R' :: "'a trm' \<Rightarrow> 'a trm' \<Rightarrow> bool"
+ − 197
axioms r_eq': "EQUIV R'"
+ − 198
81
+ − 199
quotient qtrm' = "'a trm'" / "R'"
79
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 200
apply(rule r_eq')
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 201
done
0
+ − 202
14
+ − 203
print_theorems
+ − 204
0
+ − 205
term ABS_qtrm'
+ − 206
term REP_qtrm'
+ − 207
thm QUOT_TYPE_qtrm'
+ − 208
thm QUOTIENT_qtrm'
+ − 209
thm Rep_qtrm'
+ − 210
14
+ − 211
0
+ − 212
text {* a test with lists of terms *}
+ − 213
datatype t =
+ − 214
vr "string"
+ − 215
| ap "t list"
+ − 216
| lm "string" "t"
+ − 217
+ − 218
consts Rt :: "t \<Rightarrow> t \<Rightarrow> bool"
+ − 219
axioms t_eq: "EQUIV Rt"
+ − 220
81
+ − 221
quotient qt = "t" / "Rt"
79
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 222
by (rule t_eq)
0
+ − 223
+ − 224
section {* lifting of constants *}
+ − 225
+ − 226
text {* information about map-functions for type-constructor *}
+ − 227
ML {*
75
+ − 228
type typ_info = {mapfun: string, relfun: string}
0
+ − 229
+ − 230
local
59
1a92820a5b85
simplified the storage of the map-functions by using TheoryDataFun
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 231
structure Data = TheoryDataFun
0
+ − 232
(type T = typ_info Symtab.table
+ − 233
val empty = Symtab.empty
59
1a92820a5b85
simplified the storage of the map-functions by using TheoryDataFun
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 234
val copy = I
0
+ − 235
val extend = I
+ − 236
fun merge _ = Symtab.merge (K true))
+ − 237
in
46
+ − 238
val lookup = Symtab.lookup o Data.get
+ − 239
fun update k v = Data.map (Symtab.update (k, v))
0
+ − 240
end
+ − 241
*}
+ − 242
+ − 243
(* mapfuns for some standard types *)
+ − 244
setup {*
93
+ − 245
update @{type_name "list"} {mapfun = @{const_name "map"}, relfun = @{const_name "LIST_REL"}} #>
+ − 246
update @{type_name "*"} {mapfun = @{const_name "prod_fun"}, relfun = @{const_name "prod_rel"}} #>
75
+ − 247
update @{type_name "fun"} {mapfun = @{const_name "fun_map"}, relfun = @{const_name "FUN_REL"}}
0
+ − 248
*}
+ − 249
109
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 250
59
1a92820a5b85
simplified the storage of the map-functions by using TheoryDataFun
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 251
ML {* lookup @{theory} @{type_name list} *}
0
+ − 252
110
+ − 253
term fun_map
+ − 254
0
+ − 255
ML {*
46
+ − 256
datatype flag = absF | repF
0
+ − 257
109
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 258
fun negF absF = repF
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 259
| negF repF = absF
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 260
46
+ − 261
fun get_fun flag rty qty lthy ty =
0
+ − 262
let
+ − 263
val qty_name = Long_Name.base_name (fst (dest_Type qty))
15
+ − 264
0
+ − 265
fun get_fun_aux s fs_tys =
+ − 266
let
+ − 267
val (fs, tys) = split_list fs_tys
15
+ − 268
val (otys, ntys) = split_list tys
0
+ − 269
val oty = Type (s, otys)
+ − 270
val nty = Type (s, ntys)
+ − 271
val ftys = map (op -->) tys
+ − 272
in
59
1a92820a5b85
simplified the storage of the map-functions by using TheoryDataFun
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 273
(case (lookup (ProofContext.theory_of lthy) s) of
110
+ − 274
SOME info => (list_comb (Const (#mapfun info, ftys ---> (oty --> nty)), fs), (oty, nty))
+ − 275
| NONE => raise ERROR ("no map association for type " ^ s))
+ − 276
end
+ − 277
+ − 278
fun get_fun_fun s fs_tys =
+ − 279
let
+ − 280
val (fs, tys) = split_list fs_tys
+ − 281
val ([oty1, oty2], [nty1, nty2]) = split_list tys
111
+ − 282
val oty = Type (s, [nty1, oty2])
110
+ − 283
val nty = Type (s, [oty1, nty2])
111
+ − 284
val _ = tracing (Syntax.string_of_typ @{context} oty)
110
+ − 285
val ftys = map (op -->) tys
+ − 286
in
+ − 287
(case (lookup (ProofContext.theory_of lthy) s) of
0
+ − 288
SOME info => (list_comb (Const (#mapfun info, ftys ---> oty --> nty), fs), (oty, nty))
41
+ − 289
| NONE => raise ERROR ("no map association for type " ^ s))
0
+ − 290
end
+ − 291
46
+ − 292
fun get_const absF = (Const ("QuotMain.ABS_" ^ qty_name, rty --> qty), (rty, qty))
+ − 293
| get_const repF = (Const ("QuotMain.REP_" ^ qty_name, qty --> rty), (qty, rty))
41
+ − 294
70
f3cbda066c3a
consistent usage of rty (for the raw, unquotient type); tuned a bit the Isar
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 295
fun mk_identity ty = Abs ("", ty, Bound 0)
41
+ − 296
0
+ − 297
in
+ − 298
if ty = qty
46
+ − 299
then (get_const flag)
0
+ − 300
else (case ty of
41
+ − 301
TFree _ => (mk_identity ty, (ty, ty))
+ − 302
| Type (_, []) => (mk_identity ty, (ty, ty))
109
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 303
| Type ("fun" , [ty1, ty2]) =>
110
+ − 304
get_fun_fun "fun" [get_fun (negF flag) rty qty lthy ty1, get_fun flag rty qty lthy ty2]
46
+ − 305
| Type (s, tys) => get_fun_aux s (map (get_fun flag rty qty lthy) tys)
41
+ − 306
| _ => raise ERROR ("no type variables")
0
+ − 307
)
+ − 308
end
+ − 309
*}
+ − 310
111
+ − 311
term fun_map
+ − 312
0
+ − 313
ML {*
109
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 314
get_fun repF @{typ t} @{typ qt} @{context} @{typ "((qt \<Rightarrow> qt) list) * nat"}
2
+ − 315
|> fst
+ − 316
|> Syntax.string_of_term @{context}
+ − 317
|> writeln
+ − 318
*}
+ − 319
46
+ − 320
ML {*
109
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 321
get_fun absF @{typ t} @{typ qt} @{context} @{typ "qt * nat"}
46
+ − 322
|> fst
110
+ − 323
|> type_of
46
+ − 324
*}
2
+ − 325
109
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 326
text {*
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 327
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 328
Christian:
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 329
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 330
When "get_fun" gets a function type, it should call itself
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 331
recursively for the right side of the arrow and call itself
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 332
recursively with the flag swapped for left side. This way
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 333
for a simple (qt\<Rightarrow>qt) function type it will make a (REP--->ABS).
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 334
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 335
Examples of what it should do from Peter's code follow:
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 336
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 337
- mkabs ``\x : 'a list.x``;
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 338
> val it = ``(finite_set_REP --> finite_set_ABS) (\x. x)`` : term
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 339
- mkabs ``\x : (('a list -> 'a list) -> 'a list). y : 'a list``;
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 340
> val it = ``((finite_set_ABS --> finite_set_REP) --> finite_set_ABS) (\x. y)``
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 341
- mkabs ``\x : (('a list -> 'a list) -> 'a list). y : 'a list``;
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 342
> val it =
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 343
``(((finite_set_REP --> finite_set_ABS) --> finite_set_REP) -->
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 344
finite_set_ABS) (\x. y)`` : term
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 345
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 346
It currently doesn't do it, the following code generates a wrong
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 347
function and the second ML block fails to typecheck for this reason:
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 348
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 349
*}
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 350
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 351
ML {*
111
+ − 352
get_fun repF @{typ t} @{typ qt} @{context} @{typ "((qt \<Rightarrow> qt) \<Rightarrow> qt) \<Rightarrow> qt"}
109
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 353
|> fst
110
+ − 354
|> cterm_of @{theory}
109
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 355
*}
386671ef36bd
fixed the problem with function types; but only type_of works; cterm_of does not work
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 356
41
+ − 357
text {* produces the definition for a lifted constant *}
86
+ − 358
2
+ − 359
ML {*
0
+ − 360
fun get_const_def nconst oconst rty qty lthy =
+ − 361
let
+ − 362
val ty = fastype_of nconst
+ − 363
val (arg_tys, res_ty) = strip_type ty
14
+ − 364
0
+ − 365
val fresh_args = arg_tys |> map (pair "x")
15
+ − 366
|> Variable.variant_frees lthy [nconst, oconst]
0
+ − 367
|> map Free
+ − 368
46
+ − 369
val rep_fns = map (fst o get_fun repF rty qty lthy) arg_tys
+ − 370
val abs_fn = (fst o get_fun absF rty qty lthy) res_ty
0
+ − 371
+ − 372
in
+ − 373
map (op $) (rep_fns ~~ fresh_args)
+ − 374
|> curry list_comb oconst
+ − 375
|> curry (op $) abs_fn
+ − 376
|> fold_rev lambda fresh_args
+ − 377
end
+ − 378
*}
+ − 379
+ − 380
ML {*
15
+ − 381
fun exchange_ty rty qty ty =
49
+ − 382
if ty = rty
41
+ − 383
then qty
15
+ − 384
else
0
+ − 385
(case ty of
+ − 386
Type (s, tys) => Type (s, map (exchange_ty rty qty) tys)
41
+ − 387
| _ => ty
+ − 388
)
0
+ − 389
*}
+ − 390
+ − 391
ML {*
17
+ − 392
fun make_const_def nconst_bname oconst mx rty qty lthy =
0
+ − 393
let
+ − 394
val oconst_ty = fastype_of oconst
+ − 395
val nconst_ty = exchange_ty rty qty oconst_ty
17
+ − 396
val nconst = Const (Binding.name_of nconst_bname, nconst_ty)
0
+ − 397
val def_trm = get_const_def nconst oconst rty qty lthy
+ − 398
in
79
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 399
define (nconst_bname, mx, def_trm) lthy
15
+ − 400
end
0
+ − 401
*}
+ − 402
111
+ − 403
(* A test whether get_fun works properly
+ − 404
consts bla :: "(t \<Rightarrow> t) \<Rightarrow> t"
+ − 405
local_setup {*
+ − 406
fn lthy => (Toplevel.program (fn () =>
+ − 407
make_const_def @{binding bla'} @{term "bla"} NoSyn @{typ "t"} @{typ "qt"} lthy
+ − 408
)) |> snd
+ − 409
*}
+ − 410
*)
+ − 411
2
+ − 412
local_setup {*
41
+ − 413
make_const_def @{binding VR} @{term "vr"} NoSyn @{typ "t"} @{typ "qt"} #> snd #>
+ − 414
make_const_def @{binding AP} @{term "ap"} NoSyn @{typ "t"} @{typ "qt"} #> snd #>
17
+ − 415
make_const_def @{binding LM} @{term "lm"} NoSyn @{typ "t"} @{typ "qt"} #> snd
2
+ − 416
*}
+ − 417
41
+ − 418
term vr
+ − 419
term ap
+ − 420
term lm
+ − 421
thm VR_def AP_def LM_def
14
+ − 422
term LM
2
+ − 423
term VR
+ − 424
term AP
+ − 425
0
+ − 426
text {* a test with functions *}
+ − 427
datatype 'a t' =
+ − 428
vr' "string"
+ − 429
| ap' "('a t') * ('a t')"
+ − 430
| lm' "'a" "string \<Rightarrow> ('a t')"
+ − 431
+ − 432
consts Rt' :: "('a t') \<Rightarrow> ('a t') \<Rightarrow> bool"
+ − 433
axioms t_eq': "EQUIV Rt'"
+ − 434
81
+ − 435
quotient qt' = "'a t'" / "Rt'"
79
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 436
apply(rule t_eq')
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 437
done
0
+ − 438
14
+ − 439
print_theorems
2
+ − 440
0
+ − 441
local_setup {*
41
+ − 442
make_const_def @{binding VR'} @{term "vr'"} NoSyn @{typ "'a t'"} @{typ "'a qt'"} #> snd #>
+ − 443
make_const_def @{binding AP'} @{term "ap'"} NoSyn @{typ "'a t'"} @{typ "'a qt'"} #> snd #>
17
+ − 444
make_const_def @{binding LM'} @{term "lm'"} NoSyn @{typ "'a t'"} @{typ "'a qt'"} #> snd
0
+ − 445
*}
+ − 446
41
+ − 447
term vr'
+ − 448
term ap'
+ − 449
term ap'
+ − 450
thm VR'_def AP'_def LM'_def
14
+ − 451
term LM'
0
+ − 452
term VR'
+ − 453
term AP'
+ − 454
14
+ − 455
0
+ − 456
text {* finite set example *}
13
+ − 457
print_syntax
14
+ − 458
inductive
13
+ − 459
list_eq (infix "\<approx>" 50)
0
+ − 460
where
+ − 461
"a#b#xs \<approx> b#a#xs"
+ − 462
| "[] \<approx> []"
+ − 463
| "xs \<approx> ys \<Longrightarrow> ys \<approx> xs"
+ − 464
| "a#a#xs \<approx> a#xs"
+ − 465
| "xs \<approx> ys \<Longrightarrow> a#xs \<approx> a#ys"
+ − 466
| "\<lbrakk>xs1 \<approx> xs2; xs2 \<approx> xs3\<rbrakk> \<Longrightarrow> xs1 \<approx> xs3"
+ − 467
47
+ − 468
lemma list_eq_refl:
0
+ − 469
shows "xs \<approx> xs"
13
+ − 470
apply (induct xs)
+ − 471
apply (auto intro: list_eq.intros)
+ − 472
done
0
+ − 473
+ − 474
lemma equiv_list_eq:
+ − 475
shows "EQUIV list_eq"
13
+ − 476
unfolding EQUIV_REFL_SYM_TRANS REFL_def SYM_def TRANS_def
47
+ − 477
apply(auto intro: list_eq.intros list_eq_refl)
13
+ − 478
done
0
+ − 479
81
+ − 480
quotient fset = "'a list" / "list_eq"
79
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 481
apply(rule equiv_list_eq)
c0c41fefeb06
added quotient command (you need to update isar-keywords-prove.el)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 482
done
0
+ − 483
14
+ − 484
print_theorems
+ − 485
0
+ − 486
typ "'a fset"
+ − 487
thm "Rep_fset"
+ − 488
+ − 489
local_setup {*
17
+ − 490
make_const_def @{binding EMPTY} @{term "[]"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd
0
+ − 491
*}
+ − 492
14
+ − 493
term Nil
0
+ − 494
term EMPTY
2
+ − 495
thm EMPTY_def
+ − 496
0
+ − 497
+ − 498
local_setup {*
17
+ − 499
make_const_def @{binding INSERT} @{term "op #"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd
0
+ − 500
*}
+ − 501
14
+ − 502
term Cons
0
+ − 503
term INSERT
2
+ − 504
thm INSERT_def
0
+ − 505
+ − 506
local_setup {*
17
+ − 507
make_const_def @{binding UNION} @{term "op @"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd
0
+ − 508
*}
+ − 509
15
+ − 510
term append
0
+ − 511
term UNION
2
+ − 512
thm UNION_def
+ − 513
7
+ − 514
0
+ − 515
thm QUOTIENT_fset
+ − 516
14
+ − 517
thm QUOT_TYPE_I_fset.thm11
9
+ − 518
+ − 519
13
+ − 520
fun
+ − 521
membship :: "'a \<Rightarrow> 'a list \<Rightarrow> bool" (infix "memb" 100)
0
+ − 522
where
+ − 523
m1: "(x memb []) = False"
+ − 524
| m2: "(x memb (y#xs)) = ((x=y) \<or> (x memb xs))"
+ − 525
2
+ − 526
lemma mem_respects:
9
+ − 527
fixes z
2
+ − 528
assumes a: "list_eq x y"
9
+ − 529
shows "(z memb x) = (z memb y)"
13
+ − 530
using a by induct auto
+ − 531
2
+ − 532
29
+ − 533
fun
+ − 534
card1 :: "'a list \<Rightarrow> nat"
+ − 535
where
+ − 536
card1_nil: "(card1 []) = 0"
+ − 537
| card1_cons: "(card1 (x # xs)) = (if (x memb xs) then (card1 xs) else (Suc (card1 xs)))"
+ − 538
+ − 539
local_setup {*
+ − 540
make_const_def @{binding card} @{term "card1"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd
+ − 541
*}
+ − 542
+ − 543
term card1
+ − 544
term card
+ − 545
thm card_def
+ − 546
+ − 547
(* text {*
+ − 548
Maybe make_const_def should require a theorem that says that the particular lifted function
+ − 549
respects the relation. With it such a definition would be impossible:
+ − 550
make_const_def @{binding CARD} @{term "length"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd
41
+ − 551
*}*)
29
+ − 552
+ − 553
lemma card1_rsp:
+ − 554
fixes a b :: "'a list"
+ − 555
assumes e: "a \<approx> b"
+ − 556
shows "card1 a = card1 b"
+ − 557
using e apply induct
+ − 558
apply (simp_all add:mem_respects)
+ − 559
done
+ − 560
+ − 561
lemma card1_0:
+ − 562
fixes a :: "'a list"
+ − 563
shows "(card1 a = 0) = (a = [])"
+ − 564
apply (induct a)
+ − 565
apply (simp)
+ − 566
apply (simp_all)
+ − 567
apply meson
+ − 568
apply (simp_all)
+ − 569
done
+ − 570
+ − 571
lemma not_mem_card1:
+ − 572
fixes x :: "'a"
+ − 573
fixes xs :: "'a list"
+ − 574
shows "~(x memb xs) \<Longrightarrow> card1 (x # xs) = Suc (card1 xs)"
+ − 575
by simp
+ − 576
+ − 577
+ − 578
lemma mem_cons:
+ − 579
fixes x :: "'a"
+ − 580
fixes xs :: "'a list"
+ − 581
assumes a : "x memb xs"
+ − 582
shows "x # xs \<approx> xs"
49
+ − 583
using a
38
+ − 584
apply (induct xs)
+ − 585
apply (auto intro: list_eq.intros)
+ − 586
done
29
+ − 587
+ − 588
lemma card1_suc:
+ − 589
fixes xs :: "'a list"
+ − 590
fixes n :: "nat"
+ − 591
assumes c: "card1 xs = Suc n"
+ − 592
shows "\<exists>a ys. ~(a memb ys) \<and> xs \<approx> (a # ys)"
49
+ − 593
using c
38
+ − 594
apply(induct xs)
+ − 595
apply (metis Suc_neq_Zero card1_0)
47
+ − 596
apply (metis QUOT_TYPE_I_fset.R_trans QuotMain.card1_cons list_eq_refl mem_cons)
38
+ − 597
done
29
+ − 598
97
+ − 599
primrec
+ − 600
fold1
+ − 601
where
+ − 602
"fold1 f (g :: 'a \<Rightarrow> 'b) (z :: 'b) [] = z"
+ − 603
| "fold1 f g z (a # A) =
+ − 604
(if ((!u v. (f u v = f v u))
+ − 605
\<and> (!u v w. ((f u (f v w) = f (f u v) w))))
+ − 606
then (
+ − 607
if (a memb A) then (fold1 f g z A) else (f (g a) (fold1 f g z A))
+ − 608
) else z)"
+ − 609
100
+ − 610
(* fold1_def is not usable, but: *)
97
+ − 611
thm fold1.simps
+ − 612
12
+ − 613
lemma cons_preserves:
+ − 614
fixes z
+ − 615
assumes a: "xs \<approx> ys"
+ − 616
shows "(z # xs) \<approx> (z # ys)"
13
+ − 617
using a by (rule QuotMain.list_eq.intros(5))
12
+ − 618
60
4826ad24f772
First theorem with quantifiers. Learned how to use sledgehammer.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 619
lemma fs1_strong_cases:
4826ad24f772
First theorem with quantifiers. Learned how to use sledgehammer.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 620
fixes X :: "'a list"
4826ad24f772
First theorem with quantifiers. Learned how to use sledgehammer.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 621
shows "(X = []) \<or> (\<exists>a. \<exists> Y. (~(a memb Y) \<and> (X \<approx> a # Y)))"
4826ad24f772
First theorem with quantifiers. Learned how to use sledgehammer.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 622
apply (induct X)
4826ad24f772
First theorem with quantifiers. Learned how to use sledgehammer.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 623
apply (simp)
72
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 624
apply (metis QUOT_TYPE_I_fset.thm11 list_eq_refl mem_cons QuotMain.m1)
60
4826ad24f772
First theorem with quantifiers. Learned how to use sledgehammer.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 625
done
29
+ − 626
10
+ − 627
local_setup {*
17
+ − 628
make_const_def @{binding IN} @{term "membship"} NoSyn @{typ "'a list"} @{typ "'a fset"} #> snd
10
+ − 629
*}
+ − 630
0
+ − 631
term membship
+ − 632
term IN
2
+ − 633
thm IN_def
66
+ − 634
2
+ − 635
lemmas a = QUOT_TYPE.ABS_def[OF QUOT_TYPE_fset]
+ − 636
thm QUOT_TYPE.thm11[OF QUOT_TYPE_fset, THEN iffD1, simplified a]
0
+ − 637
2
+ − 638
lemma yy:
+ − 639
shows "(False = x memb []) = (False = IN (x::nat) EMPTY)"
+ − 640
unfolding IN_def EMPTY_def
+ − 641
apply(rule_tac f="(op =) False" in arg_cong)
+ − 642
apply(rule mem_respects)
14
+ − 643
apply(simp only: QUOT_TYPE_I_fset.REP_ABS_rsp)
2
+ − 644
apply(rule list_eq.intros)
0
+ − 645
done
+ − 646
2
+ − 647
lemma
+ − 648
shows "IN (x::nat) EMPTY = False"
+ − 649
using m1
+ − 650
apply -
+ − 651
apply(rule yy[THEN iffD1, symmetric])
+ − 652
apply(simp)
0
+ − 653
done
+ − 654
2
+ − 655
lemma
+ − 656
shows "((x=y) \<or> (IN x xs) = (IN (x::nat) (INSERT y xs))) =
23
+ − 657
((x=y) \<or> x memb REP_fset xs = x memb (y # REP_fset xs))"
2
+ − 658
unfolding IN_def INSERT_def
+ − 659
apply(rule_tac f="(op \<or>) (x=y)" in arg_cong)
+ − 660
apply(rule_tac f="(op =) (x memb REP_fset xs)" in arg_cong)
+ − 661
apply(rule mem_respects)
+ − 662
apply(rule list_eq.intros(3))
+ − 663
apply(unfold REP_fset_def ABS_fset_def)
5
+ − 664
apply(simp only: QUOT_TYPE.REP_ABS_rsp[OF QUOT_TYPE_fset])
47
+ − 665
apply(rule list_eq_refl)
2
+ − 666
done
0
+ − 667
7
+ − 668
lemma append_respects_fst:
14
+ − 669
assumes a : "list_eq l1 l2"
4
+ − 670
shows "list_eq (l1 @ s) (l2 @ s)"
3
+ − 671
using a
+ − 672
apply(induct)
4
+ − 673
apply(auto intro: list_eq.intros)
47
+ − 674
apply(simp add: list_eq_refl)
3
+ − 675
done
+ − 676
18
+ − 677
lemma yyy:
3
+ − 678
shows "
+ − 679
(
+ − 680
(UNION EMPTY s = s) &
+ − 681
((UNION (INSERT e s1) s2) = (INSERT e (UNION s1 s2)))
+ − 682
) = (
+ − 683
((ABS_fset ([] @ REP_fset s)) = s) &
+ − 684
((ABS_fset ((e # (REP_fset s1)) @ REP_fset s2)) = ABS_fset (e # (REP_fset s1 @ REP_fset s2)))
+ − 685
)"
+ − 686
unfolding UNION_def EMPTY_def INSERT_def
+ − 687
apply(rule_tac f="(op &)" in arg_cong2)
+ − 688
apply(rule_tac f="(op =)" in arg_cong2)
14
+ − 689
apply(simp only: QUOT_TYPE_I_fset.thm11[symmetric])
7
+ − 690
apply(rule append_respects_fst)
18
+ − 691
apply(simp only: QUOT_TYPE_I_fset.REP_ABS_rsp)
47
+ − 692
apply(rule list_eq_refl)
3
+ − 693
apply(simp)
+ − 694
apply(rule_tac f="(op =)" in arg_cong2)
14
+ − 695
apply(simp only: QUOT_TYPE_I_fset.thm11[symmetric])
7
+ − 696
apply(rule append_respects_fst)
14
+ − 697
apply(simp only: QUOT_TYPE_I_fset.REP_ABS_rsp)
47
+ − 698
apply(rule list_eq_refl)
14
+ − 699
apply(simp only: QUOT_TYPE_I_fset.thm11[symmetric])
3
+ − 700
apply(rule list_eq.intros(5))
14
+ − 701
apply(simp only: QUOT_TYPE_I_fset.REP_ABS_rsp)
47
+ − 702
apply(rule list_eq_refl)
3
+ − 703
done
+ − 704
+ − 705
lemma
+ − 706
shows "
+ − 707
(UNION EMPTY s = s) &
7
+ − 708
((UNION (INSERT e s1) s2) = (INSERT e (UNION s1 s2)))"
+ − 709
apply (simp add: yyy)
24
+ − 710
apply (simp add: QUOT_TYPE_I_fset.thm10)
7
+ − 711
done
3
+ − 712
8
+ − 713
ML {*
55
+ − 714
fun mk_rep x = @{term REP_fset} $ x;
+ − 715
fun mk_abs x = @{term ABS_fset} $ x;
107
+ − 716
val consts = [@{const_name "Nil"}, @{const_name "Cons"},
+ − 717
@{const_name "membship"}, @{const_name "card1"},
+ − 718
@{const_name "append"}, @{const_name "fold1"}];
8
+ − 719
*}
+ − 720
107
+ − 721
ML {* val tm = @{term "x :: 'a list"} *}
+ − 722
ML {* val ty = exchange_ty @{typ "'a list"} @{typ "'a fset"} (fastype_of tm) *}
+ − 723
ML {* (fst (get_fun repF @{typ "'a list"} @{typ "'a fset"} @{context} ty)) $ tm *}
+ − 724
56
+ − 725
ML {* val qty = @{typ "'a fset"} *}
+ − 726
ML {* val tt = Type ("fun", [Type ("fun", [qty, @{typ "prop"}]), @{typ "prop"}]) *}
58
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 727
ML {* val fall = Const(@{const_name all}, dummyT) *}
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 728
8
+ − 729
ML {*
107
+ − 730
fun needs_lift (rty as Type (rty_s, _)) ty =
+ − 731
case ty of
+ − 732
Type (s, tys) =>
+ − 733
(s = rty_s) orelse (exists (needs_lift rty) tys)
+ − 734
| _ => false
+ − 735
+ − 736
*}
+ − 737
+ − 738
ML {*
+ − 739
fun build_goal_term lthy thm constructors rty qty =
+ − 740
let
+ − 741
fun mk_rep tm =
+ − 742
let
+ − 743
val ty = exchange_ty rty qty (fastype_of tm)
+ − 744
in fst (get_fun repF rty qty lthy ty) $ tm end
+ − 745
+ − 746
fun mk_abs tm =
+ − 747
let
+ − 748
val _ = tracing (Syntax.string_of_term @{context} tm)
+ − 749
val _ = tracing (Syntax.string_of_typ @{context} (fastype_of tm))
+ − 750
val ty = exchange_ty rty qty (fastype_of tm) in
+ − 751
fst (get_fun absF rty qty lthy ty) $ tm end
+ − 752
+ − 753
fun is_constructor (Const (x, _)) = member (op =) constructors x
+ − 754
| is_constructor _ = false;
+ − 755
+ − 756
fun build_aux lthy tm =
+ − 757
case tm of
+ − 758
Abs (a as (_, vty, _)) =>
+ − 759
let
+ − 760
val (vs, t) = Term.dest_abs a;
+ − 761
val v = Free(vs, vty);
+ − 762
val t' = lambda v (build_aux lthy t)
+ − 763
in
+ − 764
if (not (needs_lift rty (fastype_of tm))) then t'
+ − 765
else mk_rep (mk_abs (
+ − 766
if not (needs_lift rty vty) then t'
+ − 767
else
+ − 768
let
+ − 769
val v' = mk_rep (mk_abs v);
+ − 770
val t1 = Envir.beta_norm (t' $ v')
+ − 771
in
+ − 772
lambda v t1
+ − 773
end
+ − 774
))
+ − 775
end
+ − 776
| x =>
+ − 777
let
+ − 778
val _ = tracing (">>" ^ Syntax.string_of_term @{context} tm)
+ − 779
val (opp, tms0) = Term.strip_comb tm
+ − 780
val tms = map (build_aux lthy) tms0
+ − 781
val ty = fastype_of tm
+ − 782
in
+ − 783
if (((fst (Term.dest_Const opp)) = @{const_name Respects}) handle _ => false)
+ − 784
then (list_comb (opp, (hd tms0) :: (tl tms)))
+ − 785
else if (is_constructor opp andalso needs_lift rty ty) then
+ − 786
mk_rep (mk_abs (list_comb (opp,tms)))
+ − 787
else if ((Term.is_Free opp) andalso (length tms > 0) andalso (needs_lift rty ty)) then
+ − 788
mk_rep(mk_abs(list_comb(opp,tms)))
+ − 789
else if tms = [] then opp
+ − 790
else list_comb(opp, tms)
+ − 791
end
+ − 792
in
+ − 793
build_aux lthy (Thm.prop_of thm)
+ − 794
end
+ − 795
+ − 796
*}
+ − 797
+ − 798
ML {*
+ − 799
fun build_goal_term_old ctxt thm constructors rty qty mk_rep mk_abs =
49
+ − 800
let
55
+ − 801
fun mk_rep_abs x = mk_rep (mk_abs x);
+ − 802
49
+ − 803
fun is_constructor (Const (x, _)) = member (op =) constructors x
+ − 804
| is_constructor _ = false;
+ − 805
43
+ − 806
fun maybe_mk_rep_abs t =
49
+ − 807
let
+ − 808
val _ = writeln ("Maybe: " ^ Syntax.string_of_term ctxt t)
+ − 809
in
55
+ − 810
if fastype_of t = rty then mk_rep_abs t else t
49
+ − 811
end;
+ − 812
56
+ − 813
fun is_all (Const ("all", Type("fun", [Type("fun", [ty, _]), _]))) = ty = rty
+ − 814
| is_all _ = false;
+ − 815
58
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 816
fun is_ex (Const ("Ex", Type("fun", [Type("fun", [ty, _]), _]))) = ty = rty
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 817
| is_ex _ = false;
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 818
49
+ − 819
fun build_aux ctxt1 tm =
+ − 820
let
+ − 821
val (head, args) = Term.strip_comb tm;
+ − 822
val args' = map (build_aux ctxt1) args;
+ − 823
in
+ − 824
(case head of
+ − 825
Abs (x, T, t) =>
55
+ − 826
if T = rty then let
+ − 827
val ([x'], ctxt2) = Variable.variant_fixes [x] ctxt1;
+ − 828
val v = Free (x', qty);
+ − 829
val t' = subst_bound (mk_rep v, t);
+ − 830
val rec_term = build_aux ctxt2 t';
+ − 831
val _ = tracing (Syntax.string_of_term ctxt2 t')
+ − 832
val _ = tracing (Syntax.string_of_term ctxt2 (Term.lambda_name (x, v) rec_term))
+ − 833
in
+ − 834
Term.lambda_name (x, v) rec_term
+ − 835
end else let
49
+ − 836
val ([x'], ctxt2) = Variable.variant_fixes [x] ctxt1;
+ − 837
val v = Free (x', T);
+ − 838
val t' = subst_bound (v, t);
+ − 839
val rec_term = build_aux ctxt2 t';
+ − 840
in Term.lambda_name (x, v) rec_term end
58
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 841
| _ => (* I assume that we never lift 'prop' since it is not of sort type *)
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 842
if is_all head then
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 843
list_comb (Const(@{const_name all}, dummyT), args') |> Syntax.check_term ctxt1
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 844
else if is_ex head then
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 845
list_comb (Const(@{const_name Ex}, dummyT), args') |> Syntax.check_term ctxt1
56
+ − 846
else if is_constructor head then
49
+ − 847
maybe_mk_rep_abs (list_comb (head, map maybe_mk_rep_abs args'))
56
+ − 848
else
+ − 849
maybe_mk_rep_abs (list_comb (head, args'))
+ − 850
)
49
+ − 851
end;
+ − 852
in
58
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 853
build_aux ctxt (Thm.prop_of thm)
49
+ − 854
end
+ − 855
*}
+ − 856
58
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 857
ML {*
107
+ − 858
fun build_goal ctxt thm cons rty qty =
114
+ − 859
Logic.mk_equals ((Thm.prop_of thm), (build_goal_term ctxt thm cons rty qty))
58
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 860
*}
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 861
67
+ − 862
ML {*
107
+ − 863
val m1_novars = snd(no_vars ((Context.Theory @{theory}), @{thm m2}))
67
+ − 864
*}
107
+ − 865
67
+ − 866
ML {*
107
+ − 867
cterm_of @{theory} (prop_of m1_novars);
+ − 868
cterm_of @{theory} (build_goal_term @{context} m1_novars consts @{typ "'a list"} @{typ "'a fset"});
+ − 869
cterm_of @{theory} (build_goal_term_old @{context} m1_novars consts @{typ "'a list"} @{typ "'a fset"} mk_rep mk_abs)
67
+ − 870
*}
+ − 871
58
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 872
100
+ − 873
text {*
+ − 874
Unabs_def converts a definition given as
+ − 875
+ − 876
c \<equiv> %x. %y. f x y
+ − 877
+ − 878
to a theorem of the form
+ − 879
+ − 880
c x y \<equiv> f x y
+ − 881
+ − 882
This function is needed to rewrite the right-hand
+ − 883
side to the left-hand side.
+ − 884
*}
+ − 885
+ − 886
ML {*
+ − 887
fun unabs_def ctxt def =
+ − 888
let
+ − 889
val (lhs, rhs) = Thm.dest_equals (cprop_of def)
+ − 890
val xs = strip_abs_vars (term_of rhs)
+ − 891
val (_, ctxt') = Variable.add_fixes (map fst xs) ctxt
+ − 892
+ − 893
val thy = ProofContext.theory_of ctxt'
+ − 894
val cxs = map (cterm_of thy o Free) xs
+ − 895
val new_lhs = Drule.list_comb (lhs, cxs)
+ − 896
+ − 897
fun get_conv [] = Conv.rewr_conv def
+ − 898
| get_conv (x::xs) = Conv.fun_conv (get_conv xs)
+ − 899
in
+ − 900
get_conv xs new_lhs |>
+ − 901
singleton (ProofContext.export ctxt' ctxt)
+ − 902
end
+ − 903
*}
+ − 904
+ − 905
ML {* (* Test: *) @{thm IN_def}; unabs_def @{context} @{thm IN_def} *}
+ − 906
29
+ − 907
ML {* val fset_defs = @{thms EMPTY_def IN_def UNION_def card_def INSERT_def} *}
68
e8660818c755
renamed unlam_def to unabs_def (matching the function abs_def in drule.ML)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 908
ML {* val fset_defs_sym = map (fn t => symmetric (unabs_def @{context} t)) fset_defs *}
18
+ − 909
70
f3cbda066c3a
consistent usage of rty (for the raw, unquotient type); tuned a bit the Isar
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 910
lemma atomize_eqv[atomize]:
f3cbda066c3a
consistent usage of rty (for the raw, unquotient type); tuned a bit the Isar
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 911
shows "(Trueprop A \<equiv> Trueprop B) \<equiv> (A \<equiv> B)"
49
+ − 912
proof
70
f3cbda066c3a
consistent usage of rty (for the raw, unquotient type); tuned a bit the Isar
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 913
assume "A \<equiv> B"
f3cbda066c3a
consistent usage of rty (for the raw, unquotient type); tuned a bit the Isar
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 914
then show "Trueprop A \<equiv> Trueprop B" by unfold
49
+ − 915
next
70
f3cbda066c3a
consistent usage of rty (for the raw, unquotient type); tuned a bit the Isar
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 916
assume *: "Trueprop A \<equiv> Trueprop B"
49
+ − 917
have "A = B"
+ − 918
proof (cases A)
+ − 919
case True
70
f3cbda066c3a
consistent usage of rty (for the raw, unquotient type); tuned a bit the Isar
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 920
have "A" by fact
f3cbda066c3a
consistent usage of rty (for the raw, unquotient type); tuned a bit the Isar
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 921
then show "A = B" using * by simp
49
+ − 922
next
+ − 923
case False
70
f3cbda066c3a
consistent usage of rty (for the raw, unquotient type); tuned a bit the Isar
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 924
have "\<not>A" by fact
f3cbda066c3a
consistent usage of rty (for the raw, unquotient type); tuned a bit the Isar
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 925
then show "A = B" using * by auto
49
+ − 926
qed
70
f3cbda066c3a
consistent usage of rty (for the raw, unquotient type); tuned a bit the Isar
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 927
then show "A \<equiv> B" by (rule eq_reflection)
49
+ − 928
qed
+ − 929
103
+ − 930
(* Has all the theorems about fset plugged in. These should be parameters to the tactic *)
+ − 931
ML {*
+ − 932
fun transconv_fset_tac' ctxt =
+ − 933
(LocalDefs.unfold_tac @{context} fset_defs) THEN
+ − 934
ObjectLogic.full_atomize_tac 1 THEN
+ − 935
REPEAT_ALL_NEW (FIRST' [
+ − 936
rtac @{thm list_eq_refl},
+ − 937
rtac @{thm cons_preserves},
+ − 938
rtac @{thm mem_respects},
+ − 939
rtac @{thm card1_rsp},
+ − 940
rtac @{thm QUOT_TYPE_I_fset.R_trans2},
+ − 941
CHANGED o (simp_tac ((Simplifier.context ctxt HOL_ss) addsimps @{thms QUOT_TYPE_I_fset.REP_ABS_rsp})),
+ − 942
Cong_Tac.cong_tac @{thm cong},
+ − 943
rtac @{thm ext}
+ − 944
]) 1
+ − 945
*}
+ − 946
+ − 947
ML {*
+ − 948
val m1_novars = snd(no_vars ((Context.Theory @{theory}), @{thm m1}))
107
+ − 949
val goal = build_goal @{context} m1_novars consts @{typ "'a list"} @{typ "'a fset"}
103
+ − 950
val cgoal = cterm_of @{theory} goal
+ − 951
val cgoal2 = Thm.rhs_of (MetaSimplifier.rewrite false fset_defs_sym cgoal)
+ − 952
*}
+ − 953
+ − 954
(*notation ( output) "prop" ("#_" [1000] 1000) *)
+ − 955
notation ( output) "Trueprop" ("#_" [1000] 1000)
+ − 956
+ − 957
30
e35198635d64
Using "atomize" the versions with arbitrary Trueprops can be proven.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 958
prove {* (Thm.term_of cgoal2) *}
103
+ − 959
apply (tactic {* transconv_fset_tac' @{context} *})
30
e35198635d64
Using "atomize" the versions with arbitrary Trueprops can be proven.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 960
done
18
+ − 961
20
+ − 962
thm length_append (* Not true but worth checking that the goal is correct *)
+ − 963
ML {*
49
+ − 964
val m1_novars = snd(no_vars ((Context.Theory @{theory}), @{thm length_append}))
107
+ − 965
val goal = build_goal @{context} m1_novars consts @{typ "'a list"} @{typ "'a fset"}
20
+ − 966
val cgoal = cterm_of @{theory} goal
21
+ − 967
val cgoal2 = Thm.rhs_of (MetaSimplifier.rewrite false fset_defs_sym cgoal)
20
+ − 968
*}
30
e35198635d64
Using "atomize" the versions with arbitrary Trueprops can be proven.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 969
prove {* Thm.term_of cgoal2 *}
103
+ − 970
apply (tactic {* transconv_fset_tac' @{context} *})
25
+ − 971
sorry
19
+ − 972
20
+ − 973
thm m2
+ − 974
ML {*
49
+ − 975
val m1_novars = snd(no_vars ((Context.Theory @{theory}), @{thm m2}))
107
+ − 976
val goal = build_goal @{context} m1_novars consts @{typ "'a list"} @{typ "'a fset"}
20
+ − 977
val cgoal = cterm_of @{theory} goal
21
+ − 978
val cgoal2 = Thm.rhs_of (MetaSimplifier.rewrite false fset_defs_sym cgoal)
20
+ − 979
*}
30
e35198635d64
Using "atomize" the versions with arbitrary Trueprops can be proven.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 980
prove {* Thm.term_of cgoal2 *}
103
+ − 981
apply (tactic {* transconv_fset_tac' @{context} *})
30
e35198635d64
Using "atomize" the versions with arbitrary Trueprops can be proven.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 982
done
21
+ − 983
+ − 984
thm list_eq.intros(4)
+ − 985
ML {*
49
+ − 986
val m1_novars = snd(no_vars ((Context.Theory @{theory}), @{thm list_eq.intros(4)}))
107
+ − 987
val goal = build_goal @{context} m1_novars consts @{typ "'a list"} @{typ "'a fset"}
21
+ − 988
val cgoal = cterm_of @{theory} goal
+ − 989
val cgoal2 = Thm.rhs_of (MetaSimplifier.rewrite false fset_defs_sym cgoal)
24
+ − 990
val cgoal3 = Thm.rhs_of (MetaSimplifier.rewrite true @{thms QUOT_TYPE_I_fset.thm10} cgoal2)
21
+ − 991
*}
+ − 992
24
+ − 993
(* It is the same, but we need a name for it. *)
52
6584b1ceedce
Partially fix lifting of card_suc. The quantified variable still needs to be changed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 994
prove zzz : {* Thm.term_of cgoal3 *}
103
+ − 995
apply (tactic {* transconv_fset_tac' @{context} *})
21
+ − 996
done
+ − 997
107
+ − 998
(*lemma zzz' :
24
+ − 999
"(REP_fset (INSERT a (INSERT a (ABS_fset xs))) \<approx> REP_fset (INSERT a (ABS_fset xs)))"
+ − 1000
using list_eq.intros(4) by (simp only: zzz)
+ − 1001
+ − 1002
thm QUOT_TYPE_I_fset.REPS_same
25
+ − 1003
ML {* val zzz'' = MetaSimplifier.rewrite_rule @{thms QUOT_TYPE_I_fset.REPS_same} @{thm zzz'} *}
107
+ − 1004
*)
25
+ − 1005
21
+ − 1006
thm list_eq.intros(5)
+ − 1007
ML {*
49
+ − 1008
val m1_novars = snd(no_vars ((Context.Theory @{theory}), @{thm list_eq.intros(5)}))
107
+ − 1009
val goal = build_goal @{context} m1_novars consts @{typ "'a list"} @{typ "'a fset"}
103
+ − 1010
val cgoal = cterm_of @{theory} goal
49
+ − 1011
val cgoal2 = Thm.rhs_of (MetaSimplifier.rewrite true fset_defs_sym cgoal)
21
+ − 1012
*}
30
e35198635d64
Using "atomize" the versions with arbitrary Trueprops can be proven.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1013
prove {* Thm.term_of cgoal2 *}
103
+ − 1014
apply (tactic {* transconv_fset_tac' @{context} *})
21
+ − 1015
done
18
+ − 1016
99
+ − 1017
section {* handling quantifiers - regularize *}
+ − 1018
+ − 1019
text {* tyRel takes a type and builds a relation that a quantifier over this
+ − 1020
type needs to respect. *}
+ − 1021
ML {*
+ − 1022
fun tyRel ty rty rel lthy =
102
+ − 1023
if ty = rty
+ − 1024
then rel
99
+ − 1025
else (case ty of
+ − 1026
Type (s, tys) =>
+ − 1027
let
+ − 1028
val tys_rel = map (fn ty => ty --> ty --> @{typ bool}) tys;
+ − 1029
val ty_out = ty --> ty --> @{typ bool};
+ − 1030
val tys_out = tys_rel ---> ty_out;
+ − 1031
in
+ − 1032
(case (lookup (ProofContext.theory_of lthy) s) of
+ − 1033
SOME (info) => list_comb (Const (#relfun info, tys_out), map (fn ty => tyRel ty rty rel lthy) tys)
102
+ − 1034
| NONE => HOLogic.eq_const ty
99
+ − 1035
)
+ − 1036
end
102
+ − 1037
| _ => HOLogic.eq_const ty)
99
+ − 1038
*}
+ − 1039
+ − 1040
ML {*
+ − 1041
cterm_of @{theory} (tyRel @{typ "trm \<Rightarrow> bool"} @{typ "trm"} @{term "RR"} @{context})
+ − 1042
*}
+ − 1043
+ − 1044
definition
+ − 1045
Babs :: "('a \<Rightarrow> bool) \<Rightarrow> ('a \<Rightarrow> 'b) \<Rightarrow> 'a \<Rightarrow> 'b"
+ − 1046
where
+ − 1047
"(x \<in> p) \<Longrightarrow> (Babs p m x = m x)"
+ − 1048
(* TODO: Consider defining it with an "if"; sth like:
+ − 1049
Babs p m = \<lambda>x. if x \<in> p then m x else undefined
+ − 1050
*)
+ − 1051
+ − 1052
ML {*
+ − 1053
(* trm \<Rightarrow> new_trm *)
+ − 1054
fun regularise trm rty rel lthy =
+ − 1055
case trm of
+ − 1056
Abs (x, T, t) =>
+ − 1057
if (needs_lift rty T) then let
+ − 1058
val ([x'], lthy2) = Variable.variant_fixes [x] lthy;
+ − 1059
val v = Free (x', T);
+ − 1060
val t' = subst_bound (v, t);
+ − 1061
val rec_term = regularise t' rty rel lthy2;
+ − 1062
val lam_term = Term.lambda_name (x, v) rec_term;
+ − 1063
val sub_res_term = tyRel T rty rel lthy;
+ − 1064
val respects = Const (@{const_name Respects}, (fastype_of sub_res_term) --> T --> @{typ bool});
+ − 1065
val res_term = respects $ sub_res_term;
+ − 1066
val ty = fastype_of trm;
+ − 1067
val rabs = Const (@{const_name Babs}, (fastype_of res_term) --> ty --> ty);
+ − 1068
val rabs_term = (rabs $ res_term) $ lam_term;
+ − 1069
in
+ − 1070
rabs_term
+ − 1071
end else let
+ − 1072
val ([x'], lthy2) = Variable.variant_fixes [x] lthy;
+ − 1073
val v = Free (x', T);
+ − 1074
val t' = subst_bound (v, t);
+ − 1075
val rec_term = regularise t' rty rel lthy2;
+ − 1076
in
+ − 1077
Term.lambda_name (x, v) rec_term
+ − 1078
end
+ − 1079
| ((Const (@{const_name "All"}, at)) $ (Abs (x, T, t))) =>
+ − 1080
if (needs_lift rty T) then let
+ − 1081
val ([x'], lthy2) = Variable.variant_fixes [x] lthy;
+ − 1082
val v = Free (x', T);
+ − 1083
val t' = subst_bound (v, t);
+ − 1084
val rec_term = regularise t' rty rel lthy2;
+ − 1085
val lam_term = Term.lambda_name (x, v) rec_term;
+ − 1086
val sub_res_term = tyRel T rty rel lthy;
+ − 1087
val respects = Const (@{const_name Respects}, (fastype_of sub_res_term) --> T --> @{typ bool});
+ − 1088
val res_term = respects $ sub_res_term;
+ − 1089
val ty = fastype_of lam_term;
+ − 1090
val rall = Const (@{const_name Ball}, (fastype_of res_term) --> ty --> @{typ bool});
+ − 1091
val rall_term = (rall $ res_term) $ lam_term;
+ − 1092
in
+ − 1093
rall_term
+ − 1094
end else let
+ − 1095
val ([x'], lthy2) = Variable.variant_fixes [x] lthy;
+ − 1096
val v = Free (x', T);
+ − 1097
val t' = subst_bound (v, t);
+ − 1098
val rec_term = regularise t' rty rel lthy2;
+ − 1099
val lam_term = Term.lambda_name (x, v) rec_term
+ − 1100
in
+ − 1101
Const(@{const_name "All"}, at) $ lam_term
+ − 1102
end
+ − 1103
| ((Const (@{const_name "All"}, at)) $ P) =>
+ − 1104
let
+ − 1105
val (_, [al, _]) = dest_Type (fastype_of P);
+ − 1106
val ([x], lthy2) = Variable.variant_fixes [""] lthy;
+ − 1107
val v = (Free (x, al));
+ − 1108
val abs = Term.lambda_name (x, v) (P $ v);
+ − 1109
in regularise ((Const (@{const_name "All"}, at)) $ abs) rty rel lthy2 end
+ − 1110
| ((Const (@{const_name "Ex"}, at)) $ (Abs (x, T, t))) =>
+ − 1111
if (needs_lift rty T) then let
+ − 1112
val ([x'], lthy2) = Variable.variant_fixes [x] lthy;
+ − 1113
val v = Free (x', T);
+ − 1114
val t' = subst_bound (v, t);
+ − 1115
val rec_term = regularise t' rty rel lthy2;
+ − 1116
val lam_term = Term.lambda_name (x, v) rec_term;
+ − 1117
val sub_res_term = tyRel T rty rel lthy;
+ − 1118
val respects = Const (@{const_name Respects}, (fastype_of sub_res_term) --> T --> @{typ bool});
+ − 1119
val res_term = respects $ sub_res_term;
+ − 1120
val ty = fastype_of lam_term;
+ − 1121
val rall = Const (@{const_name Bex}, (fastype_of res_term) --> ty --> @{typ bool});
+ − 1122
val rall_term = (rall $ res_term) $ lam_term;
+ − 1123
in
+ − 1124
rall_term
+ − 1125
end else let
+ − 1126
val ([x'], lthy2) = Variable.variant_fixes [x] lthy;
+ − 1127
val v = Free (x', T);
+ − 1128
val t' = subst_bound (v, t);
+ − 1129
val rec_term = regularise t' rty rel lthy2;
+ − 1130
val lam_term = Term.lambda_name (x, v) rec_term
+ − 1131
in
+ − 1132
Const(@{const_name "Ex"}, at) $ lam_term
+ − 1133
end
+ − 1134
| ((Const (@{const_name "Ex"}, at)) $ P) =>
+ − 1135
let
+ − 1136
val (_, [al, _]) = dest_Type (fastype_of P);
+ − 1137
val ([x], lthy2) = Variable.variant_fixes [""] lthy;
+ − 1138
val v = (Free (x, al));
+ − 1139
val abs = Term.lambda_name (x, v) (P $ v);
+ − 1140
in regularise ((Const (@{const_name "Ex"}, at)) $ abs) rty rel lthy2 end
+ − 1141
| a $ b => (regularise a rty rel lthy) $ (regularise b rty rel lthy)
+ − 1142
| _ => trm
+ − 1143
+ − 1144
*}
+ − 1145
+ − 1146
ML {*
+ − 1147
cterm_of @{theory} (regularise @{term "\<lambda>x :: int. x"} @{typ "trm"} @{term "RR"} @{context});
+ − 1148
cterm_of @{theory} (regularise @{term "\<lambda>x :: trm. x"} @{typ "trm"} @{term "RR"} @{context});
+ − 1149
cterm_of @{theory} (regularise @{term "\<forall>x :: trm. P x"} @{typ "trm"} @{term "RR"} @{context});
+ − 1150
cterm_of @{theory} (regularise @{term "\<exists>x :: trm. P x"} @{typ "trm"} @{term "RR"} @{context});
+ − 1151
cterm_of @{theory} (regularise @{term "All (P :: trm \<Rightarrow> bool)"} @{typ "trm"} @{term "RR"} @{context});
+ − 1152
*}
+ − 1153
+ − 1154
ML {*
+ − 1155
fun atomize_thm thm =
+ − 1156
let
+ − 1157
val thm' = forall_intr_vars thm
+ − 1158
val thm'' = ObjectLogic.atomize (cprop_of thm')
+ − 1159
in
+ − 1160
Simplifier.rewrite_rule [thm''] thm'
+ − 1161
end
+ − 1162
*}
+ − 1163
+ − 1164
thm list.induct
114
+ − 1165
lemma list_induct_hol4:
+ − 1166
fixes P :: "'a list \<Rightarrow> bool"
+ − 1167
assumes "((P []) \<and> (\<forall>t. (P t) \<longrightarrow> (\<forall>h. (P (h # t)))))"
+ − 1168
shows "(\<forall>l. (P l))"
+ − 1169
sorry
+ − 1170
+ − 1171
ML {* atomize_thm @{thm list_induct_hol4} *}
99
+ − 1172
+ − 1173
(*fun prove_reg trm \<Rightarrow> thm (we might need some facts to do this)
+ − 1174
trm == new_trm
+ − 1175
*)
+ − 1176
114
+ − 1177
ML {* val li = Thm.freezeT (atomize_thm @{thm list_induct_hol4}) *}
87
+ − 1178
107
+ − 1179
prove list_induct_r: {*
93
+ − 1180
Logic.mk_implies
94
+ − 1181
((prop_of li),
+ − 1182
(regularise (prop_of li) @{typ "'a List.list"} @{term "op \<approx>"} @{context})) *}
93
+ − 1183
apply (simp only: equiv_res_forall[OF equiv_list_eq])
94
+ − 1184
thm RIGHT_RES_FORALL_REGULAR
+ − 1185
apply (rule RIGHT_RES_FORALL_REGULAR)
93
+ − 1186
prefer 2
+ − 1187
apply (assumption)
104
+ − 1188
apply (metis)
94
+ − 1189
done
87
+ − 1190
107
+ − 1191
ML {* val thm = @{thm list_induct_r} OF [li] *}
+ − 1192
ML {* val trm = build_goal @{context} thm consts @{typ "'a list"} @{typ "'a fset"} *}
112
+ − 1193
thm APPLY_RSP
+ − 1194
lemmas APPLY_RSP_I = APPLY_RSP[of "(op \<approx> ===> op =) ===> op =" "(ABS_fset ---> id) ---> id" "(REP_fset ---> id) ---> id" "op =" "id" "id"]
114
+ − 1195
lemmas APPLY_RSP_I2 = APPLY_RSP[of "op \<approx>" "ABS_fset" "REP_fset" "op =" "id" "id"]
112
+ − 1196
114
+ − 1197
thm REP_ABS_RSP(2)
+ − 1198
lemmas REP_ABS_RSP_I = REP_ABS_RSP(1)[of "(op \<approx> ===> op =) ===> op =" "(ABS_fset ---> id) ---> id" "(REP_fset ---> id) ---> id"]
112
+ − 1199
111
+ − 1200
prove trm
114
+ − 1201
thm UNION_def
112
+ − 1202
apply (atomize(full))
113
+ − 1203
apply (simp only: id_def[symmetric])
112
+ − 1204
114
+ − 1205
(* APPLY_RSP_TAC *)
112
+ − 1206
ML_prf {*
114
+ − 1207
val (_, gc') = Thm.dest_comb (Subgoal.focus @{context} 1 (Isar.goal ()) |> fst |> #concl)
+ − 1208
val (_, tc') = Thm.dest_comb (cterm_of @{theory} (concl_of @{thm "APPLY_RSP_I" }))
+ − 1209
val m = Thm.match (tc', gc')
+ − 1210
val t2 = Drule.instantiate m @{thm "APPLY_RSP_I" }
112
+ − 1211
*}
+ − 1212
apply (tactic {* rtac t2 1 *})
+ − 1213
prefer 4
+ − 1214
(* ABS_REP_RSP_TAC *)
+ − 1215
ML_prf {*
114
+ − 1216
val (_, gc') = Thm.dest_comb (Subgoal.focus @{context} 1 (Isar.goal ()) |> fst |> #concl)
+ − 1217
val (_, tc') = Thm.dest_comb (cterm_of @{theory} (concl_of @{thm "REP_ABS_RSP_I" }))
+ − 1218
val m = Thm.match (tc', gc')
+ − 1219
val t2 = Drule.instantiate m @{thm "REP_ABS_RSP_I" }
112
+ − 1220
*}
114
+ − 1221
apply (tactic {* rtac t2 1 *})
+ − 1222
prefer 2
+ − 1223
+ − 1224
(* LAMBDA_RES_TAC *)
+ − 1225
apply (simp only: FUN_REL.simps)
+ − 1226
apply (rule allI)
+ − 1227
apply (rule allI)
+ − 1228
apply (rule impI)
+ − 1229
+ − 1230
(* MK_COMB_TAC *)
+ − 1231
apply (tactic {* Cong_Tac.cong_tac @{thm cong} 1 *})
+ − 1232
(* MK_COMB_TAC *)
+ − 1233
apply (tactic {* Cong_Tac.cong_tac @{thm cong} 1 *})
+ − 1234
(* REFL_TAC *)
+ − 1235
apply (simp)
+ − 1236
(* MK_COMB_TAC *)
+ − 1237
apply (tactic {* Cong_Tac.cong_tac @{thm cong} 1 *})
+ − 1238
(* MK_COMB_TAC *)
+ − 1239
apply (tactic {* Cong_Tac.cong_tac @{thm cong} 1 *})
+ − 1240
(* REFL_TAC *)
+ − 1241
apply (simp)
+ − 1242
(* APPLY_RSP_TAC *)
+ − 1243
ML_prf {* Isar.goal () *}
+ − 1244
ML_prf {* val t = Thm.lift_rule (hd (cprems_of (Isar.goal ()))) @{thm "APPLY_RSP_I2" } *}
113
+ − 1245
ML_prf {*
114
+ − 1246
val (tc') = (Logic.strip_assums_concl (prop_of t));
+ − 1247
val ps = Logic.strip_params (prop_of t)
+ − 1248
val tt = Term.list_abs (ps, tc')
+ − 1249
val ct = cterm_of @{theory} tt
+ − 1250
*}
+ − 1251
ML_prf {*
+ − 1252
val goal = hd (prems_of (Isar.goal ()))
+ − 1253
val goalc = Logic.strip_assums_concl goal
+ − 1254
*}
+ − 1255
ML_prf {*
115
+ − 1256
val goalct = cterm_of @{theory} (hd ( prems_of (Isar.goal ())))
113
+ − 1257
*}
+ − 1258
114
+ − 1259
ML_prf {*
115
+ − 1260
val ps = Logic.strip_params goal
+ − 1261
val goal' = cterm_of @{theory} (Term.list_abs (ps, goalc))
+ − 1262
val goal'' = cterm_of @{theory} (Term.subst_bounds ((map Free ps), goalc))
114
+ − 1263
*}
115
+ − 1264
ML_prf {* ct; goal'' *}
+ − 1265
+ − 1266
ML_prf {* val nlct = cterm_of @{theory} (concl_of @{thm "APPLY_RSP_I2" }) *}
116
+ − 1267
115
+ − 1268
ML_prf {* Thm.match (nlct, goal'') *}
116
+ − 1269
ML_prf {* ct *}
115
+ − 1270
+ − 1271
+ − 1272
(*apply (tactic {*Cong_Tac.cong_tac @{thm APPLY_RSP_I2} 1 *}) *)
116
+ − 1273
ML_prf {* t *}
115
+ − 1274
ML_prf {*
116
+ − 1275
val man_inst =
+ − 1276
Drule.instantiate' [SOME @{ctyp 'a}, SOME @{ctyp bool}]
+ − 1277
[
117
+ − 1278
SOME @{cterm "\<lambda>(x\<Colon>'a list \<Rightarrow> bool) (y\<Colon>'a list \<Rightarrow> bool). x"},
+ − 1279
SOME @{cterm "\<lambda>(x\<Colon>'a list \<Rightarrow> bool) (y\<Colon>'a list \<Rightarrow> bool). (ABS_fset ---> id) ((REP_fset ---> id) y)"},
116
+ − 1280
SOME @{cterm "\<lambda>(x\<Colon>'a list \<Rightarrow> bool) (y\<Colon>'a list \<Rightarrow> bool). ([]::'a list)"},
+ − 1281
SOME @{cterm "\<lambda>(x\<Colon>'a list \<Rightarrow> bool) (y\<Colon>'a list \<Rightarrow> bool). (REP_fset (ABS_fset ([]::'a list)))"}
+ − 1282
] t
115
+ − 1283
*}
117
+ − 1284
ML_prf {*
+ − 1285
val (tc') = (Logic.strip_assums_concl (prop_of man_inst));
+ − 1286
val ps = Logic.strip_params (prop_of man_inst)
+ − 1287
val tt = Term.list_abs (ps, tc')
+ − 1288
val ct = cterm_of @{theory} tt
+ − 1289
*}
+ − 1290
ML_prf {*
+ − 1291
fun dest_cbinop t =
+ − 1292
let
+ − 1293
val (t2, rhs) = Thm.dest_comb t;
+ − 1294
val (bop, lhs) = Thm.dest_comb t2;
+ − 1295
in
+ − 1296
(bop, (lhs, rhs))
+ − 1297
end
+ − 1298
*}
115
+ − 1299
112
+ − 1300
117
+ − 1301
ML_prf {* val (a, b) = (snd (Thm.dest_abs NONE ct), (snd (Thm.dest_abs NONE goal'))) *}
+ − 1302
ML_prf {* val (a, b) = (snd (Thm.dest_abs NONE a), (snd (Thm.dest_abs NONE b))) *}
+ − 1303
ML_prf {* val (a, b) = (snd (Thm.dest_comb a), snd (Thm.dest_comb b)) *}
+ − 1304
ML_prf {* val (a, b) = ((fst o snd) (dest_cbinop a), (fst o snd) (dest_cbinop b)) *}
+ − 1305
ML_prf {* (term_of a, term_of b) *}
+ − 1306
ML_prf {* (Envir.beta_norm (term_of a), term_of b) *}
119
+ − 1307
ML_prf {* val man_inst_norm_r = Drule.beta_eta_conversion (cprop_of man_inst) *}
+ − 1308
ML_prf {* val man_inst_norm = MetaSimplifier.rewrite_rule [man_inst_norm_r] man_inst *}
+ − 1309
ML_prf {*
+ − 1310
val (tc') = (Logic.strip_assums_concl (prop_of man_inst_norm));
+ − 1311
val ps = Logic.strip_params (prop_of man_inst_norm)
+ − 1312
val tt = Term.list_abs (ps, tc')
+ − 1313
val ct = cterm_of @{theory} tt
+ − 1314
*}
+ − 1315
ML_prf {* Thm.match (ct, goal') *}
+ − 1316
ML_prf {* PRIMSEQ *}
+ − 1317
ML_prf {* man_inst_norm *}
+ − 1318
apply (tactic {* compose_tac (false, man_inst_norm, 4) 1 *})
+ − 1319
120
+ − 1320
(* MINE *)
+ − 1321
apply (rule QUOTIENT_fset)
119
+ − 1322
120
+ − 1323
prefer 3
+ − 1324
(* ABS_REP_RSP *)
+ − 1325
thm REP_ABS_RSP(1)[of "op \<approx>" "ABS_fset" "REP_fset"]
+ − 1326
apply (rule REP_ABS_RSP(1)[of "op \<approx>" "ABS_fset" "REP_fset"])
+ − 1327
(* MINE *)
+ − 1328
apply (rule QUOTIENT_fset)
+ − 1329
(* MINE *)
+ − 1330
apply (rule list_eq_refl )
+ − 1331
prefer 2
+ − 1332
(* ABS_REP_RSP *)
+ − 1333
apply (rule REP_ABS_RSP(1)[of "op \<approx> ===> op =" "REP_fset ---> id" "ABS_fset ---> id"])
+ − 1334
prefer 2
+ − 1335
(* MINE *)
+ − 1336
apply (simp only: FUN_REL.simps)
+ − 1337
prefer 3
+ − 1338
(* APPLY_RSP *)
+ − 1339
thm APPLY_RSP
111
+ − 1340
sorry
107
+ − 1341
112
+ − 1342
thm list.recs(2)
+ − 1343
+ − 1344
106
+ − 1345
ML {* val card1_suc_f = Thm.freezeT (atomize_thm @{thm card1_suc}) *}
96
4da714704611
A number of lemmas for REGULARIZE_TAC and regularizing card1.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1346
4da714704611
A number of lemmas for REGULARIZE_TAC and regularizing card1.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1347
prove card1_suc_r: {*
4da714704611
A number of lemmas for REGULARIZE_TAC and regularizing card1.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1348
Logic.mk_implies
106
+ − 1349
((prop_of card1_suc_f),
+ − 1350
(regularise (prop_of card1_suc_f) @{typ "'a List.list"} @{term "op \<approx>"} @{context})) *}
104
+ − 1351
apply (simp add: equiv_res_forall[OF equiv_list_eq] equiv_res_exists[OF equiv_list_eq])
96
4da714704611
A number of lemmas for REGULARIZE_TAC and regularizing card1.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1352
done
4da714704611
A number of lemmas for REGULARIZE_TAC and regularizing card1.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1353
106
+ − 1354
ML {* @{thm card1_suc_r} OF [card1_suc_f] *}
96
4da714704611
A number of lemmas for REGULARIZE_TAC and regularizing card1.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1355
97
+ − 1356
ML {* val li = Thm.freezeT (atomize_thm @{thm fold1.simps(2)}) *}
+ − 1357
prove fold1_def_2_r: {*
+ − 1358
Logic.mk_implies
+ − 1359
((prop_of li),
+ − 1360
(regularise (prop_of li) @{typ "'a List.list"} @{term "op \<approx>"} @{context})) *}
+ − 1361
apply (simp add: equiv_res_forall[OF equiv_list_eq])
+ − 1362
done
+ − 1363
+ − 1364
ML {* @{thm fold1_def_2_r} OF [li] *}
+ − 1365
29
+ − 1366
ML {*
49
+ − 1367
fun lift_theorem_fset_aux thm lthy =
+ − 1368
let
+ − 1369
val ((_, [novars]), lthy2) = Variable.import true [thm] lthy;
111
+ − 1370
val goal = build_goal @{context} novars consts @{typ "'a list"} @{typ "'a fset"};
49
+ − 1371
val cgoal = cterm_of @{theory} goal;
+ − 1372
val cgoal2 = Thm.rhs_of (MetaSimplifier.rewrite true fset_defs_sym cgoal);
106
+ − 1373
val tac = transconv_fset_tac' @{context};
49
+ − 1374
val cthm = Goal.prove_internal [] cgoal2 (fn _ => tac);
+ − 1375
val nthm = MetaSimplifier.rewrite_rule [symmetric cthm] (snd (no_vars (Context.Theory @{theory}, thm)))
+ − 1376
val nthm2 = MetaSimplifier.rewrite_rule @{thms QUOT_TYPE_I_fset.REPS_same QUOT_TYPE_I_fset.thm10} nthm;
+ − 1377
val [nthm3] = ProofContext.export lthy2 lthy [nthm2]
+ − 1378
in
+ − 1379
nthm3
+ − 1380
end
+ − 1381
*}
+ − 1382
+ − 1383
ML {* lift_theorem_fset_aux @{thm m1} @{context} *}
+ − 1384
+ − 1385
ML {*
+ − 1386
fun lift_theorem_fset name thm lthy =
+ − 1387
let
+ − 1388
val lifted_thm = lift_theorem_fset_aux thm lthy;
88
+ − 1389
val (_, lthy2) = note (name, lifted_thm) lthy;
49
+ − 1390
in
+ − 1391
lthy2
+ − 1392
end;
+ − 1393
*}
+ − 1394
+ − 1395
local_setup {* lift_theorem_fset @{binding "m1_lift"} @{thm m1} *}
+ − 1396
local_setup {* lift_theorem_fset @{binding "leqi4_lift"} @{thm list_eq.intros(4)} *}
+ − 1397
local_setup {* lift_theorem_fset @{binding "leqi5_lift"} @{thm list_eq.intros(5)} *}
+ − 1398
local_setup {* lift_theorem_fset @{binding "m2_lift"} @{thm m2} *}
+ − 1399
thm m1_lift
+ − 1400
thm leqi4_lift
+ − 1401
thm leqi5_lift
+ − 1402
thm m2_lift
106
+ − 1403
ML {* @{thm card1_suc_r} OF [card1_suc_f] *}
+ − 1404
(*ML {* Toplevel.program (fn () => lift_theorem_fset @{binding "card_suc"}
+ − 1405
(@{thm card1_suc_r} OF [card1_suc_f]) @{context}) *}*)
+ − 1406
(*local_setup {* lift_theorem_fset @{binding "card_suc"} @{thm card1_suc} *}*)
49
+ − 1407
+ − 1408
thm leqi4_lift
+ − 1409
ML {*
62
+ − 1410
val (nam, typ) = hd (Term.add_vars (prop_of @{thm leqi4_lift}) [])
49
+ − 1411
val (_, l) = dest_Type typ
+ − 1412
val t = Type ("QuotMain.fset", l)
+ − 1413
val v = Var (nam, t)
+ − 1414
val cv = cterm_of @{theory} ((term_of @{cpat "REP_fset"}) $ v)
+ − 1415
*}
+ − 1416
+ − 1417
ML {*
+ − 1418
Toplevel.program (fn () =>
+ − 1419
MetaSimplifier.rewrite_rule @{thms QUOT_TYPE_I_fset.thm10} (
+ − 1420
Drule.instantiate' [] [NONE, SOME (cv)] @{thm leqi4_lift}
+ − 1421
)
+ − 1422
)
+ − 1423
*}
+ − 1424
77
+ − 1425
lemma "(Ball (Respects ((op \<approx>) ===> (op =)))
72
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1426
(((REP_fset ---> id) ---> id)
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1427
(((ABS_fset ---> id) ---> id)
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1428
(\<lambda>P.
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1429
(ABS_fset ---> id) ((REP_fset ---> id) P)
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1430
(REP_fset (ABS_fset [])) \<and>
77
+ − 1431
Ball (Respects (op \<approx>))
72
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1432
((ABS_fset ---> id)
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1433
((REP_fset ---> id)
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1434
(\<lambda>t.
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1435
((ABS_fset ---> id)
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1436
((REP_fset ---> id) P)
73
+ − 1437
(REP_fset (ABS_fset t))) \<longrightarrow>
72
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1438
(!h.
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1439
(ABS_fset ---> id)
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1440
((REP_fset ---> id) P)
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1441
(REP_fset
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1442
(ABS_fset
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1443
(h #
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1444
REP_fset
73
+ − 1445
(ABS_fset t)))))))) \<longrightarrow>
77
+ − 1446
Ball (Respects (op \<approx>))
72
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1447
((ABS_fset ---> id)
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1448
((REP_fset ---> id)
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1449
(\<lambda>l.
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1450
(ABS_fset ---> id)
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1451
((REP_fset ---> id) P)
74
+ − 1452
(REP_fset (ABS_fset l)))))))))
+ − 1453
77
+ − 1454
= Ball (Respects ((op \<approx>) ===> (op =)))
+ − 1455
(\<lambda>P. ((P []) \<and> (Ball (Respects (op \<approx>)) (\<lambda>t. P t \<longrightarrow> (\<forall>h. (P (h # t)))))) \<longrightarrow>
+ − 1456
(Ball (Respects (op \<approx>)) (\<lambda>l. P l)))"
112
+ − 1457
+ − 1458
thm APPLY_RSP[of "op \<approx> ===> (op = ===> op =)" "REP_fset ---> (id ---> id)" "ABS_fset ---> (id ---> id)" "op =" "id" "id"]
+ − 1459
proof -
+ − 1460
note APPLY_RSP_I = APPLY_RSP[of "op \<approx> ===> (op = ===> op =)" "REP_fset ---> (id ---> id)" "ABS_fset ---> (id ---> id)" "op =" "id" "id"]
+ − 1461
show ?thesis apply -
+ − 1462
+ − 1463
+ − 1464
ML_prf {*
+ − 1465
val gc = Subgoal.focus @{context} 1 (Isar.goal ())
+ − 1466
|> fst
+ − 1467
|> #concl
+ − 1468
val tc = cterm_of @{theory} (concl_of ( @{thm "APPLY_RSP" }))
+ − 1469
val (_, tc') = Thm.dest_comb tc
+ − 1470
val (_, gc') = Thm.dest_comb gc
+ − 1471
*}
+ − 1472
+ − 1473
+ − 1474
+ − 1475
+ − 1476
ML_prf {*
+ − 1477
(gc', tc')
+ − 1478
*}
+ − 1479
ML_prf {* Pattern.first_order_match *}
+ − 1480
ML_prf {* Thm.match (@{cpat "?P::?'a"}, @{cterm "1::nat"}) *}
+ − 1481
ML_prf {* Pattern.match @{theory} (term_of @{cpat "?P::nat"}, term_of @{cterm "1::nat"}) (Vartab.empty, Vartab.empty) *}
+ − 1482
+ − 1483
ML_prf {* val (op1, (l1, r1)) = dest_cbinop tc' *}
+ − 1484
ML_prf {* val (op2, (l2, r2)) = dest_cbinop gc' *}
+ − 1485
+ − 1486
ML_prf {* val mo = Thm.match (op1, op2) *}
+ − 1487
ML_prf {* val t1 = Drule.instantiate mo @{thm "APPLY_RSP" } *}
+ − 1488
ML_prf {* val tc = cterm_of @{theory} (concl_of t1) *}
+ − 1489
ML_prf {* val (_, tc') = Thm.dest_comb tc *}
+ − 1490
ML_prf {* val (op1, (l1, r1)) = dest_cbinop tc' *}
+ − 1491
ML_prf {* val (mlty, mlt) = Thm.match (l1, l2) *}
+ − 1492
ML_prf {* val t2 = Drule.instantiate (mlty, []) t1 *}
+ − 1493
ML_prf {* val tc = cterm_of @{theory} (concl_of t2) *}
+ − 1494
ML_prf {* val (_, tc') = Thm.dest_comb tc *}
+ − 1495
ML_prf {* val (op1, (l1, r1)) = dest_cbinop tc' *}
+ − 1496
ML_prf {* val mr = Thm.match (r1, r2) *}
+ − 1497
+ − 1498
ML_prf {* val t3 = Drule.instantiate ml t2 *}
+ − 1499
ML_prf {* val tc = cterm_of @{theory} (concl_of t3) *}
+ − 1500
ML_prf {* val (_, tc') = Thm.dest_comb tc *}
+ − 1501
+ − 1502
+ − 1503
+ − 1504
ML_prf {* mtyl; mtyr *}
+ − 1505
+ − 1506
ML_prf {* val ol1 = Thm.capply op1 l1 *}
+ − 1507
ML_prf {* val ol2 = Thm.capply op2 l2 *}
+ − 1508
ML_prf {* (ol1, ol2); Thm.match (ol1, ol2) *}
+ − 1509
ML_prf {* val w1 = Thm.capply ol1 r1 *}
+ − 1510
ML_prf {* val w2 = Thm.capply ol2 r2 *}
+ − 1511
+ − 1512
+ − 1513
.
+ − 1514
(*ML_prf {* (w1, w2); Thm.match (w1, w2) *}*)
+ − 1515
+ − 1516
+ − 1517
+ − 1518
ML_prf {*
+ − 1519
(tc', gc')
+ − 1520
*}
+ − 1521
95
+ − 1522
thm APPLY_RSP
112
+ − 1523
thm APPLY_RSP[of "op \<approx> ===> (op = ===> op =)"]
+ − 1524
term "(op \<approx> ===> op =) ===> op ="
+ − 1525
proof -
+ − 1526
note APPLY_RSP_I2 = APPLY_RSP[of "(op \<approx> ===> op =) ===> op =" "(ABS_fset ---> id) ---> id" "(REP_fset ---> id) ---> id" "op =" "id" "id" "Ball (Respects op \<approx> ===> op =)" "Ball (Respects op \<approx> ===> op =)"]
+ − 1527
show ?thesis apply -
+ − 1528
+ − 1529
thm APPLY_RSP_I2[of _ "\<lambda>P. (P [] \<and> (\<forall>t\<Colon>'b list\<in>Respects op \<approx>. P t \<longrightarrow> (\<forall>h\<Colon>'b. P (h # t))) \<longrightarrow>
+ − 1530
(\<forall>l\<Colon>'b list\<in>Respects op \<approx>. P l))"]
+ − 1531
proof -
+ − 1532
note APPLY_RSP_I3=APPLY_RSP_I2[of _ "\<lambda>P. (P [] \<and> (\<forall>t\<Colon>'b list\<in>Respects op \<approx>. P t \<longrightarrow> (\<forall>h\<Colon>'b. P (h # t))) \<longrightarrow>
+ − 1533
(\<forall>l\<Colon>'b list\<in>Respects op \<approx>. P l))"]
+ − 1534
show ?thesis apply -
+ − 1535
term "(REP_fset ---> id ---> id
+ − 1536
(ABS_fset ---> id ---> id
+ − 1537
(\<lambda>P\<Colon>'a list \<Rightarrow> bool.
+ − 1538
ABS_fset ---> id (REP_fset ---> id P)
+ − 1539
(REP_fset (ABS_fset [])) \<and>
+ − 1540
Ball (Respects op \<approx>)
+ − 1541
(ABS_fset ---> id
+ − 1542
(REP_fset ---> id
+ − 1543
(\<lambda>t\<Colon>'a list.
+ − 1544
ABS_fset ---> id (REP_fset ---> id P)
+ − 1545
(REP_fset (ABS_fset t)) \<longrightarrow>
+ − 1546
(\<forall>h\<Colon>'a.
+ − 1547
ABS_fset ---> id (REP_fset ---> id P)
+ − 1548
(REP_fset
+ − 1549
(ABS_fset
+ − 1550
(h # REP_fset (ABS_fset t)))))))) \<longrightarrow>
+ − 1551
Ball (Respects op \<approx>)
+ − 1552
(ABS_fset ---> id
+ − 1553
(REP_fset ---> id
+ − 1554
(\<lambda>l\<Colon>'a list.
+ − 1555
ABS_fset ---> id (REP_fset ---> id P)
+ − 1556
(REP_fset (ABS_fset l))))))))"
+ − 1557
+ − 1558
apply (rule APPLY_RSP_I3)
+ − 1559
term "Ball (Respects op \<approx> ===> op =)"
+ − 1560
thm APPLY_RSP_I [of _ "Ball (Respects op \<approx> ===> op =)"]
+ − 1561
+ − 1562
thm APPLY_RSP
+ − 1563
+ − 1564
.
+ − 1565
+ − 1566
apply (tactic {* Cong_Tac.cong_tac @{thm APPLY_RSP_I} 1 *} )
+ − 1567
+ − 1568
apply (tactic {* match_tac @{thms APPLY_RSP_I} 1 *})
+ − 1569
.
+ − 1570
111
+ − 1571
apply (rule APPLY_RSP[of "op \<approx> ===> (op = ===> op =)" "REP_fset ---> (id ---> id)" "ABS_fset ---> (id ---> id)" "op =" "id" "id"])
95
+ − 1572
apply (rule APPLY_RSP[of "op \<approx> ===> (op = ===> op =)" _ _ "op ="])
74
+ − 1573
term "(\<forall>P. (((P []) \<and> (\<forall>t. (P t \<longrightarrow> (\<forall>h. P (h # t))))) \<longrightarrow> (\<forall>l. (P l))))"
73
+ − 1574
thm LAMBDA_PRS1[symmetric]
+ − 1575
(*apply (simp only:LAMBDA_PRS1[symmetric] FUN_QUOTIENT IDENTITY_QUOTIENT QUOT_TYPE_I_fset.QUOTIENT)*)
77
+ − 1576
apply (unfold Ball_def)
74
+ − 1577
apply (simp only: IN_RESPECTS)
+ − 1578
apply (simp only:list_eq_refl)
72
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1579
apply (unfold id_def)
74
+ − 1580
(*apply (simp only: FUN_MAP_I)*)
+ − 1581
apply (simp)
+ − 1582
apply (simp only: QUOT_TYPE_I_fset.thm10)
+ − 1583
..
73
+ − 1584
apply (simp add:IN_RESPECTS)
74
+ − 1585
73
+ − 1586
+ − 1587
+ − 1588
+ − 1589
apply (simp add: QUOT_TYPE_I_fset.R_trans2)
+ − 1590
+ − 1591
apply (rule ext)
+ − 1592
apply (simp add:QUOT_TYPE_I_fset.REP_ABS_rsp)
+ − 1593
apply (tactic {* Cong_Tac.cong_tac @{thm cong} 1 *} )
+ − 1594
apply (simp add:cons_preserves)
+ − 1595
+ − 1596
72
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1597
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1598
(*prove aaa: {* (Thm.term_of cgoal2) *}
45
+ − 1599
apply (tactic {* LocalDefs.unfold_tac @{context} fset_defs *} )
58
f2565006dc5a
Just one atomize is enough for the currently lifted theorems. Properly lift 'all' and 'Ex'.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1600
apply (atomize(full))
101
+ − 1601
apply (tactic {* transconv_fset_tac' @{context} 1 *})
72
4efc9e6661a4
Testing if I can prove the regularized version of induction manually
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 1602
done*)
29
+ − 1603
18
+ − 1604
(*
+ − 1605
datatype obj1 =
+ − 1606
OVAR1 "string"
+ − 1607
| OBJ1 "(string * (string \<Rightarrow> obj1)) list"
+ − 1608
| INVOKE1 "obj1 \<Rightarrow> string"
+ − 1609
| UPDATE1 "obj1 \<Rightarrow> string \<Rightarrow> (string \<Rightarrow> obj1)"
+ − 1610
*)
53
+ − 1611
57
+ − 1612
end
112
+ − 1613