462
|
1 |
The new Internal Interface for Theory Extension
|
|
2 |
===============================================
|
|
3 |
|
|
4 |
MMW 06-Jun-1994
|
|
5 |
|
|
6 |
|
|
7 |
In former versions of Isabelle, the interface for theory extension was
|
|
8 |
provided by extend_theory. This had many deficiencies and has been removed in
|
|
9 |
Isabelle94/2.
|
|
10 |
|
|
11 |
Instead of one monolithic function, there is now a host of small functions of
|
|
12 |
the form:
|
|
13 |
|
|
14 |
add_XXX: ... -> theory -> theory
|
|
15 |
|
|
16 |
These provide an extension mechanism which is:
|
|
17 |
|
|
18 |
- incremental (but non-destructive):
|
|
19 |
|
|
20 |
An extend operation may now involve many functions of the add_XXX kind.
|
|
21 |
These act in a purely functional manner.
|
|
22 |
|
|
23 |
- nameless:
|
|
24 |
|
|
25 |
One no longer needs to invent new theory names for intermediate theories.
|
|
26 |
There's now a notion of _draft_theories_ that behave like ordinary ones
|
|
27 |
in many cases (main exceptions: extensions of drafts are not related (wrt
|
|
28 |
subthy); merges of drafts with unrelated theories are impossible). A
|
|
29 |
draft is "closed" by add_thyname.
|
|
30 |
|
|
31 |
- extendable:
|
|
32 |
|
|
33 |
Package writers simply have to provide add_XXX like functions, which are
|
|
34 |
built using a basic set provided by Pure Isabelle.
|
|
35 |
|
|
36 |
|
|
37 |
Here follows a sample interactive session using the new functions:
|
|
38 |
|
|
39 |
> add_consts
|
|
40 |
# [("nand", "[o, o] => o", NoSyn), ("#", "[o, o] => o", Infixl 30)]
|
|
41 |
# FOL.thy;
|
|
42 |
Building new grammar...
|
|
43 |
val it = {Pure, IFOL, FOL, #} : theory
|
|
44 |
> add_axioms
|
|
45 |
# [("nand_def", "nand(P, Q) == ~(P & Q)"), ("xor_def", "P # Q == P & ~Q | ~P & Q")]
|
|
46 |
# it;
|
|
47 |
val it = {Pure, IFOL, FOL, #} : theory
|
|
48 |
> add_thyname "Gate" it;
|
|
49 |
val it = {Pure, IFOL, FOL, Gate} : theory
|
|
50 |
|
|
51 |
Note that theories and theorems with a "#" draft stamp are not supposed to
|
|
52 |
persist. Typically, there is a final add_thyname somewhere with the "real"
|
|
53 |
theory name as supplied by the user.
|
|
54 |
|
|
55 |
|
|
56 |
Appendix A: Basic theory extension functions
|
|
57 |
--------------------------------------------
|
|
58 |
|
|
59 |
val add_classes: (class list * class * class list) list -> theory -> theory
|
|
60 |
val add_defsort: sort -> theory -> theory
|
|
61 |
val add_types: (string * int * mixfix) list -> theory -> theory
|
|
62 |
val add_tyabbrs: (string * string list * string * mixfix) list
|
|
63 |
-> theory -> theory
|
|
64 |
val add_tyabbrs_i: (string * string list * typ * mixfix) list
|
|
65 |
-> theory -> theory
|
|
66 |
val add_arities: (string * sort list * sort) list -> theory -> theory
|
|
67 |
val add_consts: (string * string * mixfix) list -> theory -> theory
|
|
68 |
val add_consts_i: (string * typ * mixfix) list -> theory -> theory
|
|
69 |
val add_syntax: (string * string * mixfix) list -> theory -> theory
|
|
70 |
val add_syntax_i: (string * typ * mixfix) list -> theory -> theory
|
|
71 |
val add_trfuns:
|
|
72 |
(string * (ast list -> ast)) list *
|
|
73 |
(string * (term list -> term)) list *
|
|
74 |
(string * (term list -> term)) list *
|
|
75 |
(string * (ast list -> ast)) list -> theory -> theory
|
|
76 |
val add_trrules: xrule list -> theory -> theory
|
|
77 |
val add_axioms: (string * string) list -> theory -> theory
|
|
78 |
val add_axioms_i: (string * term) list -> theory -> theory
|
|
79 |
val add_thyname: string -> theory -> theory
|
|
80 |
|
|
81 |
|
|
82 |
Appendix B: The |> operator
|
|
83 |
---------------------------
|
|
84 |
|
|
85 |
Isabelle now provides an ML infix operator for reverse function application:
|
|
86 |
|
|
87 |
infix |>;
|
|
88 |
fun (x |> f) = f x;
|
|
89 |
|
|
90 |
Using this, theory extension really becomes a plasure, e.g.:
|
|
91 |
|
|
92 |
FOL.thy
|
|
93 |
|> add_consts
|
|
94 |
[("nand", "[o, o] => o", NoSyn),
|
|
95 |
("#", "[o, o] => o", Infixl 30)]
|
|
96 |
|> add_axioms
|
|
97 |
[("nand_def", "nand(P, Q) == ~(P & Q)"),
|
|
98 |
("xor_def", "P # Q == P & ~Q | ~P & Q")]
|
|
99 |
|> add_thyname "Gate";
|
|
100 |
|
|
101 |
For a real-world example simply reset delete_tmpfiles, use_thy your favourite
|
|
102 |
theory definition file and inspect the generated .XXX.thy.ML file.
|
|
103 |
|
|
104 |
=============================================================================
|