919
+ − 1
(* Title: QuotMain.thy
759
+ − 2
Author: Cezary Kaliszyk and Christian Urban
+ − 3
*)
+ − 4
597
+ − 5
theory QuotMain
920
+ − 6
imports QuotBase
597
+ − 7
uses ("quotient_info.ML")
725
+ − 8
("quotient_typ.ML")
597
+ − 9
("quotient_def.ML")
758
+ − 10
("quotient_term.ML")
+ − 11
("quotient_tacs.ML")
597
+ − 12
begin
+ − 13
781
+ − 14
locale Quot_Type =
597
+ − 15
fixes R :: "'a \<Rightarrow> 'a \<Rightarrow> bool"
+ − 16
and Abs :: "('a \<Rightarrow> bool) \<Rightarrow> 'b"
+ − 17
and Rep :: "'b \<Rightarrow> ('a \<Rightarrow> bool)"
+ − 18
assumes equivp: "equivp R"
+ − 19
and rep_prop: "\<And>y. \<exists>x. Rep y = R x"
+ − 20
and rep_inverse: "\<And>x. Abs (Rep x) = x"
+ − 21
and abs_inverse: "\<And>x. (Rep (Abs (R x))) = (R x)"
+ − 22
and rep_inject: "\<And>x y. (Rep x = Rep y) = (x = y)"
+ − 23
begin
+ − 24
+ − 25
definition
719
+ − 26
abs::"'a \<Rightarrow> 'b"
597
+ − 27
where
719
+ − 28
"abs x \<equiv> Abs (R x)"
597
+ − 29
+ − 30
definition
719
+ − 31
rep::"'b \<Rightarrow> 'a"
597
+ − 32
where
719
+ − 33
"rep a = Eps (Rep a)"
597
+ − 34
919
+ − 35
text {*
+ − 36
The naming of the lemmas follows the quotient paper
+ − 37
by Peter Homeier.
+ − 38
*}
+ − 39
597
+ − 40
lemma lem9:
+ − 41
shows "R (Eps (R x)) = R x"
+ − 42
proof -
+ − 43
have a: "R x x" using equivp by (simp add: equivp_reflp_symp_transp reflp_def)
+ − 44
then have "R x (Eps (R x))" by (rule someI)
+ − 45
then show "R (Eps (R x)) = R x"
+ − 46
using equivp unfolding equivp_def by simp
+ − 47
qed
+ − 48
+ − 49
theorem thm10:
930
68c1f378a70a
All eq_reflections apart from the one of 'id_apply' can be removed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 50
shows "abs (rep a) = a"
719
+ − 51
unfolding abs_def rep_def
597
+ − 52
proof -
+ − 53
from rep_prop
+ − 54
obtain x where eq: "Rep a = R x" by auto
+ − 55
have "Abs (R (Eps (Rep a))) = Abs (R (Eps (R x)))" using eq by simp
+ − 56
also have "\<dots> = Abs (R x)" using lem9 by simp
+ − 57
also have "\<dots> = Abs (Rep a)" using eq by simp
+ − 58
also have "\<dots> = a" using rep_inverse by simp
+ − 59
finally
+ − 60
show "Abs (R (Eps (Rep a))) = a" by simp
+ − 61
qed
+ − 62
+ − 63
lemma lem7:
919
+ − 64
shows "(R x = R y) = (Abs (R x) = Abs (R y))" (is "?LHS = ?RHS")
+ − 65
proof -
+ − 66
have "?RHS = (Rep (Abs (R x)) = Rep (Abs (R y)))" by (simp add: rep_inject)
+ − 67
also have "\<dots> = ?LHS" by (simp add: abs_inverse)
+ − 68
finally show "?LHS = ?RHS" by simp
+ − 69
qed
597
+ − 70
+ − 71
theorem thm11:
719
+ − 72
shows "R r r' = (abs r = abs r')"
1116
+ − 73
unfolding abs_def
+ − 74
by (simp only: equivp[simplified equivp_def] lem7)
597
+ − 75
920
+ − 76
lemma rep_refl:
+ − 77
shows "R (rep a) (rep a)"
1116
+ − 78
unfolding rep_def
+ − 79
by (simp add: equivp[simplified equivp_def])
920
+ − 80
+ − 81
719
+ − 82
lemma rep_abs_rsp:
+ − 83
shows "R f (rep (abs g)) = R f g"
+ − 84
and "R (rep (abs g)) f = R g f"
1116
+ − 85
by (simp_all add: thm10 thm11)
597
+ − 86
+ − 87
lemma Quotient:
773
d6acae26d027
tuned comments; renamed QUOT_TRUE to Quot_True; atomize_eqv seems to not be neccessary (has it been added to Isabelle)...it is now comented out and everything still works
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 88
shows "Quotient R abs rep"
1116
+ − 89
unfolding Quotient_def
+ − 90
apply(simp add: thm10)
+ − 91
apply(simp add: rep_refl)
+ − 92
apply(subst thm11[symmetric])
+ − 93
apply(simp add: equivp[simplified equivp_def])
+ − 94
done
597
+ − 95
+ − 96
end
+ − 97
773
d6acae26d027
tuned comments; renamed QUOT_TRUE to Quot_True; atomize_eqv seems to not be neccessary (has it been added to Isabelle)...it is now comented out and everything still works
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 98
section {* ML setup *}
d6acae26d027
tuned comments; renamed QUOT_TRUE to Quot_True; atomize_eqv seems to not be neccessary (has it been added to Isabelle)...it is now comented out and everything still works
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 99
919
+ − 100
text {* Auxiliary data for the quotient package *}
869
ce5f78f0eac5
Finished organising an efficient datastructure for qconst_info.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 101
597
+ − 102
use "quotient_info.ML"
+ − 103
+ − 104
declare [[map "fun" = (fun_map, fun_rel)]]
615
386a6b1a5203
the lift_tac produces a warning message if one of the three automatic proofs fails
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 105
909
+ − 106
lemmas [quot_thm] = fun_quotient
911
+ − 107
lemmas [quot_respect] = quot_rel_rsp
648
830b58c2fa94
decoupled QuotProd from QuotMain and also started new cleaning strategy
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 108
lemmas [quot_equiv] = identity_equivp
597
+ − 109
919
+ − 110
+ − 111
text {* Lemmas about simplifying id's. *}
773
d6acae26d027
tuned comments; renamed QUOT_TRUE to Quot_True; atomize_eqv seems to not be neccessary (has it been added to Isabelle)...it is now comented out and everything still works
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 112
lemmas [id_simps] =
925
+ − 113
id_def[symmetric]
930
68c1f378a70a
All eq_reflections apart from the one of 'id_apply' can be removed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 114
fun_map_id
939
ce774af6b964
Changed the lambda_prs_simple_conv to use id_apply, now last eq_reflection can be removed from id_simps.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 115
id_apply
930
68c1f378a70a
All eq_reflections apart from the one of 'id_apply' can be removed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 116
id_o
68c1f378a70a
All eq_reflections apart from the one of 'id_apply' can be removed.
Cezary Kaliszyk <kaliszyk@in.tum.de>
diff
changeset
+ − 117
o_id
825
+ − 118
eq_comp_r
774
b4ffb8826105
moved get_fun into quotient_term; this simplifies the overall including structure of the package
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 119
919
+ − 120
text {* Translation functions for the lifting process. *}
774
b4ffb8826105
moved get_fun into quotient_term; this simplifies the overall including structure of the package
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 121
use "quotient_term.ML"
b4ffb8826105
moved get_fun into quotient_term; this simplifies the overall including structure of the package
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 122
b4ffb8826105
moved get_fun into quotient_term; this simplifies the overall including structure of the package
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 123
919
+ − 124
text {* Definitions of the quotient types. *}
725
+ − 125
use "quotient_typ.ML"
597
+ − 126
773
d6acae26d027
tuned comments; renamed QUOT_TRUE to Quot_True; atomize_eqv seems to not be neccessary (has it been added to Isabelle)...it is now comented out and everything still works
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 127
919
+ − 128
text {* Definitions for quotient constants. *}
597
+ − 129
use "quotient_def.ML"
+ − 130
759
+ − 131
919
+ − 132
text {*
+ − 133
An auxiliar constant for recording some information
+ − 134
about the lifted theorem in a tactic.
+ − 135
*}
758
+ − 136
definition
773
d6acae26d027
tuned comments; renamed QUOT_TRUE to Quot_True; atomize_eqv seems to not be neccessary (has it been added to Isabelle)...it is now comented out and everything still works
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 137
"Quot_True x \<equiv> True"
605
120e479ed367
first attempt to deal with Babs in regularise and cleaning (not yet working)
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 138
773
d6acae26d027
tuned comments; renamed QUOT_TRUE to Quot_True; atomize_eqv seems to not be neccessary (has it been added to Isabelle)...it is now comented out and everything still works
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 139
lemma
d6acae26d027
tuned comments; renamed QUOT_TRUE to Quot_True; atomize_eqv seems to not be neccessary (has it been added to Isabelle)...it is now comented out and everything still works
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 140
shows QT_all: "Quot_True (All P) \<Longrightarrow> Quot_True P"
d6acae26d027
tuned comments; renamed QUOT_TRUE to Quot_True; atomize_eqv seems to not be neccessary (has it been added to Isabelle)...it is now comented out and everything still works
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 141
and QT_ex: "Quot_True (Ex P) \<Longrightarrow> Quot_True P"
907
+ − 142
and QT_ex1: "Quot_True (Ex1 P) \<Longrightarrow> Quot_True P"
1113
+ − 143
and QT_lam: "Quot_True (\<lambda>x. P x) \<Longrightarrow> (\<And>x. Quot_True (P x))"
773
d6acae26d027
tuned comments; renamed QUOT_TRUE to Quot_True; atomize_eqv seems to not be neccessary (has it been added to Isabelle)...it is now comented out and everything still works
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 144
and QT_ext: "(\<And>x. Quot_True (a x) \<Longrightarrow> f x = g x) \<Longrightarrow> (Quot_True a \<Longrightarrow> f = g)"
1116
+ − 145
by (simp_all add: Quot_True_def ext)
751
+ − 146
773
d6acae26d027
tuned comments; renamed QUOT_TRUE to Quot_True; atomize_eqv seems to not be neccessary (has it been added to Isabelle)...it is now comented out and everything still works
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 147
lemma QT_imp: "Quot_True a \<equiv> Quot_True b"
1116
+ − 148
by (simp add: Quot_True_def)
751
+ − 149
919
+ − 150
text {* Tactics for proving the lifted theorems *}
758
+ − 151
use "quotient_tacs.ML"
751
+ − 152
689
+ − 153
section {* Methods / Interface *}
+ − 154
632
+ − 155
ML {*
896
4e0b89d886ac
liftin and lifing_tac can now lift several "and"-separated goals at once; the raw-theorems have to be given in the order of goals
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 156
fun mk_method1 tac thms ctxt =
4e0b89d886ac
liftin and lifing_tac can now lift several "and"-separated goals at once; the raw-theorems have to be given in the order of goals
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 157
SIMPLE_METHOD (HEADGOAL (tac ctxt thms))
632
+ − 158
+ − 159
fun mk_method2 tac ctxt =
+ − 160
SIMPLE_METHOD (HEADGOAL (tac ctxt))
+ − 161
*}
+ − 162
+ − 163
method_setup lifting =
896
4e0b89d886ac
liftin and lifing_tac can now lift several "and"-separated goals at once; the raw-theorems have to be given in the order of goals
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 164
{* Attrib.thms >> (mk_method1 Quotient_Tacs.lift_tac) *}
632
+ − 165
{* Lifting of theorems to quotient types. *}
+ − 166
+ − 167
method_setup lifting_setup =
758
+ − 168
{* Attrib.thm >> (mk_method1 Quotient_Tacs.procedure_tac) *}
632
+ − 169
{* Sets up the three goals for the lifting procedure. *}
+ − 170
+ − 171
method_setup regularize =
1113
+ − 172
{* Scan.succeed (mk_method2 Quotient_Tacs.regularize_tac) *}
632
+ − 173
{* Proves automatically the regularization goals from the lifting procedure. *}
+ − 174
+ − 175
method_setup injection =
773
d6acae26d027
tuned comments; renamed QUOT_TRUE to Quot_True; atomize_eqv seems to not be neccessary (has it been added to Isabelle)...it is now comented out and everything still works
Christian Urban <urbanc@in.tum.de>
diff
changeset
+ − 176
{* Scan.succeed (mk_method2 Quotient_Tacs.all_injection_tac) *}
632
+ − 177
{* Proves automatically the rep/abs injection goals from the lifting procedure. *}
+ − 178
+ − 179
method_setup cleaning =
758
+ − 180
{* Scan.succeed (mk_method2 Quotient_Tacs.clean_tac) *}
632
+ − 181
{* Proves automatically the cleaning goals from the lifting procedure. *}
+ − 182
1068
+ − 183
attribute_setup quot_lifted =
1077
+ − 184
{* Scan.succeed Quotient_Tacs.lifted_attrib *}
1068
+ − 185
{* Lifting of theorems to quotient types. *}
+ − 186
597
+ − 187
end
+ − 188