src/Pure/fact_index.ML
author paulson
Wed, 19 Jul 2006 11:55:26 +0200
changeset 20153 6ff5d35749b0
parent 20010 bcadd6e7739c
child 20156 7a7898b1cfa4
permissions -rw-r--r--
Fixed the bugs introduced by the last commit! Output is now *identical* to that produced by the old version, based on a-lists.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/fact_index.ML
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, TU Muenchen
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
     4
16020
ace2c610b5be major tuning;
wenzelm
parents: 15570
diff changeset
     5
Facts indexed by consts or frees.
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
     6
*)
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
     7
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
     8
signature FACT_INDEX =
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
     9
sig
16020
ace2c610b5be major tuning;
wenzelm
parents: 15570
diff changeset
    10
  type spec
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    11
  type T
16020
ace2c610b5be major tuning;
wenzelm
parents: 15570
diff changeset
    12
  val facts: T -> (string * thm list) list
20010
bcadd6e7739c added props selector;
wenzelm
parents: 19141
diff changeset
    13
  val props: T -> thm list
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    14
  val could_unify: T -> term -> thm list
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    15
  val empty: T
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    16
  val add_global: (string * thm list) -> T -> T
19141
22893b10e2d0 add_local: do_index;
wenzelm
parents: 18931
diff changeset
    17
  val add_local: bool -> (string -> bool) -> (string * thm list) -> T -> T
16020
ace2c610b5be major tuning;
wenzelm
parents: 15570
diff changeset
    18
  val find: T -> spec -> (string * thm list) list
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    19
end;
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    20
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    21
structure FactIndex: FACT_INDEX =
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    22
struct
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    23
16020
ace2c610b5be major tuning;
wenzelm
parents: 15570
diff changeset
    24
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    25
(* indexing items *)
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    26
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    27
type spec = string list * string list;
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    28
16874
wenzelm
parents: 16491
diff changeset
    29
val add_consts = fold_aterms
wenzelm
parents: 16491
diff changeset
    30
  (fn Const (c, _) => if c = Term.dummy_patternN then I else insert (op =) c | _ => I);
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    31
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    32
fun add_frees known = fold_aterms
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    33
  (fn Free (x, _) => if known x then insert (op =) x else I | _ => I);
16874
wenzelm
parents: 16491
diff changeset
    34
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    35
fun index_term known t (cs, xs) = (add_consts t cs, add_frees known t xs);
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    36
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    37
fun index_thm known th idx =
16020
ace2c610b5be major tuning;
wenzelm
parents: 15570
diff changeset
    38
  let val {tpairs, hyps, prop, ...} = Thm.rep_thm th in
ace2c610b5be major tuning;
wenzelm
parents: 15570
diff changeset
    39
    idx
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    40
    |> index_term known prop
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    41
    |> fold (index_term known) hyps
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    42
    |> fold (fn (t, u) => index_term known t #> index_term known u) tpairs
16020
ace2c610b5be major tuning;
wenzelm
parents: 15570
diff changeset
    43
  end;
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    44
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    45
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    46
(* build index *)
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    47
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    48
type fact = string * thm list;
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    49
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    50
datatype T = Index of
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    51
 {facts: fact list,
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    52
  consts: (serial * fact) list Symtab.table,
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    53
  frees: (serial * fact) list Symtab.table,
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    54
  props: thm Net.net};
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    55
16020
ace2c610b5be major tuning;
wenzelm
parents: 15570
diff changeset
    56
fun facts (Index {facts, ...}) = facts;
20010
bcadd6e7739c added props selector;
wenzelm
parents: 19141
diff changeset
    57
fun props (Index {props, ...}) =
bcadd6e7739c added props selector;
wenzelm
parents: 19141
diff changeset
    58
  sort_distinct (Term.term_ord o pairself Thm.full_prop_of) (Net.content props);
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    59
fun could_unify (Index {props, ...}) = Net.unify_term props;
16020
ace2c610b5be major tuning;
wenzelm
parents: 15570
diff changeset
    60
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    61
val empty =
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    62
  Index {facts = [], consts = Symtab.empty, frees = Symtab.empty, props = Net.empty};
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    63
19141
22893b10e2d0 add_local: do_index;
wenzelm
parents: 18931
diff changeset
    64
fun add do_props do_index known (fact as (_, ths)) (Index {facts, consts, frees, props}) =
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    65
  let
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    66
    val entry = (serial (), fact);
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    67
    val (cs, xs) = fold (index_thm known) ths ([], []);
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    68
19141
22893b10e2d0 add_local: do_index;
wenzelm
parents: 18931
diff changeset
    69
    val (facts', consts', frees') =
22893b10e2d0 add_local: do_index;
wenzelm
parents: 18931
diff changeset
    70
      if do_index then
22893b10e2d0 add_local: do_index;
wenzelm
parents: 18931
diff changeset
    71
       (fact :: facts,
22893b10e2d0 add_local: do_index;
wenzelm
parents: 18931
diff changeset
    72
        consts |> fold (fn c => Symtab.update_list (c, entry)) cs,
22893b10e2d0 add_local: do_index;
wenzelm
parents: 18931
diff changeset
    73
        frees |> fold (fn x => Symtab.update_list (x, entry)) xs)
22893b10e2d0 add_local: do_index;
wenzelm
parents: 18931
diff changeset
    74
      else (facts, consts, frees);
22893b10e2d0 add_local: do_index;
wenzelm
parents: 18931
diff changeset
    75
    val props' =
22893b10e2d0 add_local: do_index;
wenzelm
parents: 18931
diff changeset
    76
      if do_props then props |> fold (fn th => Net.insert_term (K false) (Thm.prop_of th, th)) ths
22893b10e2d0 add_local: do_index;
wenzelm
parents: 18931
diff changeset
    77
      else props;
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    78
  in Index {facts = facts', consts = consts', frees = frees', props = props'} end;
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    79
19141
22893b10e2d0 add_local: do_index;
wenzelm
parents: 18931
diff changeset
    80
val add_global = add false true (K false);
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    81
val add_local = add true;
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    82
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    83
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    84
(* find by consts/frees *)
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    85
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    86
local
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    87
16491
7310d0a36599 OrdList.inter;
wenzelm
parents: 16020
diff changeset
    88
fun fact_ord ((i, _), (j, _)) = int_ord (j, i);
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    89
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    90
fun intersects [xs] = xs
16491
7310d0a36599 OrdList.inter;
wenzelm
parents: 16020
diff changeset
    91
  | intersects xss =
7310d0a36599 OrdList.inter;
wenzelm
parents: 16020
diff changeset
    92
      if exists null xss then []
7310d0a36599 OrdList.inter;
wenzelm
parents: 16020
diff changeset
    93
      else fold (OrdList.inter fact_ord) (tl xss) (hd xss);
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
    94
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    95
in
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
    96
16020
ace2c610b5be major tuning;
wenzelm
parents: 15570
diff changeset
    97
fun find idx ([], []) = facts idx
ace2c610b5be major tuning;
wenzelm
parents: 15570
diff changeset
    98
  | find (Index {consts, frees, ...}) (cs, xs) =
18931
427df66052a1 TableFun: renamed xxx_multi to xxx_list;
wenzelm
parents: 18026
diff changeset
    99
      (map (Symtab.lookup_list consts) cs @
427df66052a1 TableFun: renamed xxx_multi to xxx_list;
wenzelm
parents: 18026
diff changeset
   100
        map (Symtab.lookup_list frees) xs) |> intersects |> map #2;
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
   101
18026
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
   102
end
ccf2972f6f89 added add_local/add_global;
wenzelm
parents: 17412
diff changeset
   103
13270
d7f35250cbad Facts indexed by consts or (some) frees.
wenzelm
parents:
diff changeset
   104
end;