This file is indexed.

/usr/share/hol88-2.02.19940316/Library/window/inter.ml is in hol88-library-source 2.02.19940316-31.

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
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
% --------------------------------------------------------------------- %
%       Copyright (c) Jim Grundy 1992                                   %
%       All rights reserved                                             %
%                                                                       %
% Jim Grundy, hereafter referred to as `the Author', retains the        %
% copyright and all other legal rights to the Software contained in     %
% this file, hereafter referred to as `the Software'.                   %
%                                                                       %
% The Software is made available free of charge on an `as is' basis.    %
% No guarantee, either express or implied, of maintenance, reliability, %
% merchantability or suitability for any purpose is made by the Author. %
%                                                                       %
% The user is granted the right to make personal or internal use        %
% of the Software provided that both:                                   %
% 1. The Software is not used for commercial gain.                      %
% 2. The user shall not hold the Author liable for any consequences     %
%    arising from use of the Software.                                  %
%                                                                       %
% The user is granted the right to further distribute the Software      %
% provided that both:                                                   %
% 1. The Software and this statement of rights is not modified.         %
% 2. The Software does not form part or the whole of a system           %
%    distributed for commercial gain.                                   %
%                                                                       %
% The user is granted the right to modify the Software for personal or  %
% internal use provided that all of the following conditions are        %
% observed:                                                             %
% 1. The user does not distribute the modified software.                %
% 2. The modified software is not used for commercial gain.             %
% 3. The Author retains all rights to the modified software.            %
%                                                                       %
% Anyone seeking a licence to use this software for commercial purposes %
% is invited to contact the Author.                                     %
% --------------------------------------------------------------------- %
%============================================================================%
% CONTENTS: interactive front end to the window infernce library.            %
%============================================================================%
%$Id: inter.ml,v 3.1 1993/12/07 14:15:19 jg Exp $%

% In this file we extend the functional interface described in win.ml.  %
% This file desribes an interactive interface.                          %
% The interface is stack based.                                         %

% A General History Mechanism is defined.                               %
abstype * history  = (int # (* list) # (* list))
    %   Create a new history with intial size size and state state.     %
    with epoch size state =
            abs_history(size, [state],[])
    %   Return the current state of the history.                        %
    and present hist =
            let (_,pres._,_) = rep_history hist in
                pres
    %   Makes (event (present hist)) the current state.                 %
    and dodo event hist =
            let (size, pres.past,_) = rep_history hist in
                abs_history (size, first size ((event pres).pres.past) ,[])
    %   Undoes the last event.                                          %
    and undo hist =
            let (size, pres.past,future) = rep_history hist in
                if (null past) then
                    failwith `undo: nothing to undo`
                else
                    abs_history(size, past, pres.future)
    %   Undoes an undo, but only if no interveening event has occured.  %
    and redo hist =
            let (size,past,future) = rep_history hist in
                if (null future) then
                    failwith `redo: nothing to redo`
                else
                    abs_history
                        (size, first size ((hd future).past), tl future)
    and set_max_hist size hist =
            let (_,past,future) = rep_history hist in
                if size < 1 then
                    failwith `set_max_hist: size must be at least 1.`
                else
                    abs_history(size,past,future)
    and get_max_hist hist =
            let (size,_,_) = rep_history hist in
                size
    ;;

abstype window_stack =
    (window # (((window -> window -> window) # win_path) + void)) list
    %   Create a new window stack containing window w.                  %
    with create_stack w =
            abs_window_stack [(w,  (inr ()))]
    %   Apply some transformation to the top window of the stack.       %
    and change_window f st =
            let ((w,cp).tl) = (rep_window_stack st) in
                abs_window_stack ((f w,cp).tl)
    %   Open a new window, requires a path and a basis function.        %
    and open_window p' basis st =
            let ((w,cp).tl) = (rep_window_stack st) in
            let (w',c') = (basis p' w) in
                abs_window_stack ((w',inl (c',p')).(w,cp).tl)
    %   Removes the top window from the stack.                          %
    and pop_window st =
            (let (w1.w2.w3) = (rep_window_stack st) in
                abs_window_stack (w2.w3)
            ) ? failwith `pop_window: only 1 window left`
    %   Removes the top window and transforms the one below.            %
    and close_window st =
            let ((w1,cp1).(w2,cp2).tl) = (rep_window_stack st) in
            let (c1,_) = outl cp1 in
                abs_window_stack ((c1 w1 w2,cp2).tl)
    %   The current depth of the stack.                                 %
    and depth_stack st =
            length (rep_window_stack st)
    %   The window on top of the stack.                                 %
    and top_window st =
            fst (hd (rep_window_stack st))
    %   The path that the current window was opened on.                 %
    %   Fails for the first window in the stack - it had no path.       %
    and top_path st =
            (snd (outl (snd (hd (rep_window_stack st)))))
            ? failwith `top_path: bottom window` ;;

% Next come a bunch of functions required printing a stack.             %
% Actually only prints the window on top of the stack.                  %

% The conjectures which are used in the top window and are not valid    %
%   in the window below.                                                %
let bad_conjectures st =
    let topwin = top_window st in
    let bnds = bound topwin in
    let usedcnjs = used_conjectures topwin in
        if (depth_stack st) > 1 then
        (
            let winbelow =
                transfer_sups_thms topwin (top_window (pop_window st)) in
            let hypsbelow = all_hypotheses winbelow in
            let lemsbelow = lemmas winbelow in
            let cnjsbelow = conjectures winbelow in
                (filter
                    (\c. not
                        (term_mem c (hypsbelow @ lemsbelow @ cnjsbelow)))
                    usedcnjs)
                @
                (filter
                    (\c. not (null (intersect bnds (frees c))))
                    usedcnjs)
        )
        else
            usedcnjs;;

% Give a friendly picture of the stack.                                 %
% Only the top window is displayed.                                     %
% Each of the hypotheses appears with a "!" infront of it.              %
% Each of the lemmas appears with a "|" infront of it.                  %
% Each of the conjectures appears with a "?" infront of it.             %
% Each of the used conjectures appears with a "$" infront of it.        %
% Each of the bad conjectures appears with a "@" infront of it.         %
% The relation and focus are then printed last.                         %
let print_stack st =
    let rel_pic (tm:term) =
        if (is_const tm) then
            fst (dest_const tm)
        else `??` in
    let topwin = top_window st in
    let hyps = disp_hypotheses topwin in
    let cnjs = conjectures topwin in
    let usedcnjs = used_conjectures topwin in
    let lems = lemmas topwin in
    let badcnjs = bad_conjectures st in
    let rel = rel_pic (relation topwin) in
    let rellen = length (explode rel) in
    letref all = term_setify ((rev hyps) @ (rev lems) @ (rev cnjs)) in
        while not (null all) do
        (
            let h.t = all in
                print_string (implode (replicate ` ` rellen));
                (if (term_mem h badcnjs) then
                    print_string ` @ `
                else if (term_mem h usedcnjs) then
                    print_string ` $ `
                else if (term_mem h hyps) then
                    print_string ` ! `
                else if (term_mem h lems) then
                    print_string ` | `
                else % An unused conjecture. %
                    print_string ` ? `);
                print_ibegin (rellen + 4);
                    print_unquoted_term h;
                print_end ();
                print_newline ();
                all := t
        );
        print_string rel;
        print_string ` * `;
        print_ibegin (rellen + 4);
            print_unquoted_term (focus topwin);
        print_end ();
        print_newline ();;

% We now set up functions to handle a tabel of                              %
%   window_stack history pointers.                                          %
% Each element in the table is a pair of the name of a                      %
%   window_stack (history) and a pointer to it.                             %
% There is also a pair cur_nam_st_hist with the name of the current         %
%   stack and a pointer to it.                                              %
% cur_nam_st_hist can also be void in the event of their being no           %
%   current stack.                                                          %

% We also set up some signals which are made when the current stack         %
%   changes.   These are used to alert centaur so it can update its         %
%   displayes.   They can also be used to set the window stripe on an       %
%   xterm to the name of the current stack.   They are also used to print   %
%   a fresh view of the stack when necessary.                               %

sigtype `stk_sig` `string`;;
sigtype `win_sig` `void`;;

let beg_stack_sig = newsig_stk_sig ();;
let end_stack_sig = newsig_stk_sig ();;
let set_stack_sig = newsig_stk_sig ();;

let psh_win_sig = newsig_win_sig ();;
let pop_win_sig = newsig_win_sig ();;
let cng_win_sig = newsig_win_sig ();;

begin_section tablesec;;

    ptrtype `wshp` `window_stack history`;;

    letref stack_table = [] : (string # window_stack history pointer) list;;
    letref cur_nam_st_hist =
        (inr ()) : ((string # window_stack history pointer) + void);;

    let CURRENT_STACK (():void) =
        (present (value (snd (outl cur_nam_st_hist))))
        ? failwith `CURRENT_STACK: no current stack`;;

    let CURRENT_NAME (():void) =
        (fst (outl cur_nam_st_hist))
        ? failwith `CURRENT_NAME: no current name`;;

    let CURRENT_SHP (():void) =
        (snd (outl cur_nam_st_hist)) ? failwith `no current stack`;;

    % There are versions of all the history functions which side-effect the %
    %   current window_stack history.                                       %

    letref history_size = 20;;

    let EPOCH s =
        let the_stack = (CURRENT_SHP ()) in
            store the_stack (epoch history_size s);;

    let DO f = 
        let the_stack = (CURRENT_SHP ()) in
            store the_stack (dodo f (value the_stack));;

    let UNDO (():void) =
        let the_stack = (CURRENT_SHP ()) in
        let old_depth = depth_stack (present (value the_stack)) in
        let new_depth = depth_stack (present (undo (value the_stack))) in
            store the_stack (undo (value the_stack));
            if old_depth = new_depth then
                signal cng_win_sig ()
            else if old_depth < new_depth then
                signal psh_win_sig ()
            else % old_depth > new_depth %
                signal pop_win_sig ();;

    let REDO (():void) =
        let the_stack = (CURRENT_SHP ()) in
        let old_depth = depth_stack (present (value the_stack)) in
        let new_depth = depth_stack (present (redo (value the_stack))) in
            store the_stack (redo (value the_stack));
            if old_depth = new_depth then
                signal cng_win_sig ()
            else if old_depth < new_depth then
                signal psh_win_sig ()
            else % old_depth > new_depth %
                signal pop_win_sig ();;

    % Set the size of the history on all stacks.                            %
    let SET_MAX_HIST size =
        history_size := size;
        map (\(_,shp). store shp (set_max_hist size (value shp))) stack_table;;

    % Get the size of the history.                                          %
    let GET_MAX_HIST (():void) = history_size;;

    % Start a new stack.                                                    %
    % The new stack becomes the current stack.                              %
    let BEGIN_STACK name relfoc hyps thms =
        if mem name (map fst stack_table) then
            failwith `BEGIN_STACK: stack exists`
        else
            (
                cur_nam_st_hist := (inl (name, new_wshp ()));
                EPOCH
                    (create_stack (create_win relfoc (rev hyps) (rev thms)));
                stack_table := (outl cur_nam_st_hist).stack_table;
                signal beg_stack_sig name
            );;

    % Dispose of a named stack.                                             %
    % If the named stack is the current stack, then the current stack       %
    %   is left undefined.                                                  %
    let END_STACK name = 
        if mem name (map fst stack_table) then
            (
                (
                    if ((name = (CURRENT_NAME ())) ? false) then
                        do (cur_nam_st_hist := (inr ()))
                );
                stack_table := filter ((\(n,_). not (n = name))) stack_table;
                signal end_stack_sig name
            )
        else
            failwith `END_STACK: no such stack`;;

    % Set the current stack the the stack named.                            %
    let SET_STACK name =
        (
            do
            (
                cur_nam_st_hist := inl (assoc name stack_table);
                signal set_stack_sig name
            )
        ) ? failwith `SET_STACK: no such stack`;;

    % Return the named stack.                                               %
    let GET_STACK name =
        (present (value (snd (assoc name stack_table))))
        ? failwith `GET_STACK: no such stack`;;

    % The names of all the stacks.                                          %
    let ALL_STACKS (():void) = (map fst stack_table);;

    (
        CURRENT_STACK,
        CURRENT_NAME,
        DO,
        UNDO,
        REDO,
        SET_MAX_HIST,
        GET_MAX_HIST,
        BEGIN_STACK,
        END_STACK,
        SET_STACK,
        GET_STACK,
        ALL_STACKS
    );;

end_section tablesec;;

let (
        CURRENT_STACK,
        CURRENT_NAME,
        DO,
        UNDO,
        REDO,
        SET_MAX_HIST,
        GET_MAX_HIST,
        BEGIN_STACK,
        END_STACK,
        SET_STACK,
        GET_STACK,
        ALL_STACKS
    ) = it ;;

% Apply a opening basis to the stack to create a new window.            %
let APPLY_OPEN p basis =
    DO (open_window p basis);
    signal psh_win_sig ();;

% Apply a window transforming function to the top of the stack.         %
let APPLY_TRANSFORM f = 
    DO (change_window f);
    signal cng_win_sig ();;

% Since life is no longer functional, you have to close windows after   %
% you have finished with them.                                          %
let CLOSE_WIN (():void) =
    (DO close_window) ? failwith `CLOSE_WIN`;
    signal pop_win_sig ();;

% Pops the top window of the current stack.                             %
let UNDO_WIN (():void) =
    DO pop_window;
    signal pop_win_sig ();;
    
% Stack based versions of the window opening commands.                  %
let GEN_OPEN_WIN p = APPLY_OPEN p gen_open_basis
and OPEN_WIN p = APPLY_OPEN (FOCUS_PATH p) open_win_basis
and OPEN_CONTEXT tm p = APPLY_OPEN (CONTEXT_PATH (tm,p)) open_context_basis
and ESTABLISH tm = APPLY_OPEN (CONTEXT_PATH (tm,[])) establish_basis;;

% Analogues of all the functional commands.                             %

let TOP_WIN (():void) = top_window (CURRENT_STACK ())
and BAD_CONJECTURES (():void) = bad_conjectures (CURRENT_STACK ());;

let TRANSFORM_WIN tr = APPLY_TRANSFORM (transform_win tr)
and MATCH_TRANSFORM_WIN tr = APPLY_TRANSFORM (match_transform_win tr)
and CONVERT_WIN c = APPLY_TRANSFORM (convert_win c)
and RULE_WIN inf = APPLY_TRANSFORM (rule_win inf)
and THM_RULE_WIN inf = APPLY_TRANSFORM (thm_rule_win inf)
and FOC_RULE_WIN inf = APPLY_TRANSFORM (foc_rule_win inf)
and TACTIC_WIN tac = APPLY_TRANSFORM (tactic_win tac)
and ADD_THEOREM th = APPLY_TRANSFORM (add_theorem th)
and ADD_SUPPOSE sup = APPLY_TRANSFORM (add_suppose sup)
and CONJECTURE tm = APPLY_TRANSFORM (conjecture tm);;

let FOCUS (():void) = focus (TOP_WIN ())
and LEMMA_THMS (():void) = lemma_thms (TOP_WIN ())
and WIN_THM (():void) = win_thm (TOP_WIN ());;

% Rewriting functions.							%
let GEN_REWRITE_WIN rewrite_fun built_in_rewrites =
    APPLY_TRANSFORM o (gen_rewrite_win rewrite_fun built_in_rewrites)
and PURE_REWRITE_WIN = APPLY_TRANSFORM o pure_rewrite_win
and REWRITE_WIN = APPLY_TRANSFORM o rewrite_win
and PURE_ONCE_REWRITE_WIN = APPLY_TRANSFORM o pure_once_rewrite_win
and ONCE_REWRITE_WIN = APPLY_TRANSFORM o once_rewrite_win
and PURE_ASM_REWRITE_WIN = APPLY_TRANSFORM o pure_asm_rewrite_win
and ASM_REWRITE_WIN = APPLY_TRANSFORM o asm_rewrite_win
and PURE_ONCE_ASM_REWRITE_WIN =
    APPLY_TRANSFORM o pure_once_asm_rewrite_win
and ONCE_ASM_REWRITE_WIN = APPLY_TRANSFORM o once_asm_rewrite_win
and FILTER_PURE_ASM_REWRITE_WIN f =
    APPLY_TRANSFORM o (filter_pure_asm_rewrite_win f)
and FILTER_ASM_REWRITE_WIN f =
    APPLY_TRANSFORM o (filter_asm_rewrite_win f)
and FILTER_PURE_ONCE_ASM_REWRITE_WIN f =
    APPLY_TRANSFORM o (filter_pure_once_asm_rewrite_win f)
and FILTER_ONCE_ASM_REWRITE_WIN f =
    APPLY_TRANSFORM o (filter_once_asm_rewrite_win f);;

% Save the theorem on the top of the window stack.                      %
let SAVE_WIN_THM (():void) =
    (save_thm (CURRENT_NAME (), WIN_THM ())) ? failwith `SAVE_WIN_THM`;;

% Print out the window stack.                                           %
let PRINT_STACK (():void) = print_stack (CURRENT_STACK ());;

% Set up the signals so that they print out a fresh view of the stack   %
% anytime something happens.                                            %
handle beg_stack_sig (\_. PRINT_STACK ());;
handle set_stack_sig (\_. PRINT_STACK ());;
handle psh_win_sig PRINT_STACK;;
handle cng_win_sig PRINT_STACK;;
handle pop_win_sig PRINT_STACK;;