Skip to content

Commit 6861efd

Browse files
binghemn200
authored andcommitted
[lambda] ltree_finite_BT_bnf (by ltree_finite_by_unfolding)
1 parent 8c4bb7e commit 6861efd

File tree

9 files changed

+469
-246
lines changed

9 files changed

+469
-246
lines changed

examples/lambda/barendregt/boehmScript.sml

Lines changed: 53 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,31 @@ Definition BT_generator_def :
8585
(NONE, LNIL)
8686
End
8787

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+
88113
Definition BT_def[nocompute] :
89114
BT X = ltree_unfold (BT_generator X)
90115
End
@@ -211,8 +236,7 @@ Proof
211236
>> DISCH_TAC
212237
>> ‘M0 @* MAP VAR vs == t @* l’ by PROVE_TAC [lameq_TRANS]
213238
>> 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
216240
>> simp [Abbr ‘t’, GSYM appstar_APPEND, hnf_appstar]
217241
QED
218242

@@ -309,13 +333,6 @@ Proof
309333
>> qexistsl_tac [‘X’, ‘M’, ‘r’, ‘n’, ‘vs’, ‘M1’] >> simp []
310334
QED
311335

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-
319336
(* Boehm tree of a single (free) variable ‘VAR y’ *)
320337
Definition BT_VAR_def :
321338
BT_VAR y :boehm_tree = Branch (SOME ([],y)) LNIL
@@ -354,9 +371,8 @@ Theorem BT_of_principle_hnf :
354371
Proof
355372
reverse (RW_TAC std_ss [BT_def, BT_generator_def, ltree_unfold])
356373
>- (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'])
360376
>> ‘M0' = M0’ by rw [Abbr ‘M0'’, Abbr ‘M0’, principle_hnf_stable']
361377
>> qunabbrev_tac ‘M0'’
362378
>> POP_ASSUM (rfs o wrap)
@@ -588,7 +604,7 @@ Proof
588604
>> POP_ASSUM (rfs o wrap)
589605
>> Know ‘FV (principle_hnf (M0 @* MAP VAR vs)) SUBSET FV (M0 @* MAP VAR vs)’
590606
>- (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] \\
592608
Suff ‘M0 @* MAP VAR vs == M1’ >- PROVE_TAC [lameq_solvable_cong] \\
593609
rw [])
594610
>> simp []
@@ -713,7 +729,7 @@ Proof
713729
>> DISCH_THEN (ASSUME_TAC o SYM)
714730
>> Know ‘FV (principle_hnf (M0 @* MAP VAR xs)) SUBSET FV (M0 @* MAP VAR xs)’
715731
>- (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] \\
717733
Suff ‘M0 @* MAP VAR xs == M1'’ >- PROVE_TAC [lameq_solvable_cong] \\
718734
Q.PAT_X_ASSUM ‘_ = M0’ (REWRITE_TAC o wrap o SYM) \\
719735
simp [])
@@ -802,7 +818,6 @@ QED
802818
* More subterm properties
803819
*---------------------------------------------------------------------------*)
804820

805-
(* M0 is not needed if M is already an hnf *)
806821
Theorem subterm_of_hnf :
807822
!X M h p r. FINITE X /\ hnf M ==>
808823
subterm X M (h::p) r =
@@ -815,7 +830,7 @@ Theorem subterm_of_hnf :
815830
if h < m then subterm X (EL h Ms) p (SUC r) else NONE
816831
Proof
817832
rpt STRIP_TAC
818-
>> ‘solvable M’ by PROVE_TAC [solvable_iff_has_hnf, hnf_has_hnf]
833+
>> ‘solvable M’ by PROVE_TAC [hnf_solvable]
819834
>> RW_TAC std_ss [subterm_of_solvables]
820835
>> ‘M0 = M’ by rw [Abbr ‘M0’, principle_hnf_reduce]
821836
>> POP_ASSUM (fs o wrap)
@@ -837,7 +852,7 @@ Theorem subterm_of_hnf_alt :
837852
if h < m then subterm X (EL h Ms) p (SUC r) else NONE
838853
Proof
839854
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]
841856
>> RW_TAC std_ss [subterm_alt]
842857
>> ‘M0 = M’ by rw [Abbr ‘M0’, principle_hnf_reduce]
843858
>> POP_ASSUM (fs o wrap)
@@ -859,7 +874,7 @@ Theorem subterm_of_absfree_hnf :
859874
if h < m then subterm X (EL h Ms) p (SUC r) else NONE
860875
Proof
861876
rpt STRIP_TAC
862-
>> ‘solvable M’ by PROVE_TAC [solvable_iff_has_hnf, hnf_has_hnf]
877+
>> ‘solvable M’ by PROVE_TAC [hnf_solvable]
863878
>> RW_TAC std_ss [subterm_of_solvables]
864879
>> ‘M0 = M’ by rw [Abbr ‘M0’, principle_hnf_reduce]
865880
>> fs [Abbr ‘M0’]
@@ -1657,10 +1672,7 @@ Proof
16571672
‘FV M0 UNION set vs2 = FV (M0 @* MAP VAR vs2)’ by rw [] >> POP_ORW \\
16581673
qunabbrev_tac ‘M2’ \\
16591674
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] \\
16641676
Suff ‘M0 @* MAP VAR vs2 == VAR y @* args’
16651677
>- PROVE_TAC [lameq_solvable_cong] \\
16661678
rw []))
@@ -1735,7 +1747,7 @@ Proof
17351747
qabbrev_tac ‘x' = lswapstr (REVERSE p1) x’ \\
17361748
‘x' IN FV M2’ by METIS_TAC [SUBSET_DEF] \\
17371749
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] \\
17391751
‘M0 @* MAP VAR vs2 == M2’ by rw [] \\
17401752
qunabbrev_tac ‘M2’ \\
17411753
MATCH_MP_TAC principle_hnf_FV_SUBSET' \\
@@ -1788,7 +1800,7 @@ Proof
17881800
DISCH_TAC (* x' IN FV N *) \\
17891801
‘x' IN FV M2’ by METIS_TAC [SUBSET_DEF] \\
17901802
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] \\
17921804
‘M0 @* MAP VAR vs2 == M2’ by rw [] \\
17931805
qunabbrev_tac ‘M2’ \\
17941806
MATCH_MP_TAC principle_hnf_FV_SUBSET' \\
@@ -2229,8 +2241,7 @@ Proof
22292241
‘LAMl vs (VAR y @* args) @* MAP VAR vs == VAR y @* args’
22302242
by PROVE_TAC [lameq_LAMl_appstar_VAR] \\
22312243
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])
22342245
>> Rewr'
22352246
>> simp [principle_hnf_beta_reduce, hnf_appstar, tpm_appstar]
22362247
>> rw [Abbr ‘f’]
@@ -2306,8 +2317,7 @@ Proof
23062317
‘LAMl vs (VAR y @* args) @* MAP VAR vs == VAR y @* args’
23072318
by PROVE_TAC [lameq_LAMl_appstar_VAR] \\
23082319
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 \\
23112321
simp [hnf_appstar])
23122322
>> Rewr'
23132323
>> simp [principle_hnf_beta_reduce, hnf_appstar, tpm_appstar]
@@ -2919,8 +2929,8 @@ Proof
29192929
>- (Suff ‘solvable ([P/v] M0)’ >- PROVE_TAC [lameq_solvable_cong] \\
29202930
simp [LAMl_SUB, appstar_SUB] \\
29212931
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]) \\
29242934
simp [solvable_iff_has_hnf, has_hnf_thm] \\
29252935
qabbrev_tac ‘args' = MAP [P/v] args’ \\
29262936
qabbrev_tac ‘m = LENGTH args’ \\
@@ -5134,8 +5144,8 @@ Proof
51345144
>> Know ‘solvable (apply pi M)’
51355145
>- (Suff ‘solvable (VAR b @* args' @* MAP VAR as)’
51365146
>- 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])
51395149
>> DISCH_TAC
51405150
(* stage work *)
51415151
>> Know ‘principle_hnf (apply pi M) = VAR b @* args' @* MAP VAR as
@@ -5194,14 +5204,12 @@ Proof
51945204
by rw [lameq_appstar_cong] \\
51955205
Suff ‘solvable (M1 @* MAP VAR (SNOC b as))’
51965206
>- 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]) \\
51995208
CONJ_TAC (* has_hnf #2 *)
52005209
>- (REWRITE_TAC [GSYM solvable_iff_has_hnf] \\
52015210
Suff ‘solvable (VAR b @* args' @* MAP VAR as)’
52025211
>- 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]) \\
52055213
CONJ_TAC (* has_hnf # 3 *)
52065214
>- (simp [appstar_SUB, MAP_SNOC] \\
52075215
Know ‘MAP [P/y] (MAP VAR as) = MAP VAR as
@@ -5219,8 +5227,7 @@ Proof
52195227
>- (MATCH_MP_TAC permutator_thm >> rw []) >> DISCH_TAC \\
52205228
Suff ‘solvable (VAR b @* (args' ++ MAP VAR as))’
52215229
>- 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]) \\
52245231
(* applying the celebrating principle_hnf_denude_thm
52255232
52265233
NOTE: here ‘DISJOINT (set vs) (FV M)’ is required, and this means that
@@ -6070,8 +6077,7 @@ Proof
60706077
‘M0 i @* MAP VAR vs = apply p1 (M0 i)’
60716078
by rw [Abbr ‘p1’, Boehm_apply_MAP_rightctxt'] >> POP_ORW \\
60726079
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 \\
60756081
rw [GSYM appstar_APPEND, hnf_appstar]) \\
60766082
REWRITE_TAC [FV_appstar_MAP_VAR] \\
60776083
Know ‘y i IN FV (M1 i) /\
@@ -6135,9 +6141,7 @@ Proof
61356141
MP_TAC (Q.SPEC ‘M0 (i :num) @* MAP VAR vs'’ principle_hnf_FV_SUBSET') \\
61366142
impl_tac >- (Suff ‘solvable (VAR (y i) @* args i)’
61376143
>- 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]) \\
61416145
POP_ORW \\
61426146
REWRITE_TAC [FV_appstar_MAP_VAR, FV_appstar, FV_thm] \\
61436147
SET_TAC [])
@@ -6325,8 +6329,7 @@ Proof
63256329
P (f i) @* Ns i @@ VAR (b i) @* tl i == VAR (b i) @* Ns i @* tl i’
63266330
>- (METIS_TAC [lameq_solvable_cong]) \\
63276331
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' \\
63306333
Know ‘P (f i) @* args' i @* args2 i @* MAP VAR xs = M1 i @* MAP VAR xs ISUB ss’
63316334
>- (REWRITE_TAC [appstar_ISUB, Once EQ_SYM_EQ] \\
63326335
Q.PAT_X_ASSUM ‘!i. i < k ==> apply p2 (M1 i) = _’
@@ -6350,14 +6353,12 @@ Proof
63506353
‘M0' == M1 i’ by rw [Abbr ‘M0'’] \\
63516354
‘M0' @* MAP VAR xs == M1 i @* MAP VAR xs’ by rw [lameq_appstar_cong] \\
63526355
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]) \\
63556357
CONJ_TAC (* has_hnf #2 *)
63566358
>- (REWRITE_TAC [GSYM solvable_iff_has_hnf] \\
63576359
Suff ‘solvable (VAR (b i) @* Ns i @* tl i)’
63586360
>- 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]) \\
63616362
CONJ_TAC (* has_hnf # 3 *)
63626363
>- (simp [appstar_ISUB, MAP_DROP] \\
63636364
ASM_SIMP_TAC bool_ss [has_hnf_thm] \\
@@ -6395,8 +6396,7 @@ Proof
63956396
>- (rpt STRIP_TAC \\
63966397
Suff ‘solvable (VAR (b i) @* Ns i @* tl i)’
63976398
>- 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])
64006400
>> DISCH_TAC
64016401
>> PRINT_TAC "stage work on subtree_equiv_lemma: L6433"
64026402
>> CONJ_TAC (* EVERY is_ready ... *)
@@ -6815,8 +6815,8 @@ Proof
68156815
(* ‘H i’ is the head reduction of apply pi (M i) *)
68166816
>> qabbrev_tac ‘H = \i. VAR (b i) @* Ns i @* tl i’
68176817
>> 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])
68206820
>> DISCH_TAC
68216821
>> Know ‘!i. i < k ==> FV (H i) SUBSET X UNION RANK r’
68226822
>- (simp [Abbr ‘H’, GSYM appstar_APPEND, FV_appstar] \\

examples/lambda/barendregt/chap3Script.sml

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
1-
open HolKernel Parse boolLib bossLib;
1+
(* ========================================================================== *)
2+
(* FILE : chap3Script.sml *)
3+
(* TITLE : Theory of reductions (Chapter 3 of Barendregt 1984 [1]) *)
4+
(* *)
5+
(* AUTHORS : 2005-2011 Michael Norrish *)
6+
(* : 2023-2025 Michael Norrish and Chun Tian *)
7+
(* ========================================================================== *)
28

3-
open boolSimps metisLib basic_swapTheory relationTheory listTheory hurdUtils;
9+
open HolKernel Parse boolLib bossLib;
410

5-
local open pred_setLib in end;
11+
open boolSimps metisLib basic_swapTheory relationTheory listTheory hurdUtils
12+
pred_setTheory pred_setLib BasicProvers;
613

7-
open binderLib BasicProvers nomsetTheory termTheory chap2Theory appFOLDLTheory;
8-
open horeductionTheory
14+
open binderLib nomsetTheory termTheory chap2Theory appFOLDLTheory
15+
horeductionTheory;
916

1017
val _ = new_theory "chap3";
1118

12-
val SUBSET_DEF = pred_setTheory.SUBSET_DEF
13-
1419
(* definition from p30 *)
1520
val beta_def = Define`beta M N = ?x body arg. (M = LAM x body @@ arg) /\
1621
(N = [arg/x]body)`;
@@ -125,6 +130,14 @@ val cc_beta_FV_SUBSET = store_thm(
125130
HO_MATCH_MP_TAC ccbeta_ind THEN Q.EXISTS_TAC `{}` THEN
126131
SRW_TAC [][SUBSET_DEF, FV_SUB] THEN PROVE_TAC []);
127132

133+
Theorem betastar_FV_SUBSET :
134+
!M N. M -b->* N ==> FV N SUBSET FV M
135+
Proof
136+
HO_MATCH_MP_TAC RTC_INDUCT >> rw []
137+
>> Q_TAC (TRANS_TAC SUBSET_TRANS) ‘FV M'’ >> art []
138+
>> MATCH_MP_TAC cc_beta_FV_SUBSET >> art []
139+
QED
140+
128141
Theorem cc_beta_tpm:
129142
!M N. M -b-> N ==> !p. tpm p M -b-> tpm p N
130143
Proof

examples/lambda/barendregt/head_reductionScript.sml

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,14 @@ Proof
211211
>> Q.EXISTS_TAC ‘M0’ >> rw []
212212
QED
213213

214+
Theorem hreduce_LAM :
215+
!v M1 M2. LAM v M1 -h->* LAM v M2 <=> M1 -h->* M2
216+
Proof
217+
rpt STRIP_TAC
218+
>> MP_TAC (Q.SPECL [‘[v]’, ‘M1’, ‘M2’] hreduce_LAMl)
219+
>> REWRITE_TAC [LAMl_thm]
220+
QED
221+
214222
Theorem hreduce1_abs :
215223
!M N. M -h-> N ==> is_abs M ==> is_abs N
216224
Proof
@@ -1639,10 +1647,14 @@ Theorem hnf_head_hnf[simp] :
16391647
Proof
16401648
CONJ_TAC
16411649
>- NTAC 2 (rw [Once hnf_head_def])
1642-
>> MATCH_MP_TAC hnf_head_appstar
1643-
>> rw []
1650+
>> MATCH_MP_TAC hnf_head_appstar >> rw []
16441651
QED
16451652

1653+
(* |- hnf_head (VAR y) = VAR y *)
1654+
Theorem hnf_head_VAR[simp] =
1655+
(cj 2 hnf_head_hnf) |> Q.GEN ‘args’ |> Q.SPEC ‘[]’
1656+
|> REWRITE_RULE [appstar_empty]
1657+
16461658
Overload hnf_headvar = “\t. THE_VAR (hnf_head t)”
16471659

16481660
(* hnf_children retrives the ‘args’ part of absfree hnf *)
@@ -1678,6 +1690,10 @@ Proof
16781690
>> MATCH_MP_TAC hnf_children_appstar >> rw []
16791691
QED
16801692

1693+
(* |- hnf_children (VAR y) = [] *)
1694+
Theorem hnf_children_VAR[simp] =
1695+
hnf_children_hnf |> Q.SPECL [‘y’, ‘[]’] |> REWRITE_RULE [appstar_empty]
1696+
16811697
Theorem absfree_hnf_cases :
16821698
!M. hnf M /\ ~is_abs M <=> ?y args. M = VAR y @* args
16831699
Proof

0 commit comments

Comments
 (0)