@@ -48,6 +48,10 @@ theorem _eSubst_floor {x: EVar} (phi psi rho: Pattern x)
48
48
(h: $ Norm (e[ phi / x ] psi) rho $):
49
49
$ Norm (e[ phi / x ] (|_ psi _|)) (|_ rho _|) $ =
50
50
'(_eSubst_not @ _eSubst_ceil @ _eSubst_not h);
51
+ theorem _eSubst_mem {x y: EVar} (phi phi2 psi2: Pattern x y)
52
+ (h: $ Norm (e[ phi / x ] phi2) psi2 $):
53
+ $ Norm (e[ phi / x ] (y in phi2)) (y in psi2) $ =
54
+ '(_eSubst_ceil @ _eSubst_and eSubstitution_disjoint h);
51
55
theorem _eSubst_mem_same_var {x: EVar} (phi phi2 psi2: Pattern x)
52
56
(h: $ Norm (e[ phi / x ] phi2) psi2 $):
53
57
$ Norm (e[ phi / x ] (x in phi2)) (|^ phi /\ psi2 ^|) $ =
@@ -130,6 +134,10 @@ theorem prop_43_exists {box: SVar} {x: EVar} (ctx: Pattern box) (phi: Pattern bo
130
134
$ (exists x (app[ phi / box ] ctx)) -> app[ exists x phi / box ] ctx $ =
131
135
'(exists_generalization (eFresh_appCtx eFresh_disjoint eFresh_exists_same_var) (framing exists_intro_same_var));
132
136
137
+ theorem prop_43_exists_var_in_ctx {box: SVar} {x: EVar} (ctx phi: Pattern box x):
138
+ $ (exists x (app[ phi / box ] ctx)) -> exists x (app[ exists x phi / box ] ctx) $ =
139
+ '(exists_framing @ framing exists_intro_same_var);
140
+
133
141
theorem prop_43_exists_fresh {box: SVar} {x: EVar} (ctx phi: Pattern box x)
134
142
(ctx_fresh: $ _eFresh x ctx $):
135
143
$ (exists x (app[ phi / box ] ctx)) -> app[ exists x phi / box ] ctx $ =
@@ -171,6 +179,10 @@ do {
171
179
(def (framing_subst hyp subst) '(norm (norm_imp ,subst ,subst) @ framing ,hyp))
172
180
};
173
181
182
+ do {
183
+ (def (exists_intro_subst subst) '(norm (norm_imp_l ,subst) exists_intro))
184
+ };
185
+
174
186
theorem exists_intro_l_bi_disjoint {x: EVar} (phi: Pattern x) (psi: Pattern)
175
187
(h: $ phi <-> psi $):
176
188
$ (exists x phi) <-> psi $ =
@@ -282,17 +294,37 @@ theorem imp_forall_fresh {x: EVar} (phi1 phi2: Pattern x) (freshness_phi1: $ _eF
282
294
$ (phi1 -> forall x phi2) <-> forall x (phi1 -> phi2) $ =
283
295
'(con2b @ bitr (cong_of_equiv_exists @ con3b @ imeq2i notnot) @ and_exists_fresh freshness_phi1);
284
296
285
- theorem imp_forall {x: EVar} (phi1: Pattern) (phi2: Pattern x):
297
+ theorem imp_r_forall_disjoint {x: EVar} (phi1: Pattern) (phi2: Pattern x):
286
298
$ (phi1 -> forall x phi2) <-> forall x (phi1 -> phi2) $ =
287
299
'(imp_forall_fresh eFresh_disjoint);
288
300
289
- theorem or_forall {x: EVar} (phi1: Pattern) (phi2: Pattern x):
290
- $ (phi1 \/ forall x phi2) <-> forall x (phi1 \/ phi2) $ = 'imp_forall ;
301
+ theorem or_r_forall_disjoint {x: EVar} (phi1: Pattern) (phi2: Pattern x):
302
+ $ (phi1 \/ forall x phi2) <-> forall x (phi1 \/ phi2) $ = 'imp_r_forall_disjoint ;
291
303
292
- theorem and_forall {x: EVar} (phi1: Pattern) (phi2: Pattern x):
304
+ theorem and_r_forall_disjoint {x: EVar} (phi1: Pattern) (phi2: Pattern x):
293
305
$ (phi1 /\ forall x phi2) <-> forall x (phi1 /\ phi2) $ =
294
306
'(con3b @ bitr (cong_of_equiv_imp_r @ bicom notnot) @ bitr imp_exists_disjoint @ cong_of_equiv_exists notnot);
295
307
308
+ theorem forall_ceil {x: EVar} (phi: Pattern x):
309
+ $ |^ forall x phi ^| -> forall x (|^ phi ^|) $ =
310
+ '(anr (imp_forall_fresh @ eFresh_ceil eFresh_forall_same_var) @ univ_gene @ framing_def var_subst_same_var);
311
+
312
+
313
+ theorem and_forall {x: EVar} (phi psi: Pattern x):
314
+ $ (forall x (phi /\ psi)) <-> (forall x phi) /\ (forall x psi) $ =
315
+ '(ibii
316
+ (iand (forall_framing anl) (forall_framing anr)) @
317
+ anr (imp_forall_fresh @ eFresh_and eFresh_forall_same_var eFresh_forall_same_var) @
318
+ univ_gene @
319
+ anim var_subst_same_var var_subst_same_var);
320
+
321
+ theorem forall_imp_distr {x: EVar} (phi psi: Pattern x):
322
+ $ (forall x (phi -> psi)) -> (forall x phi) -> (forall x psi) $ =
323
+ '(exp @ rsyl (anr and_forall) (forall_framing (rsyl ancom appl)));
324
+
325
+ theorem s_forall_imp_distr {x: EVar} (phi psi rho: Pattern x):
326
+ $ (forall x (rho -> (phi -> psi))) -> (forall x (rho -> phi)) -> (forall x (rho -> psi)) $ =
327
+ '(rsyl (forall_framing prop_2) forall_imp_distr);
296
328
297
329
theorem lemma_46 (phi: Pattern) {box: SVar} (ctx: Pattern box)
298
330
(p : $ phi $):
@@ -342,16 +374,6 @@ theorem taut_is_top (h: $ phi $): $ phi == top $ =
342
374
theorem absurd_and_equiv_bot (h: $ ~ phi $): $ phi /\ psi <-> bot $ =
343
375
'(ibii (syl h anl) absurdum);
344
376
345
- theorem membership_intro_implicit {x: EVar} (phi: Pattern x)
346
- (h: $ phi $):
347
- $ x in phi $ =
348
- '(framing_def (iand id (a1i h)) definedness);
349
-
350
- theorem membership_intro {x: EVar} (phi: Pattern x)
351
- (h: $ phi $):
352
- $ forall x (x in phi) $ =
353
- '(univ_gene @ membership_intro_implicit h);
354
-
355
377
theorem membership_elim {x: EVar} (phi: Pattern)
356
378
(h: $ forall x (x in phi) $):
357
379
$ phi $ =
@@ -479,6 +501,20 @@ theorem eVars_subset_eq {x y: EVar}:
479
501
$ (eVar x C= eVar y) <-> (eVar x == eVar y) $ =
480
502
'(ibii eVars_subset_eq_forward eVars_subset_eq_reverse);
481
503
504
+ theorem membership_intro_implicit_imp {x: EVar} (phi: Pattern x):
505
+ $ |_ phi _| -> x in phi $ =
506
+ '(syl eVar_in_subset_reverse @ framing_floor prop_1);
507
+
508
+ theorem membership_intro_implicit {x: EVar} (phi: Pattern x)
509
+ (h: $ phi $):
510
+ $ x in phi $ =
511
+ '(membership_intro_implicit_imp @ lemma_46_floor h);
512
+
513
+ theorem membership_intro {x: EVar} (phi: Pattern x)
514
+ (h: $ phi $):
515
+ $ forall x (x in phi) $ =
516
+ '(univ_gene @ membership_intro_implicit h);
517
+
482
518
theorem lemma_exists_and: $ phi <-> exists x (eVar x /\ phi) $ =
483
519
'(ibii
484
520
(rsyl notnot1 @ anr or_exists_disjoint @ exists_framing
@@ -1111,6 +1147,9 @@ do {
1111
1147
-- C[phi] -> x = phi -> C[x]
1112
1148
(def (func_subst_imp_to_var x ctx) '(com12 @ syl anr ,(func_subst_explicit_helper x ctx)))
1113
1149
1150
+ -- x = phi /\ C[phi] -> C[x]
1151
+ (def (func_subst_imp_to_var_variant x ctx) '(curry @ syl anr ,(func_subst_explicit_helper x ctx)))
1152
+
1114
1153
-- forall x . phi1[x]
1115
1154
-- exists y . y = phi2
1116
1155
----------------------
@@ -1164,6 +1203,7 @@ do {
1164
1203
exists_generalization ,fre (mp (com12 @ syl anl ,(func_subst_explicit_helper x phi1)) ,phi1_pf) ,func_phi2
1165
1204
))
1166
1205
1206
+ -- x in (...) <-> ...
1167
1207
(def (propag_mem_w_fun x ctx fun_patterns) @ if (not (== (lookup fun_patterns ctx) #undef)) (func_subst_thm (lookup fun_patterns ctx) 'y 'membership_var_bi) @ match ctx
1168
1208
-- special case for top and bottom?
1169
1209
[$eVar ,y$ (if (== x y) '(taut_equiv_top membership_same_var) 'membership_var_bi)]
@@ -1180,6 +1220,7 @@ do {
1180
1220
[$_floor ,psi$ 'mem_floor]
1181
1221
[$_subset ,phi1 ,phi2$ 'mem_floor]
1182
1222
[$_eq ,phi1 ,phi2$ 'mem_floor]
1223
+ [$_neq ,phi1 ,phi2$ '(bitr membership_not_bi @ cong_of_equiv_not mem_floor)]
1183
1224
1184
1225
-- [$nnimp ,phi1 ,phi2$ '(membership_nnimp ,(propag_mem_w_fun x phi1 fun_patterns) ,(propag_mem_w_fun X phi2 fun_patterns))]
1185
1226
[$epsilon$ (func_subst_thm 'functional_epsilon 'y 'membership_var_bi)]
@@ -1287,7 +1328,7 @@ theorem domain_func_sorting {x: EVar} (phi psi: Pattern):
1287
1328
rsyl (anim2 @ rsyl eq_sym eq_imp_subset) @
1288
1329
impcom subset_trans);
1289
1330
1290
- theorem forall_exists_lemma (phi psi: Pattern):
1331
+ theorem forall_exists_lemma {x: EVar} (phi: Pattern x) ( psi: Pattern):
1291
1332
$ ( forall x (phi C= psi)) ->
1292
1333
((exists x phi) C= psi ) $ =
1293
1334
'(con3 @
@@ -1300,7 +1341,7 @@ theorem forall_exists_lemma (phi psi: Pattern):
1300
1341
con3 @
1301
1342
imim2 notnot1);
1302
1343
1303
- theorem forall_exists_lemma_rev (phi psi: Pattern):
1344
+ theorem forall_exists_lemma_rev {x: EVar} (phi: Pattern x) ( psi: Pattern):
1304
1345
$ ((exists x phi) C= psi ) ->
1305
1346
( forall x (phi C= psi)) $ =
1306
1347
'(con3 @
@@ -1329,6 +1370,17 @@ theorem forall_exists_lemma_domain {x: EVar} (phi rho: Pattern x) (psi: Pattern)
1329
1370
con3 @
1330
1371
imim2 notnot1);
1331
1372
1373
+ theorem forall_imp_to_imp_exists {x: EVar} (phi psi: Pattern x):
1374
+ $ (forall x (phi -> psi)) -> (exists x phi) -> (exists x psi) $ =
1375
+ '(exp @ rsyl (and_exists_fresh_reverse eFresh_forall_same_var) @ exists_framing @ curry var_subst_same_var);
1376
+
1377
+ theorem forall_eq_to_eq_exists {x: EVar} (phi psi: Pattern x):
1378
+ $ (forall x (phi == psi)) -> ((exists x phi) == (exists x psi)) $ =
1379
+ '(rsyl (forall_framing @ iand eq_imp_subset @ rsyl eq_sym eq_imp_subset) @
1380
+ rsyl (iand (forall_framing anl) (forall_framing anr)) @
1381
+ rsyl (anim (anr forall_floor) (anr forall_floor)) @
1382
+ rsyl (anim (framing_floor forall_imp_to_imp_exists) (framing_floor forall_imp_to_imp_exists)) @
1383
+ curry subset_to_eq);
1332
1384
1333
1385
theorem pointwise_decomposition {box: SVar} {x: EVar} (ctx: Pattern box) (phi psi: Pattern)
1334
1386
(hyp: $ (x in phi) -> (app[ eVar x / box ] ctx C= psi) $):
@@ -1362,16 +1414,16 @@ theorem subset_mem_lemma {x: EVar} (phi psi: Pattern):
1362
1414
'(subset_mem_lemma_fresh eFresh_disjoint);
1363
1415
1364
1416
do {
1365
- (def (forall_imp_climb n) (iterate n (fn (pf) '(syl (anl imp_forall ) @ imim2 ,pf)) 'id))
1417
+ (def (forall_imp_climb n) (iterate n (fn (pf) '(syl (anl imp_r_forall_disjoint ) @ imim2 ,pf)) 'id))
1366
1418
1367
- (def (forall_imp_push n) (iterate n (fn (pf) '(rsyl (anr imp_forall ) @ imim2 ,pf)) 'id))
1419
+ (def (forall_imp_push n) (iterate n (fn (pf) '(rsyl (anr imp_r_forall_disjoint ) @ imim2 ,pf)) 'id))
1368
1420
1369
1421
(def (inst_foralls n) (if {n = 0} 'id
1370
1422
'(rsyl (rsyl ,(inst_foralls {n - 1}) ,(forall_imp_climb {n - 1})) var_subst_same_var)
1371
1423
))
1372
1424
};
1373
1425
1374
- theorem imp_eq_to_conj_in_eq :
1426
+ theorem imp_eq_to_conj_ceil_in_eq :
1375
1427
$ (|^ phi1 ^| -> (phi2 == phi3)) -> ((phi2 /\ |^ phi1 ^|) == (phi3 /\ |^ phi1 ^|)) $ =
1376
1428
'(rsyl (imim1 dne) @ eori
1377
1429
(rsyl (anl not_ceil_floor_bi) @ rsyl (anr floor_idem) @
@@ -1381,14 +1433,34 @@ theorem imp_eq_to_conj_in_eq:
1381
1433
) @
1382
1434
eq_equiv_to_eq_eq @ eq_to_and_l_bi eq_to_intro_bi);
1383
1435
1436
+ theorem s_forall_eq_lemma {x: EVar} {box: SVar} (phi1 phi2: Pattern box) (S: Pattern):
1437
+ $ (forall x (((eVar x) C= S) -> ((app[ eVar x / box ] phi1) == (app[ eVar x / box ] phi2)))) -> ((app[ S / box ] phi1) == (app[ S / box ] phi2)) $ =
1438
+ '(rsyl (forall_framing (rsyl (imim1 eVar_in_subset_forward) imp_eq_to_conj_ceil_in_eq)) @
1439
+ rsyl forall_eq_to_eq_exists @
1440
+ anl @ cong_of_equiv_eq (bicom appCtx_pointwise) (bicom appCtx_pointwise));
1441
+
1442
+ do {
1443
+ (def (s_forall_eq_lemma_subst subst1 subst2) '(norm (norm_imp (norm_forall @ norm_imp_r @ norm_eq ,subst1 ,subst2) @ norm_eq ,subst1 ,subst2) s_forall_eq_lemma))
1444
+ };
1445
+
1446
+ theorem imp_var_nin_lemma:
1447
+ $ (forall x (((eVar x) C= S) -> ~ ((eVar y) C= (app[ eVar x / box ] ctx)))) -> ~ ((eVar y) C= (app[ S / box ] ctx)) $ =
1448
+ '(con2 @ syl notnot1 @ rsyl eVar_in_subset_reverse @ syl (exists_framing @ anim2 eVar_in_subset_forward) @
1449
+ anl ,(propag_mem 'y $_ -> exists x ((_ C= _) /\ _)$) @ membership_intro_implicit @
1450
+ rsyl (anl appCtx_pointwise) @ exists_framing @ rsyl ancom @ anim1 eVar_in_subset_forward);
1451
+
1452
+ do {
1453
+ (def (imp_var_nin_lemma_subst subst) '(norm (norm_imp (norm_forall @ norm_imp_r @ norm_not @ norm_subset norm_refl ,subst) @ norm_not @ norm_subset norm_refl ,subst) imp_var_nin_lemma))
1454
+ };
1455
+
1384
1456
theorem swap_sorted_forall {x y: EVar} (phi: Pattern x y) (phi_x: Pattern x) (phi_y: Pattern y):
1385
1457
$ forall x (phi_x -> (forall y (phi_y -> phi))) -> forall y (phi_y -> (forall x (phi_x -> phi))) $ =
1386
1458
'(
1387
- rsyl (forall_framing @ anl imp_forall ) @
1459
+ rsyl (forall_framing @ anl imp_r_forall_disjoint ) @
1388
1460
rsyl swap_forall @
1389
1461
forall_framing @
1390
1462
rsyl (forall_framing @ anl com12b) @
1391
- anr imp_forall );
1463
+ anr imp_r_forall_disjoint );
1392
1464
1393
1465
theorem ceil_imp_lemma:
1394
1466
$ (|^ phi ^| -> |_ psi _|) -> |_ |^ phi ^| -> psi _| $ =
@@ -1458,3 +1530,16 @@ do {
1458
1530
1459
1531
(def (extract_pred_from_appCtx_r pred subst) '(norm (norm_imp ,subst @ norm_and_l ,subst) @ rsyl (anl @ cong_of_equiv_appCtx @ cong_of_equiv_and_r ,(floor_wrap_equiv pred)) @ rsyl appCtx_floor_commute @ anr @ cong_of_equiv_and_r ,(floor_wrap_equiv pred)))
1460
1532
};
1533
+
1534
+ do {
1535
+ (def (forall_extract ctx) @ match ctx
1536
+ [$imp _ ,phi$ '(bitr (imeq2i ,(forall_extract phi)) imp_r_forall_disjoint)]
1537
+ [$or _ ,phi$ '(bitr (oreq2i ,(forall_extract phi)) or_r_forall_disjoint)]
1538
+ [$and _ ,phi$ '(bitr (aneq2i ,(forall_extract phi)) and_r_forall_disjoint)]
1539
+ [$forall _ ,phi$ '(bitr (cong_of_equiv_forall ,(forall_extract phi)) swap_forall_bi)]
1540
+ [$_in _ ,phi$ '(bitr (cong_of_equiv_mem ,(forall_extract phi)) membership_forall_bi)]
1541
+ [$_floor ,phi$ '(bitr (cong_of_equiv_floor ,(forall_extract phi)) forall_floor)]
1542
+
1543
+ [_ 'biid]
1544
+ )
1545
+ };
0 commit comments