Skip to content
Snippets Groups Projects
Commit 528c968c authored by Jonas Kastberg's avatar Jonas Kastberg
Browse files

Removed redundant _pers specs, and added missing matrix file

parent dc5a67a0
No related branches found
No related tags found
2 merge requests!39Multiparty synchronous,!37Added matrix abstraction and redefined channels using it
This commit is part of merge request !37. Comments created here will be created in the context of that merge request.
...@@ -250,8 +250,8 @@ Section channel. ...@@ -250,8 +250,8 @@ Section channel.
wp_pures. wp_pures.
iDestruct "Hi" as %Hi. iDestruct "Hi" as %Hi.
iDestruct "Hj" as %Hj. iDestruct "Hj" as %Hj.
wp_smart_apply (matrix_get_spec_pers with "Hls"); [done..|]. wp_smart_apply (matrix_get_spec with "Hls"); [done..|].
iIntros (l') "Hl'". iIntros (l') "[Hl' _]".
iDestruct "Hl'" as (γt) "#IHl1". iDestruct "Hl'" as (γt) "#IHl1".
wp_pures. wp_bind (Store _ _). wp_pures. wp_bind (Store _ _).
iInv "IHl1" as "HIp". iInv "IHl1" as "HIp".
...@@ -336,8 +336,8 @@ Section channel. ...@@ -336,8 +336,8 @@ Section channel.
wp_pure _. wp_pure _.
iDestruct "Hi" as %Hi. iDestruct "Hi" as %Hi.
iDestruct "Hj" as %Hj. iDestruct "Hj" as %Hj.
wp_smart_apply (matrix_get_spec_pers with "Hls"); [done..|]. wp_smart_apply (matrix_get_spec with "Hls"); [done..|].
iIntros (l') "Hl'". iIntros (l') "[Hl' _]".
iDestruct "Hl'" as (γt) "#IHl2". iDestruct "Hl'" as (γt) "#IHl2".
wp_pures. wp_pures.
wp_bind (Xchg _ _). wp_bind (Xchg _ _).
......
From iris.bi Require Import big_op.
From iris.heap_lang Require Export primitive_laws notation proofmode.
Definition new_matrix : val :=
λ: "m" "n" "v", (AllocN ("m"*"n") "v","m","n").
Definition pos (n i j : nat) : nat := i * n + j.
Definition vpos : val := λ: "n" "i" "j", "i"*"n" + "j".
Definition matrix_get : val :=
λ: "m" "i" "j",
let: "l" := Fst (Fst "m") in
let: "n" := Snd "m" in
"l" + vpos "n" "i" "j".
Section with_Σ.
Context `{heapGS Σ}.
Definition is_matrix (v : val) (m n : nat)
(P : nat nat loc iProp Σ) : iProp Σ :=
(l:loc),
v = PairV (PairV #l #m) #n
[ list] i _ replicate m (),
[ list] j _ replicate n (),
P i j (l + pos n i j).
Lemma array_to_matrix_pre l n m v :
l ↦∗ replicate (n * m) v -∗
[ list] i _ replicate n (), (l + i*m) ↦∗ replicate m v.
Proof.
iIntros "Hl".
iInduction n as [|n] "IHn"; [done|].
replace (S n) with (n + 1) by lia.
replace ((n + 1) * m) with (n * m + m) by lia.
rewrite !replicate_add /= array_app=> /=.
iDestruct "Hl" as "[Hl Hls]".
iDestruct ("IHn" with "Hl") as "Hl".
iFrame=> /=.
rewrite Nat.add_0_r !replicate_length.
replace (Z.of_nat (n * m)) with (Z.of_nat n * Z.of_nat m)%Z by lia.
by iFrame.
Qed.
(* TODO: rename *)
Lemma big_sepL_replicate_type {A B} n (x1 : A) (x2 : B) (P : nat iProp Σ) :
([ list] i _ replicate n x1, P i)
([ list] i _ replicate n x2, P i).
Proof.
iIntros "H".
iInduction n as [|n] "IHn"; [done|].
replace (S n) with (n + 1) by lia.
rewrite !replicate_add /=. iDestruct "H" as "[H1 H2]".
iSplitL "H1"; [by iApply "IHn"|]=> /=.
by rewrite !replicate_length.
Qed.
Lemma array_to_matrix l m n v :
l ↦∗ replicate (m * n) v -∗
[ list] i _ replicate m (),
[ list] j _ replicate n (),
(l + pos n i j) v.
Proof.
iIntros "Hl".
iDestruct (array_to_matrix_pre with "Hl") as "Hl".
iApply (big_sepL_impl with "Hl").
iIntros "!>" (i ? _) "Hl".
iApply big_sepL_replicate_type.
iApply (big_sepL_impl with "Hl").
iIntros "!>" (j ? HSome) "Hl".
rewrite Loc.add_assoc.
replace (Z.of_nat i * Z.of_nat n + Z.of_nat j)%Z with
(Z.of_nat (i * n + j))%Z by lia.
by apply lookup_replicate in HSome as [-> _].
Qed.
Lemma new_matrix_spec E m n v P :
0 < m 0 < n
{{{ [ list] i _ replicate m (), [ list] j _ replicate n (),
l, l v ={E}=∗ P i j l }}}
new_matrix #m #n v @ E
{{{ mat, RET mat; is_matrix mat m n P }}}.
Proof.
iIntros (Hm Hn Φ) "HP HΦ".
wp_lam. wp_pures.
wp_smart_apply wp_allocN; [lia|done|].
iIntros (l) "[Hl _]".
wp_pures. iApply "HΦ".
iExists _. iSplitR; [done|].
replace (Z.to_nat (Z.of_nat m * Z.of_nat n)) with (m * n) by lia.
iDestruct (array_to_matrix with "Hl") as "Hl".
iCombine "HP Hl" as "HPl".
rewrite -big_sepL_sep.
iApply big_sepL_fupd.
iApply (big_sepL_impl with "HPl").
iIntros "!>" (k x Hin) "H".
rewrite -big_sepL_sep.
iApply big_sepL_fupd.
iApply (big_sepL_impl with "H").
iIntros "!>" (k' x' Hin') "[HP Hl]".
by iApply "HP".
Qed.
Lemma matrix_sep m n l (P : _ _ _ iProp Σ) i j :
i < m j < n
([ list] i _ replicate m (),
[ list] j _ replicate n (),
P i j (l + pos n i j)) -∗
(P i j (l + pos n i j)
(P i j (l + pos n i j) -∗
([ list] i _ replicate m (),
[ list] j _ replicate n (),
P i j (l + pos n i j)))).
Proof.
iIntros (Hm Hn) "Hm".
iDestruct (big_sepL_impl with "Hm []") as "Hm".
{ iIntros "!>" (k x HIn).
iApply (big_sepL_lookup_acc _ _ j ()).
by apply lookup_replicate. }
simpl.
rewrite {1}(big_sepL_lookup_acc _ (replicate m ()) i ());
[|by apply lookup_replicate].
iDestruct "Hm" as "[[Hij Hi] Hm]".
iFrame.
iIntros "HP".
iDestruct ("Hm" with "[$Hi $HP]") as "Hm".
iApply (big_sepL_impl with "Hm").
iIntros "!>" (k x Hin).
iIntros "[Hm Hm']". iApply "Hm'". done.
Qed.
Lemma vpos_spec (n i j : nat) :
{{{ True }}} vpos #n #i #j {{{ RET #(pos n i j); True }}}.
Proof.
iIntros (Φ) "_ HΦ". wp_lam. wp_pures. rewrite /pos.
replace (Z.of_nat i * Z.of_nat n + Z.of_nat j)%Z with
(Z.of_nat (i * n + j)) by lia.
by iApply "HΦ".
Qed.
Lemma matrix_get_spec m n i j v P :
i < m j < n
{{{ is_matrix v m n P }}}
matrix_get v #i #j
{{{ l, RET #l; P i j l (P i j l -∗ is_matrix v m n P) }}}.
Proof.
iIntros (Hm Hn Φ) "Hm HΦ".
wp_lam.
iDestruct "Hm" as (l ->) "Hm".
wp_pures.
wp_smart_apply vpos_spec; [done|].
iIntros "_".
wp_pures.
iApply "HΦ".
iModIntro.
iDestruct (matrix_sep _ _ _ _ i j with "Hm") as "[$ Hm]"; [lia|lia|].
iIntros "H".
iDestruct ("Hm" with "H") as "Hm".
iExists _. iSplit; [done|]. iFrame.
Qed.
End with_Σ.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment