author | Cezary Kaliszyk <kaliszyk@in.tum.de> |
Mon, 15 Feb 2010 12:23:02 +0100 | |
changeset 1145 | 593365d61ecc |
parent 1144 | 538daee762e6 |
child 1146 | 2e5303b7dde4 |
permissions | -rw-r--r-- |
952
9c3b3eaecaff
use of equiv_relation_chk in quotient_term
Christian Urban <urbanc@in.tum.de>
parents:
884
diff
changeset
|
1 |
(* Title: quotient_def.thy |
9c3b3eaecaff
use of equiv_relation_chk in quotient_term
Christian Urban <urbanc@in.tum.de>
parents:
884
diff
changeset
|
2 |
Author: Cezary Kaliszyk and Christian Urban |
9c3b3eaecaff
use of equiv_relation_chk in quotient_term
Christian Urban <urbanc@in.tum.de>
parents:
884
diff
changeset
|
3 |
|
9c3b3eaecaff
use of equiv_relation_chk in quotient_term
Christian Urban <urbanc@in.tum.de>
parents:
884
diff
changeset
|
4 |
Definitions for constants on quotient types. |
9c3b3eaecaff
use of equiv_relation_chk in quotient_term
Christian Urban <urbanc@in.tum.de>
parents:
884
diff
changeset
|
5 |
|
9c3b3eaecaff
use of equiv_relation_chk in quotient_term
Christian Urban <urbanc@in.tum.de>
parents:
884
diff
changeset
|
6 |
*) |
277
37636f2b1c19
separated the quotient_def into a separate file
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
7 |
|
37636f2b1c19
separated the quotient_def into a separate file
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
8 |
signature QUOTIENT_DEF = |
1128
17ca92ab4660
Main renaming + fixes for new Isabelle in IntEx2.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1114
diff
changeset
|
9 |
sig |
1145
593365d61ecc
Passing the binding to quotient_def
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1144
diff
changeset
|
10 |
val quotient_def: (Attrib.binding * mixfix) option * (Attrib.binding * (term * term)) -> |
775 | 11 |
local_theory -> (term * thm) * local_theory |
789 | 12 |
|
1144
538daee762e6
Added a binding to the parser.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1142
diff
changeset
|
13 |
val quotdef_cmd: (Attrib.binding * mixfix) option * (Attrib.binding * (string * string)) -> |
277
37636f2b1c19
separated the quotient_def into a separate file
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
14 |
local_theory -> local_theory |
37636f2b1c19
separated the quotient_def into a separate file
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
15 |
end; |
37636f2b1c19
separated the quotient_def into a separate file
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
16 |
|
37636f2b1c19
separated the quotient_def into a separate file
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
17 |
structure Quotient_Def: QUOTIENT_DEF = |
37636f2b1c19
separated the quotient_def into a separate file
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
18 |
struct |
37636f2b1c19
separated the quotient_def into a separate file
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
19 |
|
762
baac4639ecef
avoided global "open"s - replaced by local "open"s
Christian Urban <urbanc@in.tum.de>
parents:
760
diff
changeset
|
20 |
open Quotient_Info; |
774
b4ffb8826105
moved get_fun into quotient_term; this simplifies the overall including structure of the package
Christian Urban <urbanc@in.tum.de>
parents:
768
diff
changeset
|
21 |
open Quotient_Term; |
762
baac4639ecef
avoided global "open"s - replaced by local "open"s
Christian Urban <urbanc@in.tum.de>
parents:
760
diff
changeset
|
22 |
|
884
e49c6b6f37f4
tuned quotient_def.ML and cleaned somewhat LamEx.thy
Christian Urban <urbanc@in.tum.de>
parents:
869
diff
changeset
|
23 |
(** Interface and Syntax Setup **) |
850 | 24 |
|
1128
17ca92ab4660
Main renaming + fixes for new Isabelle in IntEx2.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1114
diff
changeset
|
25 |
(* The ML-interface for a quotient definition takes |
884
e49c6b6f37f4
tuned quotient_def.ML and cleaned somewhat LamEx.thy
Christian Urban <urbanc@in.tum.de>
parents:
869
diff
changeset
|
26 |
as argument: |
709 | 27 |
|
884
e49c6b6f37f4
tuned quotient_def.ML and cleaned somewhat LamEx.thy
Christian Urban <urbanc@in.tum.de>
parents:
869
diff
changeset
|
28 |
- the mixfix annotation |
e49c6b6f37f4
tuned quotient_def.ML and cleaned somewhat LamEx.thy
Christian Urban <urbanc@in.tum.de>
parents:
869
diff
changeset
|
29 |
- name and attributes |
e49c6b6f37f4
tuned quotient_def.ML and cleaned somewhat LamEx.thy
Christian Urban <urbanc@in.tum.de>
parents:
869
diff
changeset
|
30 |
- the new constant as term |
e49c6b6f37f4
tuned quotient_def.ML and cleaned somewhat LamEx.thy
Christian Urban <urbanc@in.tum.de>
parents:
869
diff
changeset
|
31 |
- the rhs of the definition as term |
850 | 32 |
|
884
e49c6b6f37f4
tuned quotient_def.ML and cleaned somewhat LamEx.thy
Christian Urban <urbanc@in.tum.de>
parents:
869
diff
changeset
|
33 |
It returns the defined constant and its definition |
1128
17ca92ab4660
Main renaming + fixes for new Isabelle in IntEx2.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1114
diff
changeset
|
34 |
theorem; stores the data in the qconsts data slot. |
884
e49c6b6f37f4
tuned quotient_def.ML and cleaned somewhat LamEx.thy
Christian Urban <urbanc@in.tum.de>
parents:
869
diff
changeset
|
35 |
|
e49c6b6f37f4
tuned quotient_def.ML and cleaned somewhat LamEx.thy
Christian Urban <urbanc@in.tum.de>
parents:
869
diff
changeset
|
36 |
Restriction: At the moment the right-hand side must |
1128
17ca92ab4660
Main renaming + fixes for new Isabelle in IntEx2.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1114
diff
changeset
|
37 |
be a terms composed of constant. Similarly the |
17ca92ab4660
Main renaming + fixes for new Isabelle in IntEx2.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1114
diff
changeset
|
38 |
left-hand side must be a single constant. |
858 | 39 |
*) |
1145
593365d61ecc
Passing the binding to quotient_def
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1144
diff
changeset
|
40 |
fun quotient_def (bindmx, (attr, (lhs, rhs))) lthy = |
293
653460d3e849
tuned the code in quotient and quotient_def
Christian Urban <urbanc@in.tum.de>
parents:
290
diff
changeset
|
41 |
let |
1145
593365d61ecc
Passing the binding to quotient_def
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1144
diff
changeset
|
42 |
val mx = |
593365d61ecc
Passing the binding to quotient_def
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1144
diff
changeset
|
43 |
case bindmx of |
593365d61ecc
Passing the binding to quotient_def
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1144
diff
changeset
|
44 |
SOME (_, mx) => mx |
593365d61ecc
Passing the binding to quotient_def
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1144
diff
changeset
|
45 |
| _ => NoSyn |
884
e49c6b6f37f4
tuned quotient_def.ML and cleaned somewhat LamEx.thy
Christian Urban <urbanc@in.tum.de>
parents:
869
diff
changeset
|
46 |
val (lhs_str, lhs_ty) = dest_Free lhs handle TERM _ => error "Constant already defined." |
e49c6b6f37f4
tuned quotient_def.ML and cleaned somewhat LamEx.thy
Christian Urban <urbanc@in.tum.de>
parents:
869
diff
changeset
|
47 |
val _ = if null (strip_abs_vars rhs) then () else error "The definiens cannot be an abstraction" |
e49c6b6f37f4
tuned quotient_def.ML and cleaned somewhat LamEx.thy
Christian Urban <urbanc@in.tum.de>
parents:
869
diff
changeset
|
48 |
|
e49c6b6f37f4
tuned quotient_def.ML and cleaned somewhat LamEx.thy
Christian Urban <urbanc@in.tum.de>
parents:
869
diff
changeset
|
49 |
val qconst_bname = Binding.name lhs_str |
1097
551eacf071d7
More indentation, names and todo cleaning in the quotient package
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
952
diff
changeset
|
50 |
val absrep_trm = absrep_fun AbsF lthy (fastype_of rhs, lhs_ty) $ rhs |
854
5961edda27d7
absrep_fun and equiv_relation do not produce anymore spurious maps; two problems arose in IntEx, which are marked with "INJECTION PROBLEM"
Christian Urban <urbanc@in.tum.de>
parents:
833
diff
changeset
|
51 |
val prop = Logic.mk_equals (lhs, Syntax.check_term lthy absrep_trm) |
663
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
598
diff
changeset
|
52 |
val (_, prop') = LocalDefs.cert_def lthy prop |
0dd10a900cae
Different syntax for definitions that allows overloading and retrieving of definitions by matching whole constants.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
598
diff
changeset
|
53 |
val (_, newrhs) = Primitive_Defs.abs_def prop' |
310
fec6301a1989
added a container for quotient constants (does not work yet though)
Christian Urban <urbanc@in.tum.de>
parents:
307
diff
changeset
|
54 |
|
1142
b102e1444851
remove one-line wrapper.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1141
diff
changeset
|
55 |
val ((trm, (_ , thm)), lthy') = Local_Theory.define ((qconst_bname, mx), (attr, newrhs)) lthy |
310
fec6301a1989
added a container for quotient constants (does not work yet though)
Christian Urban <urbanc@in.tum.de>
parents:
307
diff
changeset
|
56 |
|
800 | 57 |
(* data storage *) |
799
0755f8fd56b3
renamed transfer to transform (Markus)
Christian Urban <urbanc@in.tum.de>
parents:
789
diff
changeset
|
58 |
fun qcinfo phi = transform_qconsts phi {qconst = trm, rconst = rhs, def = thm} |
869
ce5f78f0eac5
Finished organising an efficient datastructure for qconst_info.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
868
diff
changeset
|
59 |
fun trans_name phi = (fst o dest_Const o #qconst) (qcinfo phi) |
319 | 60 |
val lthy'' = Local_Theory.declaration true |
869
ce5f78f0eac5
Finished organising an efficient datastructure for qconst_info.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
868
diff
changeset
|
61 |
(fn phi => qconsts_update_gen (trans_name phi) (qcinfo phi)) lthy' |
293
653460d3e849
tuned the code in quotient and quotient_def
Christian Urban <urbanc@in.tum.de>
parents:
290
diff
changeset
|
62 |
in |
310
fec6301a1989
added a container for quotient constants (does not work yet though)
Christian Urban <urbanc@in.tum.de>
parents:
307
diff
changeset
|
63 |
((trm, thm), lthy'') |
293
653460d3e849
tuned the code in quotient and quotient_def
Christian Urban <urbanc@in.tum.de>
parents:
290
diff
changeset
|
64 |
end |
653460d3e849
tuned the code in quotient and quotient_def
Christian Urban <urbanc@in.tum.de>
parents:
290
diff
changeset
|
65 |
|
1144
538daee762e6
Added a binding to the parser.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1142
diff
changeset
|
66 |
fun quotdef_cmd (bindmx, (attr, (lhs_str, rhs_str))) lthy = |
277
37636f2b1c19
separated the quotient_def into a separate file
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
67 |
let |
1141
3c8ad149a4d3
Undid the read_terms change; now compiles.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1138
diff
changeset
|
68 |
val lhs = Syntax.read_term lthy lhs_str |
3c8ad149a4d3
Undid the read_terms change; now compiles.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1138
diff
changeset
|
69 |
val rhs = Syntax.read_term lthy rhs_str |
1114 | 70 |
val lthy' = Variable.declare_term lhs lthy |
71 |
val lthy'' = Variable.declare_term rhs lthy' |
|
277
37636f2b1c19
separated the quotient_def into a separate file
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
72 |
in |
1145
593365d61ecc
Passing the binding to quotient_def
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1144
diff
changeset
|
73 |
quotient_def (bindmx, (attr, (lhs, rhs))) lthy'' |> snd |
277
37636f2b1c19
separated the quotient_def into a separate file
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
74 |
end |
37636f2b1c19
separated the quotient_def into a separate file
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
75 |
|
1145
593365d61ecc
Passing the binding to quotient_def
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1144
diff
changeset
|
76 |
val binding_mixfix_parser = OuterParse.binding -- OuterParse.opt_mixfix' --| OuterParse.$$$ "where" |
279 | 77 |
val quotdef_parser = |
1145
593365d61ecc
Passing the binding to quotient_def
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1144
diff
changeset
|
78 |
(Scan.option binding_mixfix_parser) -- |
1144
538daee762e6
Added a binding to the parser.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1142
diff
changeset
|
79 |
OuterParse.!!! (SpecParse.opt_thm_name ":" -- ((OuterParse.term --| OuterParse.$$$ "is") -- OuterParse.term)) |
279 | 80 |
|
1144
538daee762e6
Added a binding to the parser.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1142
diff
changeset
|
81 |
val _ = |
538daee762e6
Added a binding to the parser.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1142
diff
changeset
|
82 |
OuterSyntax.local_theory "quotient_definition" |
538daee762e6
Added a binding to the parser.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1142
diff
changeset
|
83 |
"definition for constants over the quotient type" |
538daee762e6
Added a binding to the parser.
Cezary Kaliszyk <kaliszyk@in.tum.de>
parents:
1142
diff
changeset
|
84 |
OuterKeyword.thy_decl (quotdef_parser >> (quotdef_cmd)) |
277
37636f2b1c19
separated the quotient_def into a separate file
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
85 |
|
37636f2b1c19
separated the quotient_def into a separate file
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
86 |
end; (* structure *) |