| author | wenzelm | 
| Thu, 07 Apr 2016 11:17:57 +0200 | |
| changeset 62896 | 4ee9c2be4383 | 
| parent 62848 | e4140efe699e | 
| child 64572 | cec07f7249cd | 
| permissions | -rw-r--r-- | 
| 57934 
5e500c0e7eca
tuned signature -- prefer self-contained user-space tool;
 wenzelm parents: 
49561diff
changeset | 1 | (* Title: Pure/Tools/thm_deps.ML | 
| 7765 
fa28bac7903c
New function thm_deps for visualizing dependencies of theorems.
 berghofe parents: diff
changeset | 2 | Author: Stefan Berghofer, TU Muenchen | 
| 
fa28bac7903c
New function thm_deps for visualizing dependencies of theorems.
 berghofe parents: diff
changeset | 3 | |
| 
fa28bac7903c
New function thm_deps for visualizing dependencies of theorems.
 berghofe parents: diff
changeset | 4 | Visualize dependencies of theorems. | 
| 
fa28bac7903c
New function thm_deps for visualizing dependencies of theorems.
 berghofe parents: diff
changeset | 5 | *) | 
| 
fa28bac7903c
New function thm_deps for visualizing dependencies of theorems.
 berghofe parents: diff
changeset | 6 | |
| 
fa28bac7903c
New function thm_deps for visualizing dependencies of theorems.
 berghofe parents: diff
changeset | 7 | signature THM_DEPS = | 
| 
fa28bac7903c
New function thm_deps for visualizing dependencies of theorems.
 berghofe parents: diff
changeset | 8 | sig | 
| 37870 
dd9cfc512b7f
thm_deps/unused_thms: Context.get_theory based on proper theory ancestry, not accidental theory loader state;
 wenzelm parents: 
37216diff
changeset | 9 | val thm_deps: theory -> thm list -> unit | 
| 26697 | 10 | val unused_thms: theory list * theory list -> (string * thm) list | 
| 7765 
fa28bac7903c
New function thm_deps for visualizing dependencies of theorems.
 berghofe parents: diff
changeset | 11 | end; | 
| 
fa28bac7903c
New function thm_deps for visualizing dependencies of theorems.
 berghofe parents: diff
changeset | 12 | |
| 33391 | 13 | structure Thm_Deps: THM_DEPS = | 
| 7765 
fa28bac7903c
New function thm_deps for visualizing dependencies of theorems.
 berghofe parents: diff
changeset | 14 | struct | 
| 
fa28bac7903c
New function thm_deps for visualizing dependencies of theorems.
 berghofe parents: diff
changeset | 15 | |
| 26697 | 16 | (* thm_deps *) | 
| 17 | ||
| 37870 
dd9cfc512b7f
thm_deps/unused_thms: Context.get_theory based on proper theory ancestry, not accidental theory loader state;
 wenzelm parents: 
37216diff
changeset | 18 | fun thm_deps thy thms = | 
| 28810 | 19 | let | 
| 60084 
2a066431a814
ensure that deps are defined in entries, to prevent crash of Graph_View.build_graph;
 wenzelm parents: 
59936diff
changeset | 20 | fun make_node name directory = | 
| 
2a066431a814
ensure that deps are defined in entries, to prevent crash of Graph_View.build_graph;
 wenzelm parents: 
59936diff
changeset | 21 | Graph_Display.session_node | 
| 
2a066431a814
ensure that deps are defined in entries, to prevent crash of Graph_View.build_graph;
 wenzelm parents: 
59936diff
changeset | 22 |        {name = Long_Name.base_name name, directory = directory, unfold = false, path = ""};
 | 
| 28826 
3b460b6eadae
simplified thm_deps -- no need to build a graph datastructure;
 wenzelm parents: 
28817diff
changeset | 23 |     fun add_dep ("", _, _) = I
 | 
| 
3b460b6eadae
simplified thm_deps -- no need to build a graph datastructure;
 wenzelm parents: 
28817diff
changeset | 24 |       | add_dep (name, _, PBody {thms = thms', ...}) =
 | 
| 
3b460b6eadae
simplified thm_deps -- no need to build a graph datastructure;
 wenzelm parents: 
28817diff
changeset | 25 | let | 
| 41489 
8e2b8649507d
standardized split_last/last_elem towards List.last;
 wenzelm parents: 
39557diff
changeset | 26 | val prefix = #1 (split_last (Long_Name.explode name)); | 
| 28826 
3b460b6eadae
simplified thm_deps -- no need to build a graph datastructure;
 wenzelm parents: 
28817diff
changeset | 27 | val session = | 
| 
3b460b6eadae
simplified thm_deps -- no need to build a graph datastructure;
 wenzelm parents: 
28817diff
changeset | 28 | (case prefix of | 
| 
3b460b6eadae
simplified thm_deps -- no need to build a graph datastructure;
 wenzelm parents: 
28817diff
changeset | 29 | a :: _ => | 
| 37870 
dd9cfc512b7f
thm_deps/unused_thms: Context.get_theory based on proper theory ancestry, not accidental theory loader state;
 wenzelm parents: 
37216diff
changeset | 30 | (case try (Context.get_theory thy) a of | 
| 28826 
3b460b6eadae
simplified thm_deps -- no need to build a graph datastructure;
 wenzelm parents: 
28817diff
changeset | 31 | SOME thy => | 
| 
3b460b6eadae
simplified thm_deps -- no need to build a graph datastructure;
 wenzelm parents: 
28817diff
changeset | 32 | (case Present.session_name thy of | 
| 
3b460b6eadae
simplified thm_deps -- no need to build a graph datastructure;
 wenzelm parents: 
28817diff
changeset | 33 | "" => [] | 
| 
3b460b6eadae
simplified thm_deps -- no need to build a graph datastructure;
 wenzelm parents: 
28817diff
changeset | 34 | | session => [session]) | 
| 
3b460b6eadae
simplified thm_deps -- no need to build a graph datastructure;
 wenzelm parents: 
28817diff
changeset | 35 | | NONE => []) | 
| 60084 
2a066431a814
ensure that deps are defined in entries, to prevent crash of Graph_View.build_graph;
 wenzelm parents: 
59936diff
changeset | 36 | | _ => ["global"]); | 
| 
2a066431a814
ensure that deps are defined in entries, to prevent crash of Graph_View.build_graph;
 wenzelm parents: 
59936diff
changeset | 37 | val node = make_node name (space_implode "/" (session @ prefix)); | 
| 
2a066431a814
ensure that deps are defined in entries, to prevent crash of Graph_View.build_graph;
 wenzelm parents: 
59936diff
changeset | 38 | val deps = filter_out (fn s => s = "") (map (#1 o #2) thms'); | 
| 
2a066431a814
ensure that deps are defined in entries, to prevent crash of Graph_View.build_graph;
 wenzelm parents: 
59936diff
changeset | 39 | in Symtab.update (name, (node, deps)) end; | 
| 
2a066431a814
ensure that deps are defined in entries, to prevent crash of Graph_View.build_graph;
 wenzelm parents: 
59936diff
changeset | 40 | val entries0 = Proofterm.fold_body_thms add_dep (Thm.proof_bodies_of thms) Symtab.empty; | 
| 
2a066431a814
ensure that deps are defined in entries, to prevent crash of Graph_View.build_graph;
 wenzelm parents: 
59936diff
changeset | 41 | val entries1 = | 
| 
2a066431a814
ensure that deps are defined in entries, to prevent crash of Graph_View.build_graph;
 wenzelm parents: 
59936diff
changeset | 42 | Symtab.fold (fn (_, (_, deps)) => deps |> fold (fn d => fn tab => | 
| 
2a066431a814
ensure that deps are defined in entries, to prevent crash of Graph_View.build_graph;
 wenzelm parents: 
59936diff
changeset | 43 | if Symtab.defined tab d then tab | 
| 
2a066431a814
ensure that deps are defined in entries, to prevent crash of Graph_View.build_graph;
 wenzelm parents: 
59936diff
changeset | 44 | else Symtab.update (d, (make_node d "", [])) tab)) entries0 entries0; | 
| 59210 
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
 wenzelm parents: 
59208diff
changeset | 45 | in | 
| 60084 
2a066431a814
ensure that deps are defined in entries, to prevent crash of Graph_View.build_graph;
 wenzelm parents: 
59936diff
changeset | 46 | Symtab.fold (fn (name, (node, deps)) => cons ((name, node), deps)) entries1 [] | 
| 60089 
8bd5999133d4
let the system choose Graph_Display.display_graph_old: thm_deps needs tree hierarchy, code_deps needs cycles (!?);
 wenzelm parents: 
60084diff
changeset | 47 | |> Graph_Display.display_graph_old | 
| 59210 
8658b4290aed
clarified Graph_Display.graph etc.: sort_graph determines order from structure (and names);
 wenzelm parents: 
59208diff
changeset | 48 | end; | 
| 26697 | 49 | |
| 50 | ||
| 51 | (* unused_thms *) | |
| 52 | ||
| 53 | fun unused_thms (base_thys, thys) = | |
| 26185 | 54 | let | 
| 61507 | 55 | fun add_fact transfer space (name, ths) = | 
| 39557 
fe5722fce758
renamed structure PureThy to Pure_Thy and moved most content to Global_Theory, to emphasize that this is global-only;
 wenzelm parents: 
37870diff
changeset | 56 | if exists (fn thy => Global_Theory.defined_fact thy name) base_thys then I | 
| 33170 | 57 | else | 
| 58 |         let val {concealed, group, ...} = Name_Space.the_entry space name in
 | |
| 59 | fold_rev (fn th => | |
| 36744 
6e1f3d609a68
renamed Thm.get_name -> Thm.derivation_name and Thm.put_name -> Thm.name_derivation, to emphasize the true nature of these operations;
 wenzelm parents: 
33769diff
changeset | 60 | (case Thm.derivation_name th of | 
| 33170 | 61 | "" => I | 
| 61507 | 62 | | a => cons (a, (transfer th, concealed, group)))) ths | 
| 33170 | 63 | end; | 
| 61507 | 64 | fun add_facts thy = | 
| 65 | let | |
| 66 | val transfer = Global_Theory.transfer_theories thy; | |
| 67 | val facts = Global_Theory.facts_of thy; | |
| 68 | in Facts.fold_static (add_fact transfer (Facts.space_of facts)) facts end; | |
| 33170 | 69 | |
| 33769 
6d8630fab26a
unused_thms: show only results from 'theorem(s)' package (via old-style kinds);
 wenzelm parents: 
33642diff
changeset | 70 | val new_thms = | 
| 61507 | 71 | fold add_facts thys [] | 
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58893diff
changeset | 72 | |> sort_distinct (string_ord o apply2 #1); | 
| 28810 | 73 | |
| 33769 
6d8630fab26a
unused_thms: show only results from 'theorem(s)' package (via old-style kinds);
 wenzelm parents: 
33642diff
changeset | 74 | val used = | 
| 32810 
f3466a5645fa
back to simple fold_body_thms and fulfill_proof/thm_proof (reverting a900d3cd47cc) -- the cycle check is implicit in the future computation of join_proofs;
 wenzelm parents: 
32726diff
changeset | 75 | Proofterm.fold_body_thms | 
| 41565 
9718c32f9c4e
unused_thms no longer compares propositions, since this is no longer needed
 berghofe parents: 
41489diff
changeset | 76 | (fn (a, _, _) => a <> "" ? Symtab.update (a, ())) | 
| 44333 
cc53ce50f738
reverted to join_bodies/join_proofs based on fold_body_thms to regain performance (escpecially of HOL-Proofs) -- see also aa9c1e9ef2ce and 4e2abb045eac;
 wenzelm parents: 
44331diff
changeset | 77 | (map Proofterm.strip_thm (Thm.proof_bodies_of (map (#1 o #2) new_thms))) | 
| 44331 | 78 | Symtab.empty; | 
| 33170 | 79 | |
| 41565 
9718c32f9c4e
unused_thms no longer compares propositions, since this is no longer needed
 berghofe parents: 
41489diff
changeset | 80 | fun is_unused a = not (Symtab.defined used a); | 
| 28810 | 81 | |
| 57934 
5e500c0e7eca
tuned signature -- prefer self-contained user-space tool;
 wenzelm parents: 
49561diff
changeset | 82 | (*groups containing at least one used theorem*) | 
| 41565 
9718c32f9c4e
unused_thms no longer compares propositions, since this is no longer needed
 berghofe parents: 
41489diff
changeset | 83 | val used_groups = fold (fn (a, (_, _, group)) => | 
| 
9718c32f9c4e
unused_thms no longer compares propositions, since this is no longer needed
 berghofe parents: 
41489diff
changeset | 84 | if is_unused a then I | 
| 33170 | 85 | else | 
| 86 | (case group of | |
| 87 | NONE => I | |
| 33769 
6d8630fab26a
unused_thms: show only results from 'theorem(s)' package (via old-style kinds);
 wenzelm parents: 
33642diff
changeset | 88 | | SOME grp => Inttab.update (grp, ()))) new_thms Inttab.empty; | 
| 
6d8630fab26a
unused_thms: show only results from 'theorem(s)' package (via old-style kinds);
 wenzelm parents: 
33642diff
changeset | 89 | |
| 
6d8630fab26a
unused_thms: show only results from 'theorem(s)' package (via old-style kinds);
 wenzelm parents: 
33642diff
changeset | 90 | val (thms', _) = fold (fn (a, (th, concealed, group)) => fn q as (thms, seen_groups) => | 
| 
6d8630fab26a
unused_thms: show only results from 'theorem(s)' package (via old-style kinds);
 wenzelm parents: 
33642diff
changeset | 91 | if not concealed andalso | 
| 42473 | 92 | (* FIXME replace by robust treatment of thm groups *) | 
| 61336 | 93 | Thm.legacy_get_kind th = Thm.theoremK andalso is_unused a | 
| 33769 
6d8630fab26a
unused_thms: show only results from 'theorem(s)' package (via old-style kinds);
 wenzelm parents: 
33642diff
changeset | 94 | then | 
| 33170 | 95 | (case group of | 
| 33769 
6d8630fab26a
unused_thms: show only results from 'theorem(s)' package (via old-style kinds);
 wenzelm parents: 
33642diff
changeset | 96 | NONE => ((a, th) :: thms, seen_groups) | 
| 26185 | 97 | | SOME grp => | 
| 33769 
6d8630fab26a
unused_thms: show only results from 'theorem(s)' package (via old-style kinds);
 wenzelm parents: 
33642diff
changeset | 98 | if Inttab.defined used_groups grp orelse | 
| 
6d8630fab26a
unused_thms: show only results from 'theorem(s)' package (via old-style kinds);
 wenzelm parents: 
33642diff
changeset | 99 | Inttab.defined seen_groups grp then q | 
| 
6d8630fab26a
unused_thms: show only results from 'theorem(s)' package (via old-style kinds);
 wenzelm parents: 
33642diff
changeset | 100 | else ((a, th) :: thms, Inttab.update (grp, ()) seen_groups)) | 
| 
6d8630fab26a
unused_thms: show only results from 'theorem(s)' package (via old-style kinds);
 wenzelm parents: 
33642diff
changeset | 101 | else q) new_thms ([], Inttab.empty); | 
| 26185 | 102 | in rev thms' end; | 
| 103 | ||
| 7765 
fa28bac7903c
New function thm_deps for visualizing dependencies of theorems.
 berghofe parents: diff
changeset | 104 | end; |