Skip to content

Commit 385324d

Browse files
committed
Move side lemmas in the files they belong
1 parent b3d60cf commit 385324d

File tree

10 files changed

+159
-173
lines changed

10 files changed

+159
-173
lines changed

_CoqProject

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ theories/proofmode/register_tactics.v
4343
# Program logic: Unary WP rules
4444
theories/program_logic/transiently.v
4545
theories/program_logic/wp_opt.v
46-
theories/program_logic/cerisier_state_interp.v
46+
theories/program_logic/base_logic.v
4747
theories/program_logic/rules_base.v
4848
theories/program_logic/rules_fail.v
4949
theories/program_logic/rules/rules_Get.v

theories/logrel/ftlr/EInit.v

Lines changed: 0 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -6,56 +6,6 @@ From cap_machine.logrel Require Import ftlr_base interp_weakening.
66
From cap_machine.program_logic Require Import rules_EInit.
77
From cap_machine Require Import proofmode.
88

9-
(* TODO generalise *)
10-
Lemma map_Forall_all_P (w : LWord) (la : list Addr) (lws : list LWord) (v : Version)
11-
(P : LWord -> Prop) :
12-
NoDup la ->
13-
length lws = length la ->
14-
w ∈ lws ->
15-
map_Forall
16-
(λ (a : LAddr) (lw : LWord), laddr_get_addr a ∈ la ∧ (laddr_get_version a) = v → P lw)
17-
(logical_region_map la lws v)
18-
-> P w.
19-
Proof.
20-
generalize dependent lws.
21-
generalize dependent w.
22-
induction la as [|a la]; intros w lws Hnodup Hlen Hw Hall_z.
23-
- destruct lws ; set_solver.
24-
- destruct lws as [|w1 lws] ; first set_solver.
25-
cbn in Hlen ; simplify_eq.
26-
apply NoDup_cons in Hnodup as [Ha_notin_l Hnodup].
27-
cbn in Hall_z.
28-
apply map_Forall_insert in Hall_z as [Hladdr Hall_z].
29-
2: { rewrite -not_elem_of_list_to_map.
30-
intro Hcontra.
31-
rewrite elem_of_list_fmap in Hcontra.
32-
destruct Hcontra as ([x vx] & Hx & Hcontra)
33-
; cbn in Hx ; simplify_eq.
34-
apply elem_of_zip_l in Hcontra.
35-
rewrite elem_of_list_fmap in Hcontra.
36-
destruct Hcontra as (y & Hy & Hcontra)
37-
; cbn in Hy ; simplify_eq.
38-
set_solver.
39-
}
40-
apply elem_of_cons in Hw as [-> | Hw].
41-
* apply Hladdr; set_solver.
42-
* eapply IHla; eauto.
43-
eapply map_Forall_impl; eauto.
44-
intros [y vy] wy IH Hy; cbn in *.
45-
apply IH.
46-
set_solver.
47-
Qed.
48-
49-
Lemma elem_of_logical_region (a : Addr) (la : list Addr) (v : Version) :
50-
a ∈ la <->
51-
(a, v) ∈ logical_region la v.
52-
Proof.
53-
split; rewrite /logical_region; intros Ha.
54-
- by apply elem_of_list_fmap; exists a.
55-
- apply elem_of_list_fmap in Ha.
56-
by destruct Ha as (? & ? & ?); simplify_eq.
57-
Qed.
58-
599
Section fundamental.
6010
Context {Σ:gFunctors} {ceriseg:ceriseG Σ} {sealsg: sealStoreG Σ}
6111
{nainv: logrel_na_invs Σ}

theories/opsem/cap_lang.v

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,29 @@ Proof.
415415
; [eapply sweep_registers_addr_spec | eapply sweep_memory_addr_spec].
416416
Qed.
417417

418+
Lemma sweep_implies_no_pc {phr phm p pc_b pc_e pc_a r a} b e :
419+
phr !! PC = Some (WCap p pc_b pc_e pc_a)
420+
→ phr !! r = Some (WCap RX b e a)
421+
→ sweep_reg phm phr r = true
422+
→ r ≠ PC
423+
-> pc_a ∈ finz.seq_between pc_b pc_e
424+
→ pc_a ∉ finz.seq_between b e.
425+
Proof.
426+
intros Hpc Hr Hsweep Hinbouds pcHrpc.
427+
unfold sweep_reg, sweep_memory_reg, sweep_registers_reg in Hsweep.
428+
rewrite Hr in Hsweep.
429+
rewrite andb_true_iff in Hsweep.
430+
destruct Hsweep as [_ Hsweep].
431+
unfold unique_in_registers in *.
432+
rewrite bool_decide_eq_true in Hsweep.
433+
rewrite map_Forall_lookup in Hsweep.
434+
eapply Hsweep in Hpc.
435+
destruct (decide (PC = r)); eauto.
436+
apply overlap_word_disjoint in Hpc.
437+
intro Hpca.
438+
eapply elem_of_disjoint; eauto.
439+
Qed.
440+
418441
Section opsem.
419442
Context `{MachineParameters}.
420443

File renamed without changes.

theories/program_logic/logical_mapsto.v

Lines changed: 131 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,7 +1197,25 @@ Proof.
11971197
now eapply lookup_insert.
11981198
Qed.
11991199

1200-
Lemma update_version_region_insert
1200+
Lemma update_version_region_insert (glmem llmem : LMem) (a : Addr) (la : list Addr) (v v' : Version) (lw : LWord) :
1201+
a ∉ la ->
1202+
(<[(a, v):= lw]> (update_version_region glmem la v' llmem)) =
1203+
(update_version_region (<[(a, v):= lw]> glmem) la v' (<[(a, v):= lw]> llmem)).
1204+
Proof.
1205+
revert a v v' lw glmem llmem.
1206+
induction la; intros a' v v' lw glmem llmem Ha'; first set_solver.
1207+
cbn.
1208+
rewrite -/(update_version_region glmem la v' llmem).
1209+
rewrite -/(update_version_region (<[(a', v):=lw]> glmem) la v' (<[(a', v):=lw]> llmem)).
1210+
rewrite /update_version_addr.
1211+
rewrite lookup_insert_ne; last (intro; simplify_eq; set_solver).
1212+
destruct ( glmem !! (a, v') ) eqn:Ha_glmem; rewrite Ha_glmem.
1213+
- rewrite insert_commute; last (intro; simplify_eq; set_solver).
1214+
rewrite IHla; set_solver.
1215+
- rewrite IHla; set_solver.
1216+
Qed.
1217+
1218+
Lemma update_version_region_insert_subseteq
12011219
(glmem lmem lmem' : LMem) (la : list Addr) (a' : Addr) (v v' : Version) (lw : LWord):
12021220
NoDup la ->
12031221
a' ∉ la ->
@@ -1775,7 +1793,7 @@ Proof.
17751793
+ split; cbn in *; try done.
17761794
eapply insert_subseteq_r_inv; eauto.
17771795
- destruct Hvalid as (Hupd & Hgl_llmem & HmaxMap' & HnextMap).
1778-
split; first (eapply update_version_region_insert; eauto).
1796+
split; first (eapply update_version_region_insert_subseteq; eauto).
17791797
split; auto.
17801798
eapply insert_subseteq_r_inv; eauto.
17811799
Qed.
@@ -2197,6 +2215,76 @@ Proof.
21972215
eapply lmeasure_measure_aux; eauto.
21982216
Qed.
21992217

2218+
Definition lmeasure `{MP : MachineParameters} (m : LMem) (b e: Addr) v : option Z :=
2219+
hash_instr ← hash_lmemory_range m (b^+1)%a e v;
2220+
Some (hash_concat (hash b) hash_instr).
2221+
2222+
Lemma lmeasure_weaken_aux (lmem lmt: LMem) (la : list Addr) (v : Version) :
2223+
lmem ⊆ lmt →
2224+
Forall (fun a => is_Some (lmem !! (a, v))) la →
2225+
lmemory_get_instrs lmem la v = lmemory_get_instrs lmt la v.
2226+
Proof.
2227+
intros Hincl Hall.
2228+
induction la ; first done.
2229+
rewrite Forall_cons in Hall. destruct Hall as [ [w Ha] Hall].
2230+
apply IHla in Hall.
2231+
assert (lmt !! (a, v) = Some w) as Ha' by (eapply lookup_weaken in Ha ; eauto).
2232+
cbn.
2233+
rewrite -/(lmemory_get_instrs lmem la v) -/(lmemory_get_instrs lmt la v).
2234+
by rewrite Ha Ha' Hall.
2235+
Qed.
2236+
2237+
Lemma lmeasure_weaken `{MP : MachineParameters} {lmem lmt} {b e v} :
2238+
lmem ⊆ lmt →
2239+
Forall (fun a => is_Some (lmem !! (a, v))) (finz.seq_between b e) →
2240+
hash_lmemory_range lmem b e v = hash_lmemory_range lmt b e v.
2241+
Proof.
2242+
intros Hincl Hall.
2243+
rewrite /hash_lmemory_range.
2244+
erewrite lmeasure_weaken_aux; eauto.
2245+
Qed.
2246+
2247+
Definition ensures_is_zL (lmem : LMem) (b e : Addr) (v : Version) : Prop :=
2248+
map_Forall (fun la lw => (laddr_get_addr la) ∈ (finz.seq_between b e) ∧ (laddr_get_version la) = v
2249+
-> is_zL lw) lmem.
2250+
2251+
Lemma ensures_is_z_corresponds {phr phm lr lm vmap} {p} {b e a} {v} :
2252+
state_phys_log_corresponds phr phm lr lm vmap →
2253+
is_cur_word (LCap p b e a v) vmap ->
2254+
ensures_is_z phm b e →
2255+
ensures_is_zL lm b e v.
2256+
Proof.
2257+
intros Hcorr Hr Hensure_z.
2258+
rewrite /ensures_is_zL.
2259+
rewrite /ensures_is_z in Hensure_z.
2260+
apply bool_decide_unpack in Hensure_z.
2261+
destruct Hcorr as [ Hreg (? & ? & ?) ].
2262+
rewrite /is_cur_word in Hr.
2263+
rewrite /mem_vmap_root in H0.
2264+
rewrite /mem_current_version in H.
2265+
rewrite map_Forall_lookup in H.
2266+
rewrite map_Forall_lookup.
2267+
intros [a' v'] lw Hla [Hla_in ?]; cbn in *; simplify_eq.
2268+
specialize (Hr a' Hla_in).
2269+
rewrite map_Forall_lookup in H0; eauto.
2270+
eapply H0 in Hr.
2271+
destruct Hr as (?&?&?&?); cbn in *.
2272+
rewrite map_Forall_lookup in Hensure_z; eauto.
2273+
rewrite H2 in Hla; simplify_eq.
2274+
apply Hensure_z in H3; eauto.
2275+
destruct lw ; eauto.
2276+
Qed.
2277+
2278+
Lemma ensures_is_z_mono {lm lm'} {b e} {v} :
2279+
lm ⊆ lm' → ensures_is_zL lm' b e v -> ensures_is_zL lm b e v.
2280+
Proof.
2281+
intros Hsub Hensure_is_zL.
2282+
rewrite /ensures_is_zL in Hensure_is_zL |- *.
2283+
rewrite map_Forall_lookup.
2284+
intros [a v'] lw Hla [Hin ?] ; cbn in *; simplify_eq.
2285+
eapply lookup_weaken in Hla; eauto.
2286+
Qed.
2287+
22002288
End Logical_mapsto.
22012289

22022290
Section lmachine_param.
@@ -2287,10 +2375,8 @@ Qed.
22872375

22882376
(** Miscellaneous about logical regions *)
22892377
(* TODO move definition to regions.v ? *)
2290-
22912378
Lemma elem_of_logical_region (a : Addr) (la : list Addr) (v : Version) :
2292-
a ∈ la <->
2293-
(a, v) ∈ logical_region la v.
2379+
a ∈ la <-> (a, v) ∈ logical_region la v.
22942380
Proof.
22952381
split; rewrite /logical_region; intros Ha.
22962382
- by apply elem_of_list_fmap; exists a.
@@ -2860,3 +2946,43 @@ Proof.
28602946
cbn. intros Hreg Hcurregs.
28612947
apply (map_Forall_lookup_1 _ _ _ _ Hcurregs Hreg).
28622948
Qed.
2949+
2950+
(* TODO generalise *)
2951+
Lemma map_Forall_all_P (w : LWord) (la : list Addr) (lws : list LWord) (v : Version)
2952+
(P : LWord -> Prop) :
2953+
NoDup la ->
2954+
length lws = length la ->
2955+
w ∈ lws ->
2956+
map_Forall
2957+
(λ (a : LAddr) (lw : LWord), laddr_get_addr a ∈ la ∧ (laddr_get_version a) = v → P lw)
2958+
(logical_region_map la lws v)
2959+
-> P w.
2960+
Proof.
2961+
generalize dependent lws.
2962+
generalize dependent w.
2963+
induction la as [|a la]; intros w lws Hnodup Hlen Hw Hall_z.
2964+
- destruct lws ; set_solver.
2965+
- destruct lws as [|w1 lws] ; first set_solver.
2966+
cbn in Hlen ; simplify_eq.
2967+
apply NoDup_cons in Hnodup as [Ha_notin_l Hnodup].
2968+
cbn in Hall_z.
2969+
apply map_Forall_insert in Hall_z as [Hladdr Hall_z].
2970+
2: { rewrite -not_elem_of_list_to_map.
2971+
intro Hcontra.
2972+
rewrite elem_of_list_fmap in Hcontra.
2973+
destruct Hcontra as ([x vx] & Hx & Hcontra)
2974+
; cbn in Hx ; simplify_eq.
2975+
apply elem_of_zip_l in Hcontra.
2976+
rewrite elem_of_list_fmap in Hcontra.
2977+
destruct Hcontra as (y & Hy & Hcontra)
2978+
; cbn in Hy ; simplify_eq.
2979+
set_solver.
2980+
}
2981+
apply elem_of_cons in Hw as [-> | Hw].
2982+
* apply Hladdr; set_solver.
2983+
* eapply IHla; eauto.
2984+
eapply map_Forall_impl; eauto.
2985+
intros [y vy] wy IH Hy; cbn in *.
2986+
apply IH.
2987+
set_solver.
2988+
Qed.

theories/program_logic/rules/rules_EInit.v

Lines changed: 0 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -91,48 +91,6 @@ Section cap_lang_rules.
9191

9292
EInit_fail lregs lmem r_code r_data tidx ot.
9393

94-
Definition ensures_is_zL lmem b e v : Prop :=
95-
map_Forall (fun la lw => (laddr_get_addr la) ∈ (finz.seq_between b e) ∧ (laddr_get_version la) = v
96-
-> is_zL lw) lmem.
97-
98-
Lemma ensures_is_z_corresponds {phr phm lr lm vmap} {r} {p} {b e a} {v} :
99-
state_phys_log_corresponds phr phm lr lm vmap →
100-
is_cur_word (LCap p b e a v) vmap ->
101-
ensures_is_z phm b e →
102-
ensures_is_zL lm b e v.
103-
Proof.
104-
intros Hcorr Hr Hensure_z.
105-
rewrite /ensures_is_zL.
106-
rewrite /ensures_is_z in Hensure_z.
107-
apply bool_decide_unpack in Hensure_z.
108-
destruct Hcorr as [ Hreg (? & ? & ?) ].
109-
rewrite /is_cur_word in Hr.
110-
rewrite /mem_vmap_root in H0.
111-
rewrite /mem_current_version in H.
112-
rewrite map_Forall_lookup in H.
113-
rewrite map_Forall_lookup.
114-
intros [a' v'] lw Hla [Hla_in ?]; cbn in *; simplify_eq.
115-
specialize (Hr a' Hla_in).
116-
rewrite map_Forall_lookup in H0; eauto.
117-
eapply H0 in Hr.
118-
destruct Hr as (?&?&?&?); cbn in *.
119-
rewrite map_Forall_lookup in Hensure_z; eauto.
120-
rewrite H2 in Hla; simplify_eq.
121-
apply Hensure_z in H3; eauto.
122-
destruct lw ; eauto.
123-
Qed.
124-
125-
Lemma ensures_is_z_mono {lm lm'} {b e} {v} :
126-
lm ⊆ lm' →
127-
ensures_is_zL lm' b e v -> ensures_is_zL lm b e v.
128-
Proof.
129-
intros Hsub Hensure_is_zL.
130-
rewrite /ensures_is_zL in Hensure_is_zL |- *.
131-
rewrite map_Forall_lookup.
132-
intros [a v'] lw Hla [Hin ?] ; cbn in *; simplify_eq.
133-
eapply lookup_weaken in Hla; eauto.
134-
Qed.
135-
13694
Definition EInit_spec_success (lregs lregs' : LReg) (lmem1 lmem4 : LMem) (tidx tidx_incr : TIndex)
13795
(ot : OType) (r_code r_data : RegName) (retv : val) : iProp Σ :=
13896
∃ glmem lmem2 lmem3 (code_b code_e code_a : Addr) (code_v : Version) (data_b data_e data_a : Addr)
@@ -185,77 +143,6 @@ Section cap_lang_rules.
185143
-> readAllowed p = true
186144
-> (finz.seq_between b e) ## reserved_addresses.
187145

188-
Definition lmeasure (m : LMem) (b e: Addr) v : option Z :=
189-
hash_instr ← hash_lmemory_range m (b^+1)%a e v;
190-
Some (hash_concat (hash b) hash_instr).
191-
192-
193-
Lemma lmeasure_weaken_aux (lmem lmt: LMem) (la : list Addr) (v : Version) :
194-
lmem ⊆ lmt →
195-
Forall (fun a => is_Some (lmem !! (a, v))) la →
196-
lmemory_get_instrs lmem la v = lmemory_get_instrs lmt la v.
197-
Proof.
198-
intros Hincl Hall.
199-
induction la ; first done.
200-
rewrite Forall_cons in Hall. destruct Hall as [ [w Ha] Hall].
201-
apply IHla in Hall.
202-
assert (lmt !! (a, v) = Some w) as Ha' by (eapply lookup_weaken in Ha ; eauto).
203-
cbn.
204-
rewrite -/(lmemory_get_instrs lmem la v) -/(lmemory_get_instrs lmt la v).
205-
by rewrite Ha Ha' Hall.
206-
Qed.
207-
208-
Lemma lmeasure_weaken {lmem lmt} {b e v} :
209-
lmem ⊆ lmt →
210-
Forall (fun a => is_Some (lmem !! (a, v))) (finz.seq_between b e) →
211-
hash_lmemory_range lmem b e v = hash_lmemory_range lmt b e v.
212-
Proof.
213-
intros Hincl Hall.
214-
rewrite /hash_lmemory_range.
215-
erewrite lmeasure_weaken_aux; eauto.
216-
Qed.
217-
218-
Lemma sweep_implies_no_pc {σ p pc_b pc_e pc_a r a v} b e :
219-
reg σ !! PC = Some (WCap p pc_b pc_e pc_a)
220-
→ reg σ !! r = Some (WCap RX b e a)
221-
→ sweep_reg (mem σ) (reg σ) r = true
222-
→ r ≠ PC
223-
-> pc_a ∈ finz.seq_between pc_b pc_e
224-
→ pc_a ∉ finz.seq_between b e.
225-
Proof.
226-
intros Hpc Hr Hsweep Hinbouds pcHrpc.
227-
unfold sweep_reg, sweep_memory_reg, sweep_registers_reg in Hsweep.
228-
rewrite Hr in Hsweep.
229-
rewrite andb_true_iff in Hsweep.
230-
destruct Hsweep as [_ Hsweep].
231-
unfold unique_in_registers in *.
232-
rewrite bool_decide_eq_true in Hsweep.
233-
rewrite map_Forall_lookup in Hsweep.
234-
eapply Hsweep in Hpc.
235-
destruct (decide (PC = r)); eauto.
236-
apply overlap_word_disjoint in Hpc.
237-
intro Hpca.
238-
eapply elem_of_disjoint; eauto.
239-
Qed.
240-
241-
Lemma update_version_region_insert (a : Addr) (la : list Addr) (v v' : Version) (lw : LWord) (glmem llmem : LMem ) :
242-
a ∉ la ->
243-
(<[(a, v):= lw]> (update_version_region glmem la v' llmem)) =
244-
(update_version_region (<[(a, v):= lw]> glmem) la v' (<[(a, v):= lw]> llmem)).
245-
Proof.
246-
revert a v v' lw glmem llmem.
247-
induction la; intros a' v v' lw glmem llmem Ha'; first set_solver.
248-
cbn.
249-
rewrite -/(update_version_region glmem la v' llmem).
250-
rewrite -/(update_version_region (<[(a', v):=lw]> glmem) la v' (<[(a', v):=lw]> llmem)).
251-
rewrite /update_version_addr.
252-
rewrite lookup_insert_ne; last (intro; simplify_eq; set_solver).
253-
destruct ( glmem !! (a, v') ) eqn:Ha_glmem; rewrite Ha_glmem.
254-
- rewrite insert_commute; last (intro; simplify_eq; set_solver).
255-
rewrite IHla; set_solver.
256-
- rewrite IHla; set_solver.
257-
Qed.
258-
259146
Definition exec_optL_EInit {A}
260147
(lregs : LReg) (lmem : LMem)
261148
(r1 r2 : RegName) (code_sweep data_sweep : bool)

0 commit comments

Comments
 (0)