| author | krauss |
| Sat, 02 Jan 2010 23:18:58 +0100 | |
| changeset 34228 | bc0cea4cae52 |
| parent 33522 | 737589bb9bb8 |
| child 35762 | af3ff2ba4c54 |
| permissions | -rw-r--r-- |
|
12174
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
1 |
(* Title: ZF/Tools/ind_cases.ML |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
2 |
ID: $Id$ |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
3 |
Author: Markus Wenzel, LMU Muenchen |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
4 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
5 |
Generic inductive cases facility for (co)inductive definitions. |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
6 |
*) |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
7 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
8 |
signature IND_CASES = |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
9 |
sig |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
10 |
val declare: string -> (simpset -> cterm -> thm) -> theory -> theory |
|
28084
a05ca48ef263
type Attrib.binding abbreviates Name.binding without attributes;
wenzelm
parents:
28083
diff
changeset
|
11 |
val inductive_cases: (Attrib.binding * string list) list -> theory -> theory |
| 18708 | 12 |
val setup: theory -> theory |
|
12174
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
13 |
end; |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
14 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
15 |
structure IndCases: IND_CASES = |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
16 |
struct |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
17 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
18 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
19 |
(* theory data *) |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
20 |
|
| 33522 | 21 |
structure IndCasesData = Theory_Data |
| 22846 | 22 |
( |
|
12174
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
23 |
type T = (simpset -> cterm -> thm) Symtab.table; |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
24 |
val empty = Symtab.empty; |
| 16424 | 25 |
val extend = I; |
| 33522 | 26 |
fun merge data = Symtab.merge (K true) data; |
| 22846 | 27 |
); |
|
12174
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
28 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
29 |
|
| 17412 | 30 |
fun declare name f = IndCasesData.map (Symtab.update (name, f)); |
|
12174
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
31 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
32 |
fun smart_cases thy ss read_prop s = |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
33 |
let |
| 18678 | 34 |
fun err msg = cat_error msg ("Malformed set membership statement: " ^ s);
|
35 |
val A = read_prop s handle ERROR msg => err msg; |
|
|
12174
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
36 |
val c = #1 (Term.dest_Const (Term.head_of (#2 (Ind_Syntax.dest_mem (FOLogic.dest_Trueprop |
| 18678 | 37 |
(Logic.strip_imp_concl A)))))) handle TERM _ => err ""; |
|
12174
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
38 |
in |
| 17412 | 39 |
(case Symtab.lookup (IndCasesData.get thy) c of |
| 15531 | 40 |
NONE => error ("Unknown inductive cases rule for set " ^ quote c)
|
| 20342 | 41 |
| SOME f => f ss (Thm.cterm_of thy A)) |
|
12174
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
42 |
end; |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
43 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
44 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
45 |
(* inductive_cases command *) |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
46 |
|
| 12609 | 47 |
fun inductive_cases args thy = |
|
12174
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
48 |
let |
|
32149
ef59550a55d3
renamed simpset_of to global_simpset_of, and local_simpset_of to simpset_of -- same for claset and clasimpset;
wenzelm
parents:
30722
diff
changeset
|
49 |
val mk_cases = smart_cases thy (global_simpset_of thy) (Syntax.read_prop_global thy); |
| 12609 | 50 |
val facts = args |> map (fn ((name, srcs), props) => |
| 18728 | 51 |
((name, map (Attrib.attribute thy) srcs), |
|
12876
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
wenzelm
parents:
12716
diff
changeset
|
52 |
map (Thm.no_attributes o single o mk_cases) props)); |
|
27691
ce171cbd4b93
PureThy: dropped note_thmss_qualified, dropped _i suffix
haftmann
parents:
24867
diff
changeset
|
53 |
in thy |> PureThy.note_thmss "" facts |> snd end; |
|
12174
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
54 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
55 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
56 |
(* ind_cases method *) |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
57 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
58 |
val setup = |
|
30722
623d4831c8cf
simplified attribute and method setup: eliminating bottom-up styles makes it easier to keep things in one place, and also SML/NJ happy;
wenzelm
parents:
30515
diff
changeset
|
59 |
Method.setup @{binding "ind_cases"}
|
|
623d4831c8cf
simplified attribute and method setup: eliminating bottom-up styles makes it easier to keep things in one place, and also SML/NJ happy;
wenzelm
parents:
30515
diff
changeset
|
60 |
(Scan.lift (Scan.repeat1 Args.name_source) >> |
|
623d4831c8cf
simplified attribute and method setup: eliminating bottom-up styles makes it easier to keep things in one place, and also SML/NJ happy;
wenzelm
parents:
30515
diff
changeset
|
61 |
(fn props => fn ctxt => |
|
623d4831c8cf
simplified attribute and method setup: eliminating bottom-up styles makes it easier to keep things in one place, and also SML/NJ happy;
wenzelm
parents:
30515
diff
changeset
|
62 |
props |
|
32149
ef59550a55d3
renamed simpset_of to global_simpset_of, and local_simpset_of to simpset_of -- same for claset and clasimpset;
wenzelm
parents:
30722
diff
changeset
|
63 |
|> map (smart_cases (ProofContext.theory_of ctxt) (simpset_of ctxt) (Syntax.read_prop ctxt)) |
|
30722
623d4831c8cf
simplified attribute and method setup: eliminating bottom-up styles makes it easier to keep things in one place, and also SML/NJ happy;
wenzelm
parents:
30515
diff
changeset
|
64 |
|> Method.erule 0)) |
|
623d4831c8cf
simplified attribute and method setup: eliminating bottom-up styles makes it easier to keep things in one place, and also SML/NJ happy;
wenzelm
parents:
30515
diff
changeset
|
65 |
"dynamic case analysis on sets"; |
|
12174
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
66 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
67 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
68 |
(* outer syntax *) |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
69 |
|
| 17057 | 70 |
local structure P = OuterParse and K = OuterKeyword in |
|
12174
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
71 |
|
| 24867 | 72 |
val _ = |
|
12174
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
73 |
OuterSyntax.command "inductive_cases" |
| 24867 | 74 |
"create simplified instances of elimination rules (improper)" K.thy_script |
75 |
(P.and_list1 (SpecParse.opt_thm_name ":" -- Scan.repeat1 P.prop) |
|
76 |
>> (Toplevel.theory o inductive_cases)); |
|
|
12174
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
77 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
78 |
end; |
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
79 |
|
|
a0aab0b9f2e9
Generic inductive cases facility for (co)inductive definitions.
wenzelm
parents:
diff
changeset
|
80 |
end; |
| 15705 | 81 |