Skip to content

Commit dce67e1

Browse files
committed
Complete a round of moves / clean up
1 parent aadd36e commit dce67e1

8 files changed

+181
-313
lines changed

language/pure_expScript.sml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ Definition Lams_def:
4747
Lams (v::vs) b = Lam v (Lams vs b)
4848
End
4949

50+
Definition Seqs_def[simp]: (* TODO: move *)
51+
Seqs [] x = x /\
52+
Seqs (y::ys) x = Seq y (Seqs ys x)
53+
End
54+
5055
Definition Bottom_def:
5156
Bottom = Letrec [("bot",Var "bot")] (Var "bot")
5257
End

meta-theory/pure_beta_equivScript.sml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ Definition iidd_def:
614614
iidd = Lam "y" (App id (Var "y"))
615615
End
616616

617-
(*TODO: a tactic that, given a goal like:
617+
(* Would be nice to have a tactic that, given a goal like:
618618
619619
exp_alpha (Lam "y" (Var "y")) (Lam "x" (Var "x"))
620620
@@ -642,4 +642,3 @@ Theorem id_iidd_equivalence_expanded =
642642
id_iidd_equivalence |> REWRITE_RULE [iidd_def,id_def]
643643

644644
val _ = export_theory();
645-

meta-theory/pure_congruenceScript.sml

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2973,13 +2973,6 @@ Proof
29732973
simp [bind_def, SF SFY_ss]
29742974
QED
29752975

2976-
Triviality ignore_FDIFF: (* TODO: move *)
2977-
DISJOINT f (FDOM m) ⇒ FDIFF m f = m
2978-
Proof
2979-
fs [fmap_eq_flookup,FLOOKUP_DEF,FDIFF_def,DRESTRICT_DEF,IN_DISJOINT]
2980-
\\ metis_tac []
2981-
QED
2982-
29832976
Theorem Lams_cong:
29842977
∀vs x y. (x ≅? y) b ⇒ (Lams vs x ≅? Lams vs y) b
29852978
Proof

meta-theory/pure_exp_lemmasScript.sml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -913,4 +913,37 @@ Proof
913913
rw[closed_def, freevars_Lams] >> simp[SUBSET_DIFF_EMPTY]
914914
QED
915915

916+
Theorem Apps_append:
917+
∀xs ys x. Apps x (xs ++ ys) = Apps (Apps x xs) ys
918+
Proof
919+
Induct \\ fs [Apps_def]
920+
QED
921+
922+
Theorem Apps_11:
923+
∀xs ys x y. Apps x xs = Apps y ys ∧ LENGTH xs = LENGTH ys ⇒ x = y ∧ xs = ys
924+
Proof
925+
Induct \\ fs [Apps_def]
926+
\\ Cases_on ‘ys’ \\ fs [Apps_def]
927+
\\ rw [] \\ res_tac \\ fs []
928+
QED
929+
930+
Theorem subst_Seqs:
931+
∀xs y. subst m (Seqs xs y) = Seqs (MAP (subst m) xs) (subst m y)
932+
Proof
933+
Induct \\ fs [subst_def]
934+
QED
935+
936+
Theorem subst_Apps:
937+
∀xs m f. subst m (Apps f xs) = Apps (subst m f) (MAP (subst m) xs)
938+
Proof
939+
Induct \\ fs [Apps_def,subst_def]
940+
QED
941+
942+
Theorem ignore_FDIFF:
943+
DISJOINT f (FDOM m) ⇒ FDIFF m f = m
944+
Proof
945+
fs [fmap_eq_flookup,FLOOKUP_DEF,FDIFF_def,DRESTRICT_DEF,IN_DISJOINT]
946+
\\ metis_tac []
947+
QED
948+
916949
val _ = export_theory();

meta-theory/pure_letrec_congScript.sml

Lines changed: 8 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -52,20 +52,14 @@ Proof
5252
\\ rw [] \\ res_tac \\ fs []
5353
QED
5454

55-
Triviality LIST_REL_opp: (* TODO: move *)
56-
∀xs ys. LIST_REL R xs ys ⇒ LIST_REL (λx y. R y x) ys xs
57-
Proof
58-
Induct \\ fs [PULL_EXISTS]
59-
QED
60-
6155
Theorem letrec_binds_opp:
6256
letrec_binds binds2 binds1 = (λx y. letrec_binds binds1 binds2 y x)
6357
Proof
6458
qsuff_tac ‘∀b2 b1 x y. letrec_binds b2 b1 x y ⇒ letrec_binds b1 b2 y x’
6559
>- (rw [FUN_EQ_THM] \\ eq_tac \\ fs [])
6660
\\ ho_match_mp_tac letrec_binds_ind \\ rw []
6761
\\ simp [Once letrec_binds_cases]
68-
\\ imp_res_tac LIST_REL_opp \\ fs [SF ETA_ss]
62+
\\ once_rewrite_tac [LIST_REL_SWAP] \\ fs [SF ETA_ss]
6963
QED
7064

7165
Theorem letrec_binds_freevars:
@@ -145,12 +139,6 @@ Proof
145139
\\ metis_tac []
146140
QED
147141

148-
Triviality MAP_ID: (* TODO: move *)
149-
∀xs f. (MAP f xs = xs) ⇔ ∀x. MEM x xs ⇒ f x = x
150-
Proof
151-
Induct \\ fs [] \\ metis_tac []
152-
QED
153-
154142
Theorem subst_letrec_binds:
155143
∀b1 b2 x y m1 m2.
156144
letrec_binds b1 b2 x y ∧
@@ -165,7 +153,7 @@ Proof
165153
(fs [subst_def]
166154
\\ simp [Once letrec_binds_cases]
167155
\\ disj1_tac
168-
\\ fs [MAP_ID,FORALL_PROD]
156+
\\ fs [MAP_ID_EQ,FORALL_PROD]
169157
\\ reverse (rw [])
170158
>-
171159
(last_x_assum irule \\ fs [FDOM_FDIFF,EXTENSION,SUBSET_DEF]
@@ -235,21 +223,6 @@ Proof
235223
fs [FDOM_FUPDATE_LIST,MAP_MAP_o,combinTheory.o_DEF,UNCURRY,SF ETA_ss]
236224
QED
237225

238-
Triviality FORALL_FRANGE: (* TODO: move *)
239-
(∀v. v ∈ FRANGE m ⇒ P v) ⇔ ∀k v. FLOOKUP m k = SOME v ⇒ P v
240-
Proof
241-
fs [FRANGE_DEF,FLOOKUP_DEF,PULL_EXISTS]
242-
QED
243-
244-
Triviality MEM_IMP_EQ: (* TODO: move *)
245-
∀b1 k p1 p2.
246-
MEM (k,p1) b1 ∧ MEM (k,p2) b1 ∧ ALL_DISTINCT (MAP FST b1) ⇒ p1 = p2
247-
Proof
248-
Induct \\ fs [FORALL_PROD] \\ rw []
249-
\\ fs [MEM_MAP,EXISTS_PROD]
250-
\\ res_tac \\ fs []
251-
QED
252-
253226
Triviality EVERY_FLOOKUP_closed_lemma:
254227
EVERY (λe. freevars e ⊆ set (MAP FST ys)) (MAP SND ys) ⇒
255228
(∀n v.
@@ -262,12 +235,6 @@ Proof
262235
\\ res_tac \\ fs []
263236
QED
264237

265-
Triviality FORALL_FRANGE: (* TODO: move *)
266-
(∀x. x IN FRANGE v ⇒ p x) ⇔ ∀k x. FLOOKUP v k = SOME x ⇒ p x
267-
Proof
268-
fs [FRANGE_DEF,FLOOKUP_DEF,PULL_EXISTS]
269-
QED
270-
271238
Theorem ALOOKUP_REVERSE_LIST_REL:
272239
∀bs ys.
273240
LIST_REL p (MAP SND bs) (MAP SND ys) ∧
@@ -285,42 +252,21 @@ Proof
285252
\\ metis_tac []
286253
QED
287254

288-
Theorem MEM_LIST_REL: (* TODO: move *)
255+
Theorem MEM_LIST_REL[local]:
289256
∀xs ys P y. LIST_REL P xs ys ∧ MEM y ys ⇒ ∃x. MEM x xs ∧ P x y
290257
Proof
291-
Induct \\ fs [PULL_EXISTS]
292-
\\ rw [] \\ fs [] \\ res_tac \\ fs []
293-
\\ metis_tac []
258+
metis_tac [LIST_REL_MEM_ALT]
294259
QED
295260

296-
Theorem MEM_LIST_REL1: (* TODO: move *)
261+
Theorem MEM_LIST_REL1:
297262
∀xs ys P x. LIST_REL P xs ys ∧ MEM x xs ⇒ ∃y. MEM y ys ∧ P x y
298263
Proof
299-
Induct \\ fs [PULL_EXISTS]
300-
\\ rw [] \\ fs [] \\ res_tac \\ fs []
301-
\\ metis_tac []
302-
QED
303-
304-
Theorem LIST_REL_COMP: (* TODO: move *)
305-
∀xs ys zs.
306-
LIST_REL f xs ys ∧ LIST_REL g ys zs ⇒
307-
LIST_REL (λx z. ∃y. f x y ∧ g y z) xs zs
308-
Proof
309-
Induct \\ fs [PULL_EXISTS]
310-
\\ metis_tac []
264+
metis_tac [LIST_REL_MEM]
311265
QED
312266

313267
Triviality eval_wh_Constructor_NIL_bisim =
314268
eval_wh_Constructor_bisim |> Q.GEN ‘xs’ |> Q.SPEC ‘[]’ |> SIMP_RULE (srw_ss()) [];
315269

316-
Triviality LIST_REL_IMP_MAP_EQ: (* TODO: move *)
317-
∀xs ys P f g.
318-
(∀x y. MEM x xs ∧ MEM y ys ∧ P x y ⇒ f x = g y) ⇒
319-
LIST_REL P xs ys ⇒ MAP g ys = MAP f xs
320-
Proof
321-
Induct \\ fs [PULL_EXISTS,SF DNF_ss] \\ metis_tac []
322-
QED
323-
324270
Theorem eval_forward_letrec_binds:
325271
ALL_DISTINCT (MAP FST binds2) ∧
326272
MAP FST binds1 = MAP FST binds2 ∧
@@ -811,27 +757,13 @@ Proof
811757
\\ irule_at Any eval_forward_letrec_binds
812758
\\ fs []
813759
\\ pop_assum kall_tac
814-
\\ drule LIST_REL_opp \\ fs []
760+
\\ pop_assum mp_tac \\ simp [Once LIST_REL_SWAP] \\ fs []
815761
\\ fs [UNCURRY,LAMBDA_PROD]
816762
\\ match_mp_tac LIST_REL_mono
817763
\\ fs [FORALL_PROD]
818764
\\ metis_tac [app_bisimilarity_sym]
819765
QED
820766

821-
Triviality FST_LAM: (* TODO: move *)
822-
FST = λ(p1,p2). p1
823-
Proof
824-
fs [FUN_EQ_THM,FORALL_PROD]
825-
QED
826-
827-
Triviality LIST_REL_MAP_CONG: (* TODO: move *)
828-
∀xs ys R Q f.
829-
(∀x y. R x y ∧ MEM x xs ∧ MEM y ys ⇒ Q (f x) (f y)) ∧ LIST_REL R xs ys ⇒
830-
LIST_REL Q (MAP f xs) (MAP f ys)
831-
Proof
832-
Induct \\ fs [PULL_EXISTS] \\ metis_tac []
833-
QED
834-
835767
Triviality LIST_REL_IMP_same_keys:
836768
∀binds1 binds2.
837769
LIST_REL (λ(v1,e1) (v2,e2). v1 = v2) binds1 binds2 ⇒
@@ -860,7 +792,7 @@ Proof
860792
(rw [] \\ irule pure_exp_lemmasTheory.IMP_closed_bind \\ fs [])
861793
\\ rw [bind_def] \\ fs [subst_def,bind_def] \\ fs [SF SFY_ss]
862794
\\ irule exp_eq_Letrec_change_lemma
863-
\\ gs [MAP_MAP_o,combinTheory.o_DEF,LAMBDA_PROD,GSYM FST_LAM]
795+
\\ gs [MAP_MAP_o,combinTheory.o_DEF,LAMBDA_PROD,FST_INTRO]
864796
\\ conj_tac
865797
>-
866798
(irule LIST_REL_MAP_CONG \\ fs []

0 commit comments

Comments
 (0)