@@ -2796,11 +2796,12 @@ QED
2796
2796
2797
2797
(* Definition 10.3.5 (ii) *)
2798
2798
Definition head_original_def :
2799
- head_original M0 = let n = LAMl_size M0;
2800
- vs = NEWS n (FV M0);
2801
- M1 = principle_hnf (M0 @* MAP VAR vs);
2802
- in
2803
- EVERY (\e. hnf_headvar M1 # e) (hnf_children M1)
2799
+ head_original M0 =
2800
+ let n = LAMl_size M0;
2801
+ vs = NEWS n (FV M0);
2802
+ M1 = principle_hnf (M0 @* MAP VAR vs)
2803
+ in
2804
+ EVERY (\e. hnf_headvar M1 # e) (hnf_children M1)
2804
2805
End
2805
2806
2806
2807
(* Definition 10.3.5 (iii)
@@ -2871,9 +2872,9 @@ QED
2871
2872
Definition subterm_width_def :
2872
2873
subterm_width M [] = 0 /\
2873
2874
subterm_width M (h::p) =
2874
- MAX_SET (IMAGE (hnf_children_size o principle_hnf)
2875
- {subterm' (FV M) M q 0 | q |
2876
- q <<= FRONT (h::p) /\ solvable (subterm' (FV M) M q 0 )})
2875
+ MAX_SET (IMAGE (hnf_children_size o principle_hnf)
2876
+ {subterm' (FV M) M q 0 | q |
2877
+ q <<= FRONT (h::p) /\ solvable (subterm' (FV M) M q 0 )})
2877
2878
End
2878
2879
2879
2880
(* |- subterm_width M [] = 0 *)
@@ -3029,12 +3030,10 @@ Proof
3029
3030
>> Q.EXISTS_TAC ‘q’ >> rw []
3030
3031
QED
3031
3032
3032
- (* cf. unsolvable_subst *)
3033
3033
Theorem solvable_subst_permutator :
3034
- !X M M0 r v P d. FINITE X /\ FV M SUBSET X UNION RANK r /\ v IN X UNION RANK r /\
3035
- M0 = principle_hnf M /\
3036
- P = permutator d /\ hnf_children_size M0 <= d /\
3037
- solvable M ==> solvable ([P/v] M)
3034
+ !X M r P v d. FINITE X /\ FV M SUBSET X UNION RANK r /\ v IN X UNION RANK r /\
3035
+ P = permutator d /\ hnf_children_size (principle_hnf M) <= d /\
3036
+ solvable M ==> solvable ([P/v] M)
3038
3037
Proof
3039
3038
RW_TAC std_ss []
3040
3039
>> qabbrev_tac ‘P = permutator d’
@@ -3078,24 +3077,26 @@ Proof
3078
3077
QED
3079
3078
3080
3079
Theorem solvable_subst_permutator_cong :
3081
- !X M M0 r v P d. FINITE X /\ FV M SUBSET X UNION RANK r /\ v IN X UNION RANK r /\
3082
- M0 = principle_hnf M /\
3083
- P = permutator d /\ hnf_children_size M0 <= d ==>
3084
- (solvable ([P/v] M) <=> solvable M)
3080
+ !X M r P v d.
3081
+ FINITE X /\ FV M SUBSET X UNION RANK r /\ v IN X UNION RANK r /\
3082
+ P = permutator d /\ hnf_children_size (principle_hnf M) <= d
3083
+ ==> (solvable ([P/v] M) <=> solvable M)
3085
3084
Proof
3086
3085
rpt STRIP_TAC
3087
3086
>> EQ_TAC >- PROVE_TAC [unsolvable_subst]
3088
3087
>> DISCH_TAC
3089
3088
>> MATCH_MP_TAC solvable_subst_permutator
3090
- >> qexistsl_tac [‘X’, ‘M0’, ‘ r’, ‘d’] >> rw []
3089
+ >> qexistsl_tac [‘X’, ‘r’, ‘d’] >> art []
3091
3090
QED
3092
3091
3093
3092
(*
3094
- Theorem solvable_permutator_ISUB :
3095
- !X M M0 r v P d. FINITE X /\ FV M SUBSET X UNION RANK r /\ v IN X UNION RANK r /\
3096
- M0 = principle_hnf M /\
3097
- P = permutator d /\ hnf_children_size M0 <= d /\
3098
- solvable M ==> solvable ([P/v] M)
3093
+ Theorem solvable_ISUB_permutator :
3094
+ !X M M0 r ss d.
3095
+ FINITE X /\ FV M SUBSET X UNION RANK r /\
3096
+ M0 = principle_hnf M /\ hnf_children_size M0 <= d /\
3097
+ DOM ss SUBSET X UNION RANK r /\
3098
+ (!P. MEM P (MAP FST ss) ==> P = permutator d) ==>
3099
+ solvable M ==> solvable (M ISUB ss)
3099
3100
Proof
3100
3101
RW_TAC std_ss []
3101
3102
>> qabbrev_tac ‘P = permutator d’
@@ -3109,8 +3110,8 @@ Proof
3109
3110
>> ‘TAKE n vs = vs’ by rw []
3110
3111
>> POP_ASSUM (rfs o wrap)
3111
3112
>> ‘M0 == M’ by rw [Abbr ‘M0’, lameq_principle_hnf']
3112
- >> ‘[P/v] M0 == [P/v] M ’ by rw [lameq_sub_cong ]
3113
- >> Suff ‘solvable ([P/v] M0 )’ >- PROVE_TAC [lameq_solvable_cong]
3113
+ >> ‘M0 ISUB ss == M ISUB ss ’ by rw [lameq_isub_cong ]
3114
+ >> Suff ‘solvable (M0 ISUB ss )’ >- PROVE_TAC [lameq_solvable_cong]
3114
3115
>> ‘FV P = {}’ by rw [Abbr ‘P’, FV_permutator]
3115
3116
>> ‘DISJOINT (set vs) (FV P)’ by rw [DISJOINT_ALT']
3116
3117
>> Know ‘~MEM v vs’
@@ -3797,7 +3798,7 @@ Proof
3797
3798
*)
3798
3799
>> Know ‘solvable ([P/v] M)’
3799
3800
>- (MATCH_MP_TAC solvable_subst_permutator \\
3800
- qexistsl_tac [‘X’, ‘M0’, ‘ r’, ‘d’] >> simp [])
3801
+ qexistsl_tac [‘X’, ‘r’, ‘d’] >> simp [])
3801
3802
>> DISCH_TAC
3802
3803
(* Now we need to know the exact form of ‘principle_hnf ([P/v] M)’.
3803
3804
@@ -5445,7 +5446,7 @@ Proof
5445
5446
>> DISCH_TAC
5446
5447
>> Know ‘solvable ([P/v] M)’
5447
5448
>- (MATCH_MP_TAC solvable_subst_permutator \\
5448
- qexistsl_tac [‘X’,‘M0’, ‘r’, ‘d’] >> simp [] \\
5449
+ qexistsl_tac [‘X’, ‘r’, ‘d’] >> simp [] \\
5449
5450
MP_TAC (Q.SPECL [‘X’, ‘M’, ‘h::p’, ‘r’] subterm_width_first) \\
5450
5451
simp [ltree_paths_def])
5451
5452
>> DISCH_TAC
@@ -6197,7 +6198,7 @@ Proof
6197
6198
>- (rpt STRIP_TAC \\
6198
6199
Know ‘MAP (\t. t ISUB ss) (MAP VAR xs) = MAP VAR xs’
6199
6200
>- (rw [LIST_EQ_REWRITE, EL_MAP] \\
6200
- MATCH_MP_TAC ISUB_VAR_FRESH >> rw [GSYM DOM_ALT_MAP_SND ] \\
6201
+ MATCH_MP_TAC ISUB_VAR_FRESH >> rw [GSYM DOM_ALT ] \\
6201
6202
simp [IN_IMAGE, IN_COUNT, Once DISJ_SYM] \\
6202
6203
STRONG_DISJ_TAC (* push ‘a < k’ *) \\
6203
6204
rename1 ‘EL x xs <> y a’ \\
0 commit comments