This file is indexed.

/usr/share/hol88-2.02.19940316/Library/trs/search.ml is in hol88-library-source 2.02.19940316-35.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
% search.ml                                             (c) R.J.Boulton 1990 %
%----------------------------------------------------------------------------%


% Function to extract the theorems from a theory %

% The theorems are obtained from the theory as pairs of %
% (theorem name, structure). A 4-tuple is constructed   %
% by making this pair the third element of a 3-tuple    %
% where the first element is the kind of theorem and    %
% the second is the theory name.                        %

let get_theorems thry =

   % : (string -> foundthm list) %

   (map (\x.(Axiom,thry,x)) (axioms thry)) @
   (map (\x.(Definition,thry,x)) (definitions thry)) @
   (map (\x.(Theorem,thry,x)) (theorems thry));;


%----------------------------------------------------------------------------%


% Datatype for ways in which to search a theory file hierarchy %

% `Theory' means `search this theory only'.                                 %
% `Ancestors' means `search the first list of theories and their ancestors, %
% doing these theories first, then all of their parents, and so on'.        %
% If any theories are specified in the second list, they are removed from   %
% the list given at the first search level, and from any list of parents at %
% subsequent levels.                                                        %

type searchpath = Theory of string
                | Ancestors of string list # string list;;


% Datatype for possible sources of theorems for a search %

% `List' means `search this list of theorems'. %
% `Paths' means `search these paths in sequence'. %

% Note that to search the ancestry of the theories `theory1' and `theory2' %
% in `parallel', one would use the source:                                 %
%                                                                          %
% Paths [Ancestors ([`theory1`;`theory2`],[])]                             %
%                                                                          %
% To search them in sequence, one would use:                               %
%                                                                          %
% Paths [Ancestors ([`theory1`],[]); Ancestors ([`theory2`],[])]           %

type source = List of foundthm list
            | Paths of searchpath list;;


% Function to remove repetitions in a list, keeping the first duplicate %

% A new list is built from the original. Each element of the original list %
% is only added to the new list if it isn't already in it. Elements are    %
% added to the front of the new list, so the order is reversed. This is    %
% dealt with by reversing the new list before returning it as the result.  %

% `do_once_only' is defined and used here, rather than using `remove_rep', %
% because the lists it is processing have a special order.                 %

let do_once_only l =

   % : (* list -> * list) %

   letrec do_once_only' newl oldl =

      % : (* list -> * list -> * list) %

      if (null oldl)
      then rev newl
      else if (mem (hd oldl) newl)
           then do_once_only' newl (tl oldl)
           else do_once_only' ((hd oldl).newl) (tl oldl)
   in do_once_only' [] l;;


% Function to expand a list of theories into a list of them and all their %
% ancestors. The new list contains no repetitions, and it is in the       %
% correct order for searching the ancestry in a breath-first manner.      %
% In addition, any theories specified in the second list, and any of      %
% their ancestors, will not be included in the result. If, however, a     %
% theory is both an ancestor of a theory in the exclusion list, and also  %
% an ancestor of a theory in the source list, which is not in the list of %
% exclusions, it will be included in the result.                          %

% The new list is built up by concatenating levels of ancestry. The first %
% level of ancestry consists of the theories given in the original list,  %
% less any in the exclusion list. The second level of ancestry consists   %
% of the parents of the original theories less the original theories and  %
% any in the exclusion list (the ancestry may be an acyclic directed      %
% graph rather than just a tree). The third level is taken to be the      %
% parents of those included at the second level, less any theories        %
% previously included and less any theories which occur in the exclusion  %
% list. Further levels are constructed in a similar way. The process      %
% terminates when all the new parents have already been dealt with.       %

% The function `searchseq'' takes a list of exclusions, a list of         %
% theories already included, and a list of parents of the previous        %
% level's theories. If the list of parents is not empty, any theory in    %
% either the `done' list, or the exclusion list is removed from it.       %
% The result becomes the new level of theories. Each theory in the new    %
% list is converted to a list of parents. The resulting list of lists is  %
% then flattened, and any repetitions are removed in a way which          %
% preserves the search order. This list becomes the new list of parents.  %

% `searchseq'' is now called recursively with this list and a new `done'  %
% list consisting of the union of the old `done' list and the new level   %
% of theories. The exclusion list remains the same.                       %

% Due to the large amount of interdependence between theories, the lists  %
% will grow exponentially if duplicates are not removed at every          %
% opportunity. So, for this reason, duplicates are removed from the lists %
% of theories given by the user, before they are passed to the main part  %
% of the function. Similarly, duplicates are removed from the list of     %
% parents before passing it to `searchseq''. One also has to be careful   %
% not to introduce duplicates into the `done' list.                       %

let searchseq exclusions ancestors =

   % : (string list -> string list -> string list) %

   letrec searchseq' exclusions' done ancestors' =

      % : (string list -> string list -> string list -> string list) %

      if (null ancestors')
      then done
      else (let new = subtract ancestors' (done @ exclusions')

            % Note that maintaining the correct search order relies on %
            % `subtract' filtering its first argument based on the     %
            % contents of its second argument.                         %

            in  ((searchseq' exclusions' (done @ new)) o do_once_only o
                                                   flat o (map parents)) new)

   in searchseq' (do_once_only exclusions) [] (do_once_only ancestors);;


% Function to form an ordered list of theories from a list of searchpaths. %

% The sub-function `flatten_path' converts a single path to an ordered list %
% of theories. If the path is simply a theory, then a single-element list   %
% consisting of that theory is returned by `flatten_path'. If not,          %
% `searchseq' is used to find the ancestors of the theories given.          %

% Any duplicate paths in the path list are removed in a manner which does   %
% not affect the search order. `flatten_path' is then used to convert each  %
% path to a list of theories. This list of lists is flattened, and any      %
% duplicates are removed from the resulting list of theories.               %

let flatten_paths paths =

   % : (searchpath list -> string list) %

   let flatten_path path =

      % : (searchpath -> string list) %

      case path
      of (Theory x) . [x]
       | (Ancestors (xl,yl)) . searchseq yl xl
   in  (do_once_only o flat o (map flatten_path) o do_once_only) paths;;


% Datatype to allow a search to be `paused' after each theory has been %
% searched.                                                            %

% If there are no more theories to search, a list of theorems is returned %
% as an `Endofsearch'. Otherwise, a `Step' is returned, consisting of a   %
% list of theorems matched so far, and a function which given a null      %
% argument will perform the next step of the search.                      %

rectype searchstep = Endofsearch of foundthm list
                   | Step of foundthm list # (void -> searchstep);;


% Function to do a stepwise search for theorems matching a given pattern %

% If the source is just a list of theorems, it is filtered using the        %
% pattern. If the source is a list of paths, it is converted into a list of %
% theories to search, using `flatten_paths'. This is then passed to         %
% `make_step'.                                                              %

% `make_step' searches the theory at the head of its list, and forms a      %
% searchstep from the results. If the theory list is empty, the list of     %
% theorems found is returned. A theory is searched by extracting a list of  %
% theorems from it, and then filtering this list using the theorem pattern. %
% These new theorems are added to the existing list. Note that there can be %
% no duplication of theorems, since part of a `theorem' as represented here %
% is the name of the theory to which it belongs.                            %

% The name of the theory being searched is written to the terminal.         %

% See also the comments for the datatype `searchstep'.                      %

let find_theorems thmp src =

   % : (thmpattern -> source -> searchstep) %

   letrec make_step thmp ftl thryl =

      % : (thmpattern -> foundthm list -> string list -> searchstep) %

      if (null thryl)
      then (Endofsearch ftl)
      else (let output1 = print_string (`Searching theory `^(hd thryl))
            and output2 = print_newline()
            and newftl =
                   ftl @ (((thmfilter thmp) o get_theorems) (hd thryl))
            in  Step (newftl,(\().make_step thmp newftl (tl thryl))))

   in case src

      of (List ftl)    . (Endofsearch (thmfilter thmp ftl))

       | (Paths pathl) . (make_step thmp [] (flatten_paths pathl));;


% Function to extract the list of found theorems from a searchstep %

let show_step srchstp =

   % : (searchstep -> foundthm list) %

   case srchstp
   of (Endofsearch ftl) . ftl
    | (Step (ftl,_))    . ftl;;


% Function to continue a stepwise search %

% If the search has come to an end, this function fails. If not, the next  %
% step of the search is performed, by use of the function contained within %
% the searchstep. The result of the function is another searchstep.        %

let continue_search srchstp =

   % : (searchstep -> searchstep) %

   case srchstp
   of (Endofsearch _) . (failwith `continue_search`)
    | (Step (_,next)) . next ();;


%----------------------------------------------------------------------------%