@@ -85,6 +85,31 @@ Definition BT_generator_def :
85
85
(NONE , LNIL)
86
86
End
87
87
88
+ (* M0 is not needed if M is already an hnf *)
89
+ Theorem BT_generator_of_hnf :
90
+ !X M r. FINITE X /\ hnf M ==>
91
+ BT_generator X (M,r) =
92
+ (let
93
+ n = LAMl_size M;
94
+ vs = RNEWS r n X;
95
+ M1 = principle_hnf (M @* MAP VAR vs);
96
+ Ms = hnf_children M1;
97
+ y = hnf_headvar M1;
98
+ l = MAP (\e. (e,SUC r)) Ms
99
+ in
100
+ (SOME (vs,y),fromList l))
101
+ Proof
102
+ rpt STRIP_TAC
103
+ >> ‘solvable M’ by PROVE_TAC [hnf_solvable]
104
+ >> RW_TAC std_ss [BT_generator_def]
105
+ >> ‘M0 = M’ by rw [Abbr ‘M0’, principle_hnf_reduce]
106
+ >> POP_ASSUM (fs o wrap)
107
+ >> Q.PAT_X_ASSUM ‘n' = n’ (fs o wrap o SYM)
108
+ >> Q.PAT_X_ASSUM ‘vs' = vs’ (fs o wrap o SYM)
109
+ >> Q.PAT_X_ASSUM ‘M1' = M1’ (fs o wrap o SYM)
110
+ >> Q.PAT_X_ASSUM ‘Ms' = Ms’ (fs o wrap o SYM)
111
+ QED
112
+
88
113
Definition BT_def[nocompute] :
89
114
BT X = ltree_unfold (BT_generator X)
90
115
End
@@ -211,8 +236,7 @@ Proof
211
236
>> DISCH_TAC
212
237
>> ‘M0 @* MAP VAR vs == t @* l’ by PROVE_TAC [lameq_TRANS]
213
238
>> Suff ‘solvable (t @* l)’ >- PROVE_TAC [lameq_solvable_cong]
214
- >> REWRITE_TAC [solvable_iff_has_hnf]
215
- >> MATCH_MP_TAC hnf_has_hnf
239
+ >> MATCH_MP_TAC hnf_solvable
216
240
>> simp [Abbr ‘t’, GSYM appstar_APPEND, hnf_appstar]
217
241
QED
218
242
@@ -309,13 +333,6 @@ Proof
309
333
>> qexistsl_tac [‘X’, ‘M’, ‘r’, ‘n’, ‘vs’, ‘M1’] >> simp []
310
334
QED
311
335
312
- (* This is the meaning of Boehm tree nodes, ‘fromNote’ translated from BT nodes
313
- to lambda terms in form of ‘SOME (LAMl vs (VAR y))’ or ‘NONE’.
314
- *)
315
- Definition fromNode_def :
316
- fromNode = OPTION_MAP (\(vs,y). LAMl vs (VAR y))
317
- End
318
-
319
336
(* Boehm tree of a single (free) variable ‘VAR y’ *)
320
337
Definition BT_VAR_def :
321
338
BT_VAR y :boehm_tree = Branch (SOME ([],y)) LNIL
@@ -354,9 +371,8 @@ Theorem BT_of_principle_hnf :
354
371
Proof
355
372
reverse (RW_TAC std_ss [BT_def, BT_generator_def, ltree_unfold])
356
373
>- (Q.PAT_X_ASSUM ‘unsolvable M0’ MP_TAC >> simp [] \\
357
- rw [Abbr ‘M0’, solvable_iff_has_hnf] \\
358
- MATCH_MP_TAC hnf_has_hnf \\
359
- MATCH_MP_TAC hnf_principle_hnf' >> art [])
374
+ MATCH_MP_TAC hnf_solvable \\
375
+ rw [Abbr ‘M0’, hnf_principle_hnf'])
360
376
>> ‘M0' = M0’ by rw [Abbr ‘M0'’, Abbr ‘M0’, principle_hnf_stable']
361
377
>> qunabbrev_tac ‘M0'’
362
378
>> POP_ASSUM (rfs o wrap)
@@ -588,7 +604,7 @@ Proof
588
604
>> POP_ASSUM (rfs o wrap)
589
605
>> Know ‘FV (principle_hnf (M0 @* MAP VAR vs)) SUBSET FV (M0 @* MAP VAR vs)’
590
606
>- (MATCH_MP_TAC principle_hnf_FV_SUBSET' \\
591
- ‘solvable M1’ by rw [solvable_iff_has_hnf, hnf_has_hnf ] \\
607
+ ‘solvable M1’ by rw [hnf_solvable ] \\
592
608
Suff ‘M0 @* MAP VAR vs == M1’ >- PROVE_TAC [lameq_solvable_cong] \\
593
609
rw [])
594
610
>> simp []
@@ -713,7 +729,7 @@ Proof
713
729
>> DISCH_THEN (ASSUME_TAC o SYM)
714
730
>> Know ‘FV (principle_hnf (M0 @* MAP VAR xs)) SUBSET FV (M0 @* MAP VAR xs)’
715
731
>- (MATCH_MP_TAC principle_hnf_FV_SUBSET' \\
716
- ‘solvable M1'’ by rw [solvable_iff_has_hnf, hnf_has_hnf , hnf_appstar] \\
732
+ ‘solvable M1'’ by rw [hnf_solvable , hnf_appstar] \\
717
733
Suff ‘M0 @* MAP VAR xs == M1'’ >- PROVE_TAC [lameq_solvable_cong] \\
718
734
Q.PAT_X_ASSUM ‘_ = M0’ (REWRITE_TAC o wrap o SYM) \\
719
735
simp [])
802
818
* More subterm properties
803
819
*---------------------------------------------------------------------------*)
804
820
805
- (* M0 is not needed if M is already an hnf *)
806
821
Theorem subterm_of_hnf :
807
822
!X M h p r. FINITE X /\ hnf M ==>
808
823
subterm X M (h::p) r =
@@ -815,7 +830,7 @@ Theorem subterm_of_hnf :
815
830
if h < m then subterm X (EL h Ms) p (SUC r) else NONE
816
831
Proof
817
832
rpt STRIP_TAC
818
- >> ‘solvable M’ by PROVE_TAC [solvable_iff_has_hnf, hnf_has_hnf ]
833
+ >> ‘solvable M’ by PROVE_TAC [hnf_solvable ]
819
834
>> RW_TAC std_ss [subterm_of_solvables]
820
835
>> ‘M0 = M’ by rw [Abbr ‘M0’, principle_hnf_reduce]
821
836
>> POP_ASSUM (fs o wrap)
@@ -837,7 +852,7 @@ Theorem subterm_of_hnf_alt :
837
852
if h < m then subterm X (EL h Ms) p (SUC r) else NONE
838
853
Proof
839
854
rpt GEN_TAC >> STRIP_TAC
840
- >> ‘solvable M’ by PROVE_TAC [solvable_iff_has_hnf, hnf_has_hnf ]
855
+ >> ‘solvable M’ by PROVE_TAC [hnf_solvable ]
841
856
>> RW_TAC std_ss [subterm_alt]
842
857
>> ‘M0 = M’ by rw [Abbr ‘M0’, principle_hnf_reduce]
843
858
>> POP_ASSUM (fs o wrap)
@@ -859,7 +874,7 @@ Theorem subterm_of_absfree_hnf :
859
874
if h < m then subterm X (EL h Ms) p (SUC r) else NONE
860
875
Proof
861
876
rpt STRIP_TAC
862
- >> ‘solvable M’ by PROVE_TAC [solvable_iff_has_hnf, hnf_has_hnf ]
877
+ >> ‘solvable M’ by PROVE_TAC [hnf_solvable ]
863
878
>> RW_TAC std_ss [subterm_of_solvables]
864
879
>> ‘M0 = M’ by rw [Abbr ‘M0’, principle_hnf_reduce]
865
880
>> fs [Abbr ‘M0’]
@@ -1657,10 +1672,7 @@ Proof
1657
1672
‘FV M0 UNION set vs2 = FV (M0 @* MAP VAR vs2)’ by rw [] >> POP_ORW \\
1658
1673
qunabbrev_tac ‘M2’ \\
1659
1674
MATCH_MP_TAC principle_hnf_FV_SUBSET' \\
1660
- Know ‘solvable (VAR y @* args)’
1661
- >- (rw [solvable_iff_has_hnf] \\
1662
- MATCH_MP_TAC hnf_has_hnf \\
1663
- rw [hnf_appstar]) >> DISCH_TAC \\
1675
+ ‘solvable (VAR y @* args)’ by rw [hnf_solvable, hnf_appstar] \\
1664
1676
Suff ‘M0 @* MAP VAR vs2 == VAR y @* args’
1665
1677
>- PROVE_TAC [lameq_solvable_cong] \\
1666
1678
rw []))
@@ -1735,7 +1747,7 @@ Proof
1735
1747
qabbrev_tac ‘x' = lswapstr (REVERSE p1) x’ \\
1736
1748
‘x' IN FV M2’ by METIS_TAC [SUBSET_DEF] \\
1737
1749
Know ‘FV M2 SUBSET FV (M0 @* MAP VAR vs2)’
1738
- >- (‘solvable M2’ by rw [solvable_iff_has_hnf, hnf_has_hnf ] \\
1750
+ >- (‘solvable M2’ by rw [hnf_solvable ] \\
1739
1751
‘M0 @* MAP VAR vs2 == M2’ by rw [] \\
1740
1752
qunabbrev_tac ‘M2’ \\
1741
1753
MATCH_MP_TAC principle_hnf_FV_SUBSET' \\
@@ -1788,7 +1800,7 @@ Proof
1788
1800
DISCH_TAC (* x' IN FV N *) \\
1789
1801
‘x' IN FV M2’ by METIS_TAC [SUBSET_DEF] \\
1790
1802
Know ‘FV M2 SUBSET FV (M0 @* MAP VAR vs2)’
1791
- >- (‘solvable M2’ by rw [solvable_iff_has_hnf, hnf_has_hnf ] \\
1803
+ >- (‘solvable M2’ by rw [hnf_solvable ] \\
1792
1804
‘M0 @* MAP VAR vs2 == M2’ by rw [] \\
1793
1805
qunabbrev_tac ‘M2’ \\
1794
1806
MATCH_MP_TAC principle_hnf_FV_SUBSET' \\
@@ -2229,8 +2241,7 @@ Proof
2229
2241
‘LAMl vs (VAR y @* args) @* MAP VAR vs == VAR y @* args’
2230
2242
by PROVE_TAC [lameq_LAMl_appstar_VAR] \\
2231
2243
Suff ‘solvable (VAR y @* args)’ >- PROVE_TAC [lameq_solvable_cong] \\
2232
- REWRITE_TAC [solvable_iff_has_hnf] \\
2233
- MATCH_MP_TAC hnf_has_hnf >> simp [hnf_appstar])
2244
+ MATCH_MP_TAC hnf_solvable >> simp [hnf_appstar])
2234
2245
>> Rewr'
2235
2246
>> simp [principle_hnf_beta_reduce, hnf_appstar, tpm_appstar]
2236
2247
>> rw [Abbr ‘f’]
@@ -2306,8 +2317,7 @@ Proof
2306
2317
‘LAMl vs (VAR y @* args) @* MAP VAR vs == VAR y @* args’
2307
2318
by PROVE_TAC [lameq_LAMl_appstar_VAR] \\
2308
2319
Suff ‘solvable (VAR y @* args)’ >- PROVE_TAC [lameq_solvable_cong] \\
2309
- REWRITE_TAC [solvable_iff_has_hnf] \\
2310
- MATCH_MP_TAC hnf_has_hnf \\
2320
+ MATCH_MP_TAC hnf_solvable \\
2311
2321
simp [hnf_appstar])
2312
2322
>> Rewr'
2313
2323
>> simp [principle_hnf_beta_reduce, hnf_appstar, tpm_appstar]
@@ -2919,8 +2929,8 @@ Proof
2919
2929
>- (Suff ‘solvable ([P/v] M0)’ >- PROVE_TAC [lameq_solvable_cong] \\
2920
2930
simp [LAMl_SUB, appstar_SUB] \\
2921
2931
reverse (Cases_on ‘y = v’)
2922
- >- (simp [SUB_THM, solvable_iff_has_hnf ] \\
2923
- MATCH_MP_TAC hnf_has_hnf >> rw [hnf_appstar]) \\
2932
+ >- (simp [SUB_THM] \\
2933
+ MATCH_MP_TAC hnf_solvable >> rw [hnf_appstar]) \\
2924
2934
simp [solvable_iff_has_hnf, has_hnf_thm] \\
2925
2935
qabbrev_tac ‘args' = MAP [P/v] args’ \\
2926
2936
qabbrev_tac ‘m = LENGTH args’ \\
@@ -5134,8 +5144,8 @@ Proof
5134
5144
>> Know ‘solvable (apply pi M)’
5135
5145
>- (Suff ‘solvable (VAR b @* args' @* MAP VAR as )’
5136
5146
>- METIS_TAC [lameq_solvable_cong] \\
5137
- simp [solvable_iff_has_hnf, GSYM appstar_APPEND] \\
5138
- MATCH_MP_TAC hnf_has_hnf >> simp [hnf_appstar])
5147
+ MATCH_MP_TAC hnf_solvable \\
5148
+ simp [GSYM appstar_APPEND, hnf_appstar])
5139
5149
>> DISCH_TAC
5140
5150
(* stage work *)
5141
5151
>> Know ‘principle_hnf (apply pi M) = VAR b @* args' @* MAP VAR as ’
@@ -5194,14 +5204,12 @@ Proof
5194
5204
by rw [lameq_appstar_cong] \\
5195
5205
Suff ‘solvable (M1 @* MAP VAR (SNOC b as ))’
5196
5206
>- PROVE_TAC [lameq_solvable_cong] \\
5197
- REWRITE_TAC [solvable_iff_has_hnf] \\
5198
- MATCH_MP_TAC hnf_has_hnf >> rw [hnf_appstar]) \\
5207
+ MATCH_MP_TAC hnf_solvable >> rw [hnf_appstar]) \\
5199
5208
CONJ_TAC (* has_hnf #2 *)
5200
5209
>- (REWRITE_TAC [GSYM solvable_iff_has_hnf] \\
5201
5210
Suff ‘solvable (VAR b @* args' @* MAP VAR as )’
5202
5211
>- PROVE_TAC [lameq_solvable_cong] \\
5203
- REWRITE_TAC [solvable_iff_has_hnf] \\
5204
- MATCH_MP_TAC hnf_has_hnf >> rw [hnf_appstar]) \\
5212
+ MATCH_MP_TAC hnf_solvable >> rw [hnf_appstar]) \\
5205
5213
CONJ_TAC (* has_hnf # 3 *)
5206
5214
>- (simp [appstar_SUB, MAP_SNOC] \\
5207
5215
Know ‘MAP [P/y] (MAP VAR as ) = MAP VAR as ’
@@ -5219,8 +5227,7 @@ Proof
5219
5227
>- (MATCH_MP_TAC permutator_thm >> rw []) >> DISCH_TAC \\
5220
5228
Suff ‘solvable (VAR b @* (args' ++ MAP VAR as ))’
5221
5229
>- PROVE_TAC [lameq_solvable_cong] \\
5222
- REWRITE_TAC [solvable_iff_has_hnf] \\
5223
- MATCH_MP_TAC hnf_has_hnf >> rw [hnf_appstar]) \\
5230
+ MATCH_MP_TAC hnf_solvable >> rw [hnf_appstar]) \\
5224
5231
(* applying the celebrating principle_hnf_denude_thm
5225
5232
5226
5233
NOTE: here ‘DISJOINT (set vs) (FV M)’ is required, and this means that
@@ -6070,8 +6077,7 @@ Proof
6070
6077
‘M0 i @* MAP VAR vs = apply p1 (M0 i)’
6071
6078
by rw [Abbr ‘p1’, Boehm_apply_MAP_rightctxt'] >> POP_ORW \\
6072
6079
Suff ‘solvable (M1 i)’ >- METIS_TAC [lameq_solvable_cong] \\
6073
- REWRITE_TAC [solvable_iff_has_hnf] \\
6074
- MATCH_MP_TAC hnf_has_hnf \\
6080
+ MATCH_MP_TAC hnf_solvable \\
6075
6081
rw [GSYM appstar_APPEND, hnf_appstar]) \\
6076
6082
REWRITE_TAC [FV_appstar_MAP_VAR] \\
6077
6083
Know ‘y i IN FV (M1 i) /\
@@ -6135,9 +6141,7 @@ Proof
6135
6141
MP_TAC (Q.SPEC ‘M0 (i :num) @* MAP VAR vs'’ principle_hnf_FV_SUBSET') \\
6136
6142
impl_tac >- (Suff ‘solvable (VAR (y i) @* args i)’
6137
6143
>- METIS_TAC [lameq_solvable_cong] \\
6138
- REWRITE_TAC [solvable_iff_has_hnf] \\
6139
- MATCH_MP_TAC hnf_has_hnf \\
6140
- simp [hnf_appstar]) \\
6144
+ MATCH_MP_TAC hnf_solvable >> simp [hnf_appstar]) \\
6141
6145
POP_ORW \\
6142
6146
REWRITE_TAC [FV_appstar_MAP_VAR, FV_appstar, FV_thm] \\
6143
6147
SET_TAC [])
@@ -6325,8 +6329,7 @@ Proof
6325
6329
P (f i) @* Ns i @@ VAR (b i) @* tl i == VAR (b i) @* Ns i @* tl i’
6326
6330
>- (METIS_TAC [lameq_solvable_cong]) \\
6327
6331
reverse CONJ_TAC >- (MATCH_MP_TAC hreduces_lameq >> rw []) \\
6328
- REWRITE_TAC [solvable_iff_has_hnf] \\
6329
- MATCH_MP_TAC hnf_has_hnf >> art []) >> Rewr' \\
6332
+ MATCH_MP_TAC hnf_solvable >> art []) >> Rewr' \\
6330
6333
Know ‘P (f i) @* args' i @* args2 i @* MAP VAR xs = M1 i @* MAP VAR xs ISUB ss’
6331
6334
>- (REWRITE_TAC [appstar_ISUB, Once EQ_SYM_EQ] \\
6332
6335
Q.PAT_X_ASSUM ‘!i. i < k ==> apply p2 (M1 i) = _’
@@ -6350,14 +6353,12 @@ Proof
6350
6353
‘M0' == M1 i’ by rw [Abbr ‘M0'’] \\
6351
6354
‘M0' @* MAP VAR xs == M1 i @* MAP VAR xs’ by rw [lameq_appstar_cong] \\
6352
6355
Suff ‘solvable (M1 i @* MAP VAR xs)’ >- PROVE_TAC [lameq_solvable_cong] \\
6353
- REWRITE_TAC [solvable_iff_has_hnf] \\
6354
- MATCH_MP_TAC hnf_has_hnf >> rw [hnf_appstar]) \\
6356
+ MATCH_MP_TAC hnf_solvable >> rw [hnf_appstar]) \\
6355
6357
CONJ_TAC (* has_hnf #2 *)
6356
6358
>- (REWRITE_TAC [GSYM solvable_iff_has_hnf] \\
6357
6359
Suff ‘solvable (VAR (b i) @* Ns i @* tl i)’
6358
6360
>- PROVE_TAC [lameq_solvable_cong] \\
6359
- REWRITE_TAC [solvable_iff_has_hnf] \\
6360
- MATCH_MP_TAC hnf_has_hnf >> rw [hnf_appstar]) \\
6361
+ MATCH_MP_TAC hnf_solvable >> rw [hnf_appstar]) \\
6361
6362
CONJ_TAC (* has_hnf # 3 *)
6362
6363
>- (simp [appstar_ISUB, MAP_DROP] \\
6363
6364
ASM_SIMP_TAC bool_ss [has_hnf_thm] \\
@@ -6395,8 +6396,7 @@ Proof
6395
6396
>- (rpt STRIP_TAC \\
6396
6397
Suff ‘solvable (VAR (b i) @* Ns i @* tl i)’
6397
6398
>- METIS_TAC [lameq_solvable_cong] \\
6398
- REWRITE_TAC [solvable_iff_has_hnf] \\
6399
- MATCH_MP_TAC hnf_has_hnf >> rw [hnf_appstar, GSYM appstar_APPEND])
6399
+ MATCH_MP_TAC hnf_solvable >> rw [hnf_appstar, GSYM appstar_APPEND])
6400
6400
>> DISCH_TAC
6401
6401
>> PRINT_TAC " stage work on subtree_equiv_lemma: L6433"
6402
6402
>> CONJ_TAC (* EVERY is_ready ... *)
@@ -6815,8 +6815,8 @@ Proof
6815
6815
(* ‘H i’ is the head reduction of apply pi (M i) *)
6816
6816
>> qabbrev_tac ‘H = \i. VAR (b i) @* Ns i @* tl i’
6817
6817
>> Know ‘!i. solvable (H i)’
6818
- >- (rw [Abbr ‘H’, solvable_iff_has_hnf ] \\
6819
- MATCH_MP_TAC hnf_has_hnf >> rw [hnf_appstar])
6818
+ >- (rw [Abbr ‘H’] \\
6819
+ MATCH_MP_TAC hnf_solvable >> rw [hnf_appstar])
6820
6820
>> DISCH_TAC
6821
6821
>> Know ‘!i. i < k ==> FV (H i) SUBSET X UNION RANK r’
6822
6822
>- (simp [Abbr ‘H’, GSYM appstar_APPEND, FV_appstar] \\
0 commit comments