This file is indexed.

/usr/share/hol88-2.02.19940316/Library/pair/exi.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
% --------------------------------------------------------------------- %
% 		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	%
% 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: functions for paired existential quantifications.           %
% --------------------------------------------------------------------- %
%$Id: exi.ml,v 3.2 1994/01/28 02:56:50 jug Exp $%

% ------------------------------------------------------------------------- %
% PEXISTS_CONV "(?p. t[p])" = (|- (?p. t[p]) = (t [@p. t[p]])               %
% ------------------------------------------------------------------------- %

let PEXISTS_CONV =
    let EXISTS_THM =
        let f = "f:*->bool" in
        let th = AP_THM EXISTS_DEF f in
                GEN f ((CONV_RULE (RAND_CONV BETA_CONV)) th) in
    (\tm.
        let g = mk_pabs (dest_pexists tm) in
        let th1 = ISPEC g EXISTS_THM in
        let th2 = PBETA_CONV (rhs (concl th1)) in
            th1 TRANS th2
    ) ? failwith `PEXISTS_CONV` ;;

% ------------------------------------------------------------------------- %
%    A |- ?p. t[p]                                                          %
% ------------------ PSELECT_RULE                                           %
%  A |- t[@p .t[p]]                                                         %
% ------------------------------------------------------------------------- %

let PSELECT_RULE = CONV_RULE PEXISTS_CONV ;;

% ------------------------------------------------------------------------- %
% PSELECT_CONV "t [@p. t[p]]" = (|- (t [@p. t[p]]) = (?p. t[p]))            %
% ------------------------------------------------------------------------- %

let PSELECT_CONV tm =
    (let right t =
	((is_pselect t) &
	paconv tm (rhs (concl (PBETA_CONV (mk_comb ((rand t), t))))))
    in
	let exi = mk_pexists (dest_pselect (find_term right tm)) in
	let th1 = SYM (PEXISTS_CONV exi) in
	let th2 = PALPHA tm (lhs(concl th1)) in
	    th2 TRANS th1
    ) ? failwith `PSELECT_CONV` ;;

% ------------------------------------------------------------------------- %
%  A |- t[@p .t[p]]                                                         %
% ------------------ PEXISTS_RULE                                           %
%    A |- ?p. t[p]                                                          %
% ------------------------------------------------------------------------- %

let PEXISTS_RULE = CONV_RULE PSELECT_CONV ;;

% ------------------------------------------------------------------------- %
%    A |- P t                                                               %
% -------------- PSELECT_INTRO                                              %
%  A |- P($@ P)                                                             %
% ------------------------------------------------------------------------- %

let PSELECT_INTRO = SELECT_INTRO ;;

% ------------------------------------------------------------------------- %
%  A1 |- f($@ f)  ,  A2, f p |- t                                           %
% -------------------------------- PSELECT_ELIM th1 ("p", th2) [p not free] %
%          A1 u A2 |- t                                                     %
% ------------------------------------------------------------------------- %

let PSELECT_ELIM th1 (v,th2) =
    (let (f,sf) = dest_comb (concl th1) in
	let t1 = MP (PSPEC sf (PGEN v (DISCH (mk_comb(f,v)) th2))) th1 in
	let t2 = ALPHA (concl t1) (concl th2) in
	    EQ_MP t2 t1
    ) ? failwith `PSELECT_ELIM` ;;

% ------------------------------------------------------------------------- %
%  A |- t[q]                                                                %
% ----------------- PEXISTS ("?p. t[p]", "q")                               %
%  A |- ?p. t[p]                                                            %
% ------------------------------------------------------------------------- %

let PEXISTS (fm,tm) th =
    (let (p,b) = dest_pexists fm in
    let th1 = PBETA_CONV (mk_comb(mk_pabs(p,b),tm)) in
    let th2 = EQ_MP (SYM th1) th in
    let th3 = PSELECT_INTRO th2 in
    let th4 = AP_THM
		(INST_TYPE [(type_of p, mk_vartype `*`)] EXISTS_DEF)
		(mk_pabs (p, b)) in
    let th5 = TRANS th4 (BETA_CONV(snd(dest_eq(concl th4)))) in
	EQ_MP (SYM th5) th3
    ) ? failwith `PEXISTS` ;;

% ------------------------------------------------------------------------- %
%  A1 |- ?p. t[p]  ,  A2, t[v] |- u                                         %
% ---------------------------------- PCHOOSE (v,th1) th2 [v not free]       %
%             A1 u A2 |- u                                                  %
% ------------------------------------------------------------------------- %

let PCHOOSE =
    let f = "f:*->bool" in
    let t1 = AP_THM EXISTS_DEF f in
    let t2 = GEN f ((CONV_RULE (RAND_CONV BETA_CONV)) t1) in
    \(v,th1) th2.
	(
	    let p = rand (concl th1) in
	    let bet = PBETA_CONV (mk_comb(p,v)) in
	    if not(mem (rhs (concl bet)) (hyp th2)) then
		failwith `theorems not in the correct form`
	    else
	    let th1' = EQ_MP (ISPEC p t2) th1 in
	    let u1 = UNDISCH (fst (EQ_IMP_RULE bet)) in
	    let th2' = PROVE_HYP u1 th2 in
		PSELECT_ELIM th1' (v,th2')
	) ?\s failwith (`PCHOOSE: `^s);;

let P_PCHOOSE_THEN v ttac pth :tactic =
    let (p,b) = dest_pexists (concl pth) ? failwith `P_PCHOOSE_THEN` in
	\(asl,w).
	    let th =
		itlist
		    ADD_ASSUM
		    (hyp pth)
		    (ASSUME
			(rhs (concl (PBETA_CONV (mk_comb(mk_pabs(p,b), v))))))
	    in
	    let (gl,prf) = ttac th (asl,w) in
		(gl, (PCHOOSE (v, pth)) o prf) ;;

let PCHOOSE_THEN ttac pth :tactic =
    let (p,b) = dest_pexists (concl pth) ? failwith `CHOOSE_THEN` in
	\(asl,w).
	    let q = pvariant ((thm_frees pth) @ (freesl (w.asl))) p in
	    let th =
		itlist
		    ADD_ASSUM
		    (hyp pth)
		    (ASSUME
			(rhs
			    (concl
				(PAIRED_BETA_CONV (mk_comb(mk_pabs(p,b), q))))))
	    in
	    let (gl,prf) = ttac th (asl,w) in
		(gl, (PCHOOSE (q, pth)) o prf) ;;

let P_PCHOOSE_TAC p = P_PCHOOSE_THEN p ASSUME_TAC ;;

let PCHOOSE_TAC = PCHOOSE_THEN ASSUME_TAC ;;

% ------------------------------------------------------------------------- %
%  A ?- ?p. t[p]                                                            %
% =============== PEXISTS_TAC "u"                                           %
%    A ?- t[u]                                                              %
% ------------------------------------------------------------------------- %

let PEXISTS_TAC v :tactic (a, t) =
    (let (p,b) = dest_pexists t in
	([a, rhs (concl (PBETA_CONV (mk_comb((mk_pabs (p,b)),v))))],
	 \[th]. PEXISTS (t,v) th)
    ) ? failwith `PEXISTS_TAC` ;;

% ------------------------------------------------------------------------- %
%  |- ?!p. t[p]                                                             %
% -------------- PEXISTENCE                                                 %
%  |- ?p. t[p]                                                              %
% ------------------------------------------------------------------------- %

let PEXISTENCE th =
    (let (p,b) = dest_pabs (rand (concl th)) in
    let th1 =
	AP_THM
	    (INST_TYPE [(type_of p, mk_vartype `*`)] EXISTS_UNIQUE_DEF)
	    (mk_pabs(p,b)) in
    let th2 = EQ_MP th1 th in
    let th3 = CONV_RULE BETA_CONV th2 in
	CONJUNCT1 th3 
    ) ? failwith `PEXISTENCE` ;;
    
% ------------------------------------------------------------------------- %
% PEXISTS_UNIQUE_CONV "?!p. t[p]" =                                         %
%   (|- (?!p. t[p]) = (?p. t[p] /\ !p p'. t[p] /\ t[p'] ==> (p='p)))        %
% ------------------------------------------------------------------------- %

let PEXISTS_UNIQUE_CONV tm =
    (let (p,b) = dest_pabs (rand tm) in
    let p' = pvariant (p.(frees tm)) p in
    let th1 =
	AP_THM
	    (INST_TYPE [(type_of p, mk_vartype `*`)] EXISTS_UNIQUE_DEF)
	    (mk_pabs(p,b)) in
    let th2 = CONV_RULE (RAND_CONV BETA_CONV) th1 in
    let th3 = CONV_RULE (RAND_CONV (RAND_CONV (RAND_CONV (ABS_CONV 
		(GEN_PALPHA_CONV p'))))) th2 in
    let th4 = CONV_RULE (RAND_CONV (RAND_CONV (GEN_PALPHA_CONV p))) th3 in
    let th5 = CONV_RULE (RAND_CONV (RAND_CONV (RAND_CONV (PABS_CONV
		(RAND_CONV (PABS_CONV (RATOR_CONV (RAND_CONV
		(RATOR_CONV (RAND_CONV PBETA_CONV)))))))))) th4 in
	CONV_RULE (RAND_CONV (RAND_CONV (RAND_CONV (PABS_CONV
	    (RAND_CONV (PABS_CONV (RATOR_CONV (RAND_CONV
	    (RAND_CONV PBETA_CONV))))))))) th5
    ) ? failwith `PEXISTS_UNIQUE_CONV` ;;

% ------------------------------------------------------------------------- %
% P_PSKOLEM_CONV : introduce a skolem function.                             %
%                                                                           %
%   |- (!x1...xn. ?y. tm[x1,...,xn,y])                                      %
%        =                                                                  %
%      (?f. !x1...xn. tm[x1,..,xn,f x1 ... xn]                              %
%                                                                           %
% The first argument is the function f.                                     %
% ------------------------------------------------------------------------- %

begin_section skolemsec ;;

    let BABY_P_PSKOLEM_CONV f =
	if (not(is_pvar f)) then
	    failwith `P_SKOLEM_CONV: first argument not a variable`
	else
	    \tm.
	    (
		let (xs,(y,P)) = (I # dest_exists) (strip_pforall tm) in
		let fx = list_mk_comb(f,xs) ?
		    failwith `function variable has the wrong type` in
		if (free_in f tm) then
		    failwith `skolem function free in the input term`
		else
		    let pat =
			mk_exists(f,(list_mk_pforall(xs,subst [(fx,y)] P))) in
		    let fn = list_mk_pabs(xs,mk_select(y,P)) in
		    let bth = SYM(LIST_PBETA_CONV (list_mk_comb(fn,xs))) in
		    let thm1 =
			SUBST [bth,y] P (SELECT_RULE (PSPECL xs (ASSUME tm))) in
		    let imp1 = DISCH tm (EXISTS (pat,fn) (PGENL xs thm1)) in
		    let thm2 = PSPECL xs (ASSUME (snd(dest_exists pat))) in
		    let thm3 = PGENL xs (EXISTS (mk_exists(y,P),fx) thm2) in
		    let imp2 = DISCH pat (CHOOSE (f,ASSUME pat) thm3) in
			IMP_ANTISYM_RULE imp1 imp2
	    );;


    letrec P_PSKOLEM_CONV f =
	if (not (is_pvar f)) then
	    failwith `P_SKOLEM_CONV: first argument not a variable pair`
	else
	    \tm.
	    (
		let (xs,(y,P)) = (I # dest_pexists) (strip_pforall tm) ?
		    failwith `expecting "!x1...xn. ?y.tm"` in
		let FORALL_CONV =
		     (end_itlist
			(curry $o)
			(map (K (RAND_CONV o PABS_CONV)) xs)
		     )? failwith `expecting "!x1...xn. ?y.tm"`in
		if is_var f then
		    if is_var y then
			BABY_P_PSKOLEM_CONV f tm
		    else % is_pair y %
			let y' = genvar (type_of y) in
			let tha1 =
			    (FORALL_CONV (RAND_CONV (PALPHA_CONV y'))) tm
			in
			    CONV_RULE (RAND_CONV (BABY_P_PSKOLEM_CONV f)) tha1
		else % is_par f %
		    let (f1,f2) = dest_pair f in
		    let thb1 = 
			if is_var y then
			    let (y1',y2') =
				(genvar # genvar) (dest_prod (type_of y)) ?
				failwith `existential variable not of pair type`
			    in
				(FORALL_CONV
				    (RAND_CONV
					(PALPHA_CONV (mk_pair(y1',y2')))))
				tm
			else
			    REFL tm in
		    let thb2 =
			CONV_RULE
			    (RAND_CONV (FORALL_CONV CURRY_EXISTS_CONV))
			    thb1 in
		    let thb3 = CONV_RULE (RAND_CONV (P_PSKOLEM_CONV f1)) thb2 in
		    let thb4 =
			CONV_RULE
			    (RAND_CONV
				(RAND_CONV (PABS_CONV (P_PSKOLEM_CONV f2))))
			    thb3 in
			CONV_RULE (RAND_CONV UNCURRY_EXISTS_CONV) thb4
	    ) ?\st failwith `P_PSKOLEM_CONV: ` ^st;;

    P_PSKOLEM_CONV;;
end_section skolemsec;;
let P_PSKOLEM_CONV = it;;

% ------------------------------------------------------------------------- %
% PSKOLEM_CONV : introduce a skolem function.                               %
%                                                                           %
%   |- (!x1...xn. ?y. tm[x1,...,xn,y])                                      %
%        =                                                                  %
%      (?y'. !x1...xn. tm[x1,..,xn,f x1 ... xn]                             %
%                                                                           %
% Where y' is a primed variant of y not free in the input term.             %
% ------------------------------------------------------------------------- %

let PSKOLEM_CONV =
    letrec mkfn tm tyl =
	if is_var tm then
	    let (n,t) = dest_var tm in
		mk_var(n, itlist (\ty1 ty2. mk_type(`fun`,[ty1;ty2])) tyl t)
	else
	    let (p1,p2) = dest_pair tm in
		mk_pair(mkfn p1 tyl, mkfn p2 tyl)
    in
	\tm.
	(
	    let (xs,(y,P)) = (I # dest_pexists) (strip_pforall tm) in
	    let f = mkfn y (map type_of xs) in
	    let f' = pvariant (frees tm) f in
		P_PSKOLEM_CONV f' tm 
	) ? failwith `PSKOLEM_CONV: expecting "!x1...xn. ?y.tm"`;;