author | krauss |
Sat, 02 Jan 2010 23:18:58 +0100 | |
changeset 34232 | 36a2a3029fd3 |
parent 33519 | e31a85f92ce9 |
child 35403 | 25a67a606782 |
permissions | -rw-r--r-- |
31775 | 1 |
(* Title: HOL/Tools/Function/context_tree.ML |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
2 |
Author: Alexander Krauss, TU Muenchen |
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
3 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
4 |
A package for general recursive function definitions. |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
5 |
Builds and traverses trees of nested contexts along a term. |
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
6 |
*) |
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
7 |
|
33099
b8cdd3d73022
function package: more standard names for structures and files
krauss
parents:
33049
diff
changeset
|
8 |
signature FUNCTION_CTXTREE = |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
9 |
sig |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
10 |
(* poor man's contexts: fixes + assumes *) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
11 |
type ctxt = (string * typ) list * thm list |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
12 |
type ctx_tree |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
13 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
14 |
(* FIXME: This interface is a mess and needs to be cleaned up! *) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
15 |
val get_function_congs : Proof.context -> thm list |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
16 |
val add_function_cong : thm -> Context.generic -> Context.generic |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
17 |
val map_function_congs : (thm list -> thm list) -> Context.generic -> Context.generic |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
18 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
19 |
val cong_add: attribute |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
20 |
val cong_del: attribute |
24168
86a03a092062
simplified internal interfaces; cong rules are now handled directly by "context_tree.ML"
krauss
parents:
23819
diff
changeset
|
21 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
22 |
val mk_tree: (string * typ) -> term -> Proof.context -> term -> ctx_tree |
20523
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
krauss
parents:
20289
diff
changeset
|
23 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
24 |
val inst_tree: theory -> term -> term -> ctx_tree -> ctx_tree |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
25 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
26 |
val export_term : ctxt -> term -> term |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
27 |
val export_thm : theory -> ctxt -> thm -> thm |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
28 |
val import_thm : theory -> ctxt -> thm -> thm |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
29 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
30 |
val traverse_tree : |
26115 | 31 |
(ctxt -> term -> |
32 |
(ctxt * thm) list -> |
|
33 |
(ctxt * thm) list * 'b -> |
|
34 |
(ctxt * thm) list * 'b) |
|
23819 | 35 |
-> ctx_tree -> 'b -> 'b |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
36 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
37 |
val rewrite_by_tree : theory -> term -> thm -> (thm * thm) list -> |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
38 |
ctx_tree -> thm * (thm * thm) list |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
39 |
end |
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
40 |
|
33099
b8cdd3d73022
function package: more standard names for structures and files
krauss
parents:
33049
diff
changeset
|
41 |
structure Function_Ctx_Tree : FUNCTION_CTXTREE = |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
42 |
struct |
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
43 |
|
26115 | 44 |
type ctxt = (string * typ) list * thm list |
45 |
||
33099
b8cdd3d73022
function package: more standard names for structures and files
krauss
parents:
33049
diff
changeset
|
46 |
open Function_Common |
b8cdd3d73022
function package: more standard names for structures and files
krauss
parents:
33049
diff
changeset
|
47 |
open Function_Lib |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
48 |
|
33519 | 49 |
structure FunctionCongs = Generic_Data |
24168
86a03a092062
simplified internal interfaces; cong rules are now handled directly by "context_tree.ML"
krauss
parents:
23819
diff
changeset
|
50 |
( |
86a03a092062
simplified internal interfaces; cong rules are now handled directly by "context_tree.ML"
krauss
parents:
23819
diff
changeset
|
51 |
type T = thm list |
86a03a092062
simplified internal interfaces; cong rules are now handled directly by "context_tree.ML"
krauss
parents:
23819
diff
changeset
|
52 |
val empty = [] |
86a03a092062
simplified internal interfaces; cong rules are now handled directly by "context_tree.ML"
krauss
parents:
23819
diff
changeset
|
53 |
val extend = I |
33519 | 54 |
val merge = Thm.merge_thms |
24168
86a03a092062
simplified internal interfaces; cong rules are now handled directly by "context_tree.ML"
krauss
parents:
23819
diff
changeset
|
55 |
); |
86a03a092062
simplified internal interfaces; cong rules are now handled directly by "context_tree.ML"
krauss
parents:
23819
diff
changeset
|
56 |
|
33099
b8cdd3d73022
function package: more standard names for structures and files
krauss
parents:
33049
diff
changeset
|
57 |
val get_function_congs = FunctionCongs.get o Context.Proof |
b8cdd3d73022
function package: more standard names for structures and files
krauss
parents:
33049
diff
changeset
|
58 |
val map_function_congs = FunctionCongs.map |
b8cdd3d73022
function package: more standard names for structures and files
krauss
parents:
33049
diff
changeset
|
59 |
val add_function_cong = FunctionCongs.map o Thm.add_thm |
24168
86a03a092062
simplified internal interfaces; cong rules are now handled directly by "context_tree.ML"
krauss
parents:
23819
diff
changeset
|
60 |
|
86a03a092062
simplified internal interfaces; cong rules are now handled directly by "context_tree.ML"
krauss
parents:
23819
diff
changeset
|
61 |
(* congruence rules *) |
86a03a092062
simplified internal interfaces; cong rules are now handled directly by "context_tree.ML"
krauss
parents:
23819
diff
changeset
|
62 |
|
33099
b8cdd3d73022
function package: more standard names for structures and files
krauss
parents:
33049
diff
changeset
|
63 |
val cong_add = Thm.declaration_attribute (map_function_congs o Thm.add_thm o safe_mk_meta_eq); |
b8cdd3d73022
function package: more standard names for structures and files
krauss
parents:
33049
diff
changeset
|
64 |
val cong_del = Thm.declaration_attribute (map_function_congs o Thm.del_thm o safe_mk_meta_eq); |
24168
86a03a092062
simplified internal interfaces; cong rules are now handled directly by "context_tree.ML"
krauss
parents:
23819
diff
changeset
|
65 |
|
86a03a092062
simplified internal interfaces; cong rules are now handled directly by "context_tree.ML"
krauss
parents:
23819
diff
changeset
|
66 |
|
23819 | 67 |
type depgraph = int IntGraph.T |
68 |
||
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
69 |
datatype ctx_tree = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
70 |
Leaf of term |
26115 | 71 |
| Cong of (thm * depgraph * (ctxt * ctx_tree) list) |
23819 | 72 |
| RCall of (term * ctx_tree) |
73 |
||
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
74 |
|
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
75 |
(* Maps "Trueprop A = B" to "A" *) |
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
76 |
val rhs_of = snd o HOLogic.dest_eq o HOLogic.dest_Trueprop |
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
77 |
|
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
78 |
|
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
79 |
(*** Dependency analysis for congruence rules ***) |
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
80 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
81 |
fun branch_vars t = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
82 |
let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
83 |
val t' = snd (dest_all_all t) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
84 |
val (assumes, concl) = Logic.strip_horn t' |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
85 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
86 |
(fold Term.add_vars assumes [], Term.add_vars concl []) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
87 |
end |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
88 |
|
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
89 |
fun cong_deps crule = |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
90 |
let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
91 |
val num_branches = map_index (apsnd branch_vars) (prems_of crule) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
92 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
93 |
IntGraph.empty |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
94 |
|> fold (fn (i,_)=> IntGraph.new_node (i,i)) num_branches |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
95 |
|> fold_product (fn (i, (c1, _)) => fn (j, (_, t2)) => |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
96 |
if i = j orelse null (inter (op =) c1 t2) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
97 |
then I else IntGraph.add_edge_acyclic (i,j)) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
98 |
num_branches num_branches |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
99 |
end |
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
100 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
101 |
val default_congs = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
102 |
map (fn c => c RS eq_reflection) [@{thm "cong"}, @{thm "ext"}] |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
103 |
|
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
104 |
(* Called on the INSTANTIATED branches of the congruence rule *) |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
105 |
fun mk_branch ctx t = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
106 |
let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
107 |
val (ctx', fixes, impl) = dest_all_all_ctx ctx t |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
108 |
val (assms, concl) = Logic.strip_horn impl |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
109 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
110 |
(ctx', fixes, assms, rhs_of concl) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
111 |
end |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
112 |
|
21100 | 113 |
fun find_cong_rule ctx fvar h ((r,dep)::rs) t = |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
114 |
(let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
115 |
val thy = ProofContext.theory_of ctx |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
116 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
117 |
val tt' = Logic.mk_equals (Pattern.rewrite_term thy [(Free fvar, h)] [] t, t) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
118 |
val (c, subs) = (concl_of r, prems_of r) |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
119 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
120 |
val subst = Pattern.match (ProofContext.theory_of ctx) (c, tt') (Vartab.empty, Vartab.empty) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
121 |
val branches = map (mk_branch ctx o Envir.beta_norm o Envir.subst_term subst) subs |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
122 |
val inst = map (fn v => |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
123 |
(cterm_of thy (Var v), cterm_of thy (Envir.subst_term subst (Var v)))) (Term.add_vars c []) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
124 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
125 |
(cterm_instantiate inst r, dep, branches) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
126 |
end |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
127 |
handle Pattern.MATCH => find_cong_rule ctx fvar h rs t) |
31775 | 128 |
| find_cong_rule _ _ _ [] _ = sys_error "Function/context_tree.ML: No cong rule found!" |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
129 |
|
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
130 |
|
24168
86a03a092062
simplified internal interfaces; cong rules are now handled directly by "context_tree.ML"
krauss
parents:
23819
diff
changeset
|
131 |
fun mk_tree fvar h ctxt t = |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
132 |
let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
133 |
val congs = get_function_congs ctxt |
26115 | 134 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
135 |
(* FIXME: Save in theory: *) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
136 |
val congs_deps = map (fn c => (c, cong_deps c)) (congs @ default_congs) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
137 |
|
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
138 |
fun matchcall (a $ b) = if a = Free fvar then SOME b else NONE |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
139 |
| matchcall _ = NONE |
24168
86a03a092062
simplified internal interfaces; cong rules are now handled directly by "context_tree.ML"
krauss
parents:
23819
diff
changeset
|
140 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
141 |
fun mk_tree' ctx t = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
142 |
case matchcall t of |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
143 |
SOME arg => RCall (t, mk_tree' ctx arg) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
144 |
| NONE => |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
145 |
if not (exists_subterm (fn Free v => v = fvar | _ => false) t) then Leaf t |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
146 |
else |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
147 |
let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
148 |
val (r, dep, branches) = find_cong_rule ctx fvar h congs_deps t |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
149 |
fun subtree (ctx', fixes, assumes, st) = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
150 |
((fixes, |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
151 |
map (assume o cterm_of (ProofContext.theory_of ctx)) assumes), |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
152 |
mk_tree' ctx' st) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
153 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
154 |
Cong (r, dep, map subtree branches) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
155 |
end |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
156 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
157 |
mk_tree' ctxt t |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
158 |
end |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
159 |
|
20523
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
krauss
parents:
20289
diff
changeset
|
160 |
fun inst_tree thy fvar f tr = |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
161 |
let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
162 |
val cfvar = cterm_of thy fvar |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
163 |
val cf = cterm_of thy f |
20523
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
krauss
parents:
20289
diff
changeset
|
164 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
165 |
fun inst_term t = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
166 |
subst_bound(f, abstract_over (fvar, t)) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
167 |
|
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
168 |
val inst_thm = forall_elim cf o forall_intr cfvar |
20523
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
krauss
parents:
20289
diff
changeset
|
169 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
170 |
fun inst_tree_aux (Leaf t) = Leaf t |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
171 |
| inst_tree_aux (Cong (crule, deps, branches)) = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
172 |
Cong (inst_thm crule, deps, map inst_branch branches) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
173 |
| inst_tree_aux (RCall (t, str)) = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
174 |
RCall (inst_term t, inst_tree_aux str) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
175 |
and inst_branch ((fxs, assms), str) = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
176 |
((fxs, map (assume o cterm_of thy o inst_term o prop_of) assms), |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
177 |
inst_tree_aux str) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
178 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
179 |
inst_tree_aux tr |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
180 |
end |
20523
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
krauss
parents:
20289
diff
changeset
|
181 |
|
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
krauss
parents:
20289
diff
changeset
|
182 |
|
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
183 |
(* Poor man's contexts: Only fixes and assumes *) |
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
184 |
fun compose (fs1, as1) (fs2, as2) = (fs1 @ fs2, as1 @ as2) |
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
185 |
|
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
186 |
fun export_term (fixes, assumes) = |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
187 |
fold_rev (curry Logic.mk_implies o prop_of) assumes |
27330 | 188 |
#> fold_rev (Logic.all o Free) fixes |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
189 |
|
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
190 |
fun export_thm thy (fixes, assumes) = |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
191 |
fold_rev (implies_intr o cprop_of) assumes |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
192 |
#> fold_rev (forall_intr o cterm_of thy o Free) fixes |
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
193 |
|
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
194 |
fun import_thm thy (fixes, athms) = |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
195 |
fold (forall_elim o cterm_of thy o Free) fixes |
24977
9f98751c9628
replaced (flip Thm.implies_elim) by Thm.elim_implies;
wenzelm
parents:
24168
diff
changeset
|
196 |
#> fold Thm.elim_implies athms |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
197 |
|
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
198 |
|
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
199 |
(* folds in the order of the dependencies of a graph. *) |
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
200 |
fun fold_deps G f x = |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
201 |
let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
202 |
fun fill_table i (T, x) = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
203 |
case Inttab.lookup T i of |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
204 |
SOME _ => (T, x) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
205 |
| NONE => |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
206 |
let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
207 |
val (T', x') = fold fill_table (IntGraph.imm_succs G i) (T, x) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
208 |
val (v, x'') = f (the o Inttab.lookup T') i x' |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
209 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
210 |
(Inttab.update (i, v) T', x'') |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
211 |
end |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
212 |
|
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
213 |
val (T, x) = fold fill_table (IntGraph.keys G) (Inttab.empty, x) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
214 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
215 |
(Inttab.fold (cons o snd) T [], x) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
216 |
end |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
217 |
|
26115 | 218 |
fun traverse_tree rcOp tr = |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
219 |
let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
220 |
fun traverse_help ctx (Leaf _) _ x = ([], x) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
221 |
| traverse_help ctx (RCall (t, st)) u x = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
222 |
rcOp ctx t u (traverse_help ctx st u x) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
223 |
| traverse_help ctx (Cong (_, deps, branches)) u x = |
21237 | 224 |
let |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
225 |
fun sub_step lu i x = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
226 |
let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
227 |
val (ctx', subtree) = nth branches i |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
228 |
val used = fold_rev (append o lu) (IntGraph.imm_succs deps i) u |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
229 |
val (subs, x') = traverse_help (compose ctx ctx') subtree used x |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
230 |
val exported_subs = map (apfst (compose ctx')) subs (* FIXME: Right order of composition? *) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
231 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
232 |
(exported_subs, x') |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
233 |
end |
21237 | 234 |
in |
26115 | 235 |
fold_deps deps sub_step x |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
236 |
|> apfst flat |
21237 | 237 |
end |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
238 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
239 |
snd o traverse_help ([], []) tr [] |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
240 |
end |
19564
d3e2f532459a
First usable version of the new function definition package (HOL/function_packake/...).
krauss
parents:
diff
changeset
|
241 |
|
20523
36a59e5d0039
Major update to function package, including new syntax and the (only theoretical)
krauss
parents:
20289
diff
changeset
|
242 |
fun rewrite_by_tree thy h ih x tr = |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
243 |
let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
244 |
fun rewrite_help _ _ x (Leaf t) = (reflexive (cterm_of thy t), x) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
245 |
| rewrite_help fix h_as x (RCall (_ $ arg, st)) = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
246 |
let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
247 |
val (inner, (lRi,ha)::x') = rewrite_help fix h_as x st (* "a' = a" *) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
248 |
|
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
249 |
val iha = import_thm thy (fix, h_as) ha (* (a', h a') : G *) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
250 |
|> Conv.fconv_rule (Conv.arg_conv (Conv.comb_conv (Conv.arg_conv (K inner)))) |
26196 | 251 |
(* (a, h a) : G *) |
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
252 |
val inst_ih = instantiate' [] [SOME (cterm_of thy arg)] ih |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
253 |
val eq = implies_elim (implies_elim inst_ih lRi) iha (* h a = f a *) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
254 |
|
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
255 |
val h_a'_eq_h_a = combination (reflexive (cterm_of thy h)) inner |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
256 |
val h_a_eq_f_a = eq RS eq_reflection |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
257 |
val result = transitive h_a'_eq_h_a h_a_eq_f_a |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
258 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
259 |
(result, x') |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
260 |
end |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
261 |
| rewrite_help fix h_as x (Cong (crule, deps, branches)) = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
262 |
let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
263 |
fun sub_step lu i x = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
264 |
let |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
265 |
val ((fixes, assumes), st) = nth branches i |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
266 |
val used = map lu (IntGraph.imm_succs deps i) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
267 |
|> map (fn u_eq => (u_eq RS sym) RS eq_reflection) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
268 |
|> filter_out Thm.is_reflexive |
26196 | 269 |
|
34232
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
270 |
val assumes' = map (simplify (HOL_basic_ss addsimps used)) assumes |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
271 |
|
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
272 |
val (subeq, x') = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
273 |
rewrite_help (fix @ fixes) (h_as @ assumes') x st |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
274 |
val subeq_exp = |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
275 |
export_thm thy (fixes, assumes) (subeq RS meta_eq_to_obj_eq) |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
276 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
277 |
(subeq_exp, x') |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
278 |
end |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
279 |
val (subthms, x') = fold_deps deps sub_step x |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
280 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
281 |
(fold_rev (curry op COMP) subthms crule, x') |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
282 |
end |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
283 |
in |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
284 |
rewrite_help [] [] x tr |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
285 |
end |
36a2a3029fd3
new year's resolution: reindented code in function package
krauss
parents:
33519
diff
changeset
|
286 |
|
19612 | 287 |
end |