| author | wenzelm | 
| Tue, 30 Sep 2008 22:02:44 +0200 | |
| changeset 28429 | 3d5fbf964a7e | 
| parent 28084 | a05ca48ef263 | 
| child 28965 | 1de908189869 | 
| permissions | -rw-r--r-- | 
| 20523 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 1 | (* Title: HOL/Tools/function_package/inductive_wrap.ML | 
| 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 2 | ID: $Id$ | 
| 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 3 | Author: Alexander Krauss, TU Muenchen | 
| 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 4 | |
| 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 5 | |
| 21237 | 6 | A wrapper around the inductive package, restoring the quantifiers in | 
| 7 | the introduction and elimination rules. | |
| 20523 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 8 | *) | 
| 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 9 | |
| 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 10 | signature FUNDEF_INDUCTIVE_WRAP = | 
| 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 11 | sig | 
| 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 12 | val inductive_def : term list | 
| 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 13 | -> ((bstring * typ) * mixfix) * local_theory | 
| 22166 | 14 | -> thm list * (term * thm * thm * local_theory) | 
| 20523 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 15 | end | 
| 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 16 | |
| 28083 
103d9282a946
explicit type Name.binding for higher-specification elements;
 wenzelm parents: 
26535diff
changeset | 17 | structure FundefInductiveWrap: FUNDEF_INDUCTIVE_WRAP = | 
| 20523 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 18 | struct | 
| 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 19 | |
| 21051 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 20 | open FundefLib | 
| 20523 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 21 | |
| 22619 | 22 | fun requantify ctxt lfix orig_def thm = | 
| 21051 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 23 | let | 
| 22619 | 24 | val (qs, t) = dest_all_all orig_def | 
| 21105 | 25 | val thy = theory_of_thm thm | 
| 21051 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 26 | val frees = frees_in_term ctxt t | 
| 21237 | 27 | |> remove (op =) lfix | 
| 21051 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 28 | val vars = Term.add_vars (prop_of thm) [] |> rev | 
| 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 29 | |
| 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 30 | val varmap = frees ~~ vars | 
| 20523 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 31 | in | 
| 21051 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 32 | fold_rev (fn Free (n, T) => | 
| 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 33 |                    forall_intr_rename (n, cterm_of thy (Var (the_default (("",0), T) (AList.lookup (op =) varmap (n, T))))))
 | 
| 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 34 | qs | 
| 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 35 | thm | 
| 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 36 | end | 
| 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 37 | |
| 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 38 | |
| 20523 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 39 | |
| 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 40 | fun inductive_def defs (((R, T), mixfix), lthy) = | 
| 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 41 | let | 
| 22166 | 42 |       val ({intrs = intrs_gen, elims = [elim_gen], preds = [ Rdef ], induct, ...}, lthy) =
 | 
| 24816 | 43 | InductivePackage.add_inductive_i | 
| 26475 
3cc1e48d0ce1
eliminated quiet_mode ref of some packages (avoid CRITICAL setmp!);
 wenzelm parents: 
26129diff
changeset | 44 |             {quiet_mode = false,
 | 
| 
3cc1e48d0ce1
eliminated quiet_mode ref of some packages (avoid CRITICAL setmp!);
 wenzelm parents: 
26129diff
changeset | 45 | verbose = ! Toplevel.debug, | 
| 24822 | 46 | kind = Thm.internalK, | 
| 28083 
103d9282a946
explicit type Name.binding for higher-specification elements;
 wenzelm parents: 
26535diff
changeset | 47 | alt_name = Name.no_binding, | 
| 24816 | 48 | coind = false, | 
| 49 | no_elim = false, | |
| 26535 
66bca8a4079c
Added skip_mono flag to inductive definition package.
 berghofe parents: 
26475diff
changeset | 50 | no_ind = false, | 
| 
66bca8a4079c
Added skip_mono flag to inductive definition package.
 berghofe parents: 
26475diff
changeset | 51 | skip_mono = true} | 
| 28083 
103d9282a946
explicit type Name.binding for higher-specification elements;
 wenzelm parents: 
26535diff
changeset | 52 | [((Name.binding R, T), NoSyn)] (* the relation *) | 
| 24816 | 53 | [] (* no parameters *) | 
| 28084 
a05ca48ef263
type Attrib.binding abbreviates Name.binding without attributes;
 wenzelm parents: 
28083diff
changeset | 54 | (map (fn t => (Attrib.no_binding, t)) defs) (* the intros *) | 
| 24816 | 55 | [] (* no special monos *) | 
| 56 | lthy | |
| 20523 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 57 | |
| 22619 | 58 | val intrs = map2 (requantify lthy (R, T)) defs intrs_gen | 
| 21051 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 59 | |
| 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 60 | val elim = elim_gen | 
| 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 61 | |> forall_intr_vars (* FIXME... *) | 
| 20523 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 62 | |
| 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 63 | in | 
| 22612 | 64 | (intrs, (Rdef, elim, induct, lthy)) | 
| 20523 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 65 | end | 
| 21051 
c49467a9c1e1
Switched function package to use the new package for inductive predicates.
 krauss parents: 
21025diff
changeset | 66 | |
| 20523 
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
 krauss parents: diff
changeset | 67 | end |