Commit 50c9571e authored by Ralf Jung's avatar Ralf Jung
Browse files

prove big_orL_pure, big_andL_pure

parent 1450b2e5
......@@ -857,6 +857,9 @@ Section and_list.
([ list] ky l1 ++ l2, Φ k y)
([ list] ky l1, Φ k y) ([ list] ky l2, Φ (length l1 + k) y).
Proof. by rewrite big_opL_app. Qed.
Lemma big_andL_snoc Φ l x :
([ list] ky l ++ [x], Φ k y) ([ list] ky l, Φ k y) Φ (length l) x.
Proof. by rewrite big_opL_snoc. Qed.
Lemma big_andL_submseteq (Φ : A PROP) l1 l2 :
l1 + l2 ([ list] y l2, Φ y) [ list] y l1, Φ y.
......@@ -916,6 +919,36 @@ Section and_list.
([ list] kx l, Φ k x) ([ list] kx l, Ψ k x).
Proof. by rewrite big_opL_op. Qed.
Lemma big_andL_pure_1 (φ : nat A Prop) l :
([ list] kx l, ⌜φ k x) @{PROP} k x, l !! k = Some x φ k x.
Proof.
induction l as [|x l IH] using rev_ind.
{ apply pure_intro=>??. rewrite lookup_nil. done. }
rewrite big_andL_snoc // IH -pure_and.
f_equiv=>-[Hl Hx] k y /lookup_app_Some =>-[Hy|[Hlen Hy]].
- by apply Hl.
- replace k with (length l) in Hy |- *; last first.
{ apply lookup_lt_Some in Hy. simpl in Hy. lia. }
rewrite Nat.sub_diag /= in Hy. injection Hy as [= ->]. done.
Qed.
Lemma big_andL_pure_2 (φ : nat A Prop) l :
k x, l !! k = Some x φ k x @{PROP} ([ list] kx l, ⌜φ k x).
Proof.
induction l as [|x l IH] using rev_ind.
{ rewrite big_andL_nil. apply True_intro. }
rewrite big_andL_snoc // -IH -pure_and.
f_equiv=>- Hlx. split.
- intros k y Hy. apply Hlx. rewrite lookup_app Hy //.
- apply Hlx. rewrite lookup_app lookup_ge_None_2 //.
rewrite Nat.sub_diag //.
Qed.
Lemma big_andL_pure (φ : nat A Prop) l :
([ list] kx l, ⌜φ k x) @{PROP} k x, l !! k = Some x φ k x.
Proof.
apply (anti_symm ()); first by apply big_andL_pure_1.
apply big_andL_pure_2.
Qed.
Lemma big_andL_persistently Φ l :
<pers> ([ list] kx l, Φ k x) [ list] kx l, <pers> (Φ k x).
Proof. apply (big_opL_commute _). Qed.
......@@ -956,6 +989,9 @@ Section or_list.
([ list] ky l1 ++ l2, Φ k y)
([ list] ky l1, Φ k y) ([ list] ky l2, Φ (length l1 + k) y).
Proof. by rewrite big_opL_app. Qed.
Lemma big_orL_snoc Φ l x :
([ list] ky l ++ [x], Φ k y) ([ list] ky l, Φ k y) Φ (length l) x.
Proof. by rewrite big_opL_snoc. Qed.
Lemma big_orL_submseteq (Φ : A PROP) l1 l2 :
l1 + l2 ([ list] y l1, Φ y) [ list] y l2, Φ y.
......@@ -1032,6 +1068,15 @@ Section or_list.
by apply: big_orL_lookup.
Qed.
Lemma big_orL_pure (φ : nat A Prop) l :
([ list] kx l, ⌜φ k x) @{PROP} k x, l !! k = Some x φ k x.
Proof.
rewrite big_orL_exist.
rewrite pure_exist. apply exist_proper=>k.
rewrite pure_exist. apply exist_proper=>x.
rewrite -pure_and. done.
Qed.
Lemma big_orL_sep_l P Φ l :
P ([ list] kx l, Φ k x) ([ list] kx l, P Φ k x).
Proof.
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment