Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
I
Iris
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Gregory Malecha
Iris
Commits
73e38f15
Commit
73e38f15
authored
Dec 27, 2019
by
Michael Sammler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
seal big_opM, big_opS, big_opMS and big_sepM2
parent
62798412
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
103 additions
and
92 deletions
+103
-92
theories/algebra/big_op.v
theories/algebra/big_op.v
+37
-31
theories/algebra/cmra_big_op.v
theories/algebra/cmra_big_op.v
+2
-2
theories/base_logic/lib/boxes.v
theories/base_logic/lib/boxes.v
+1
-1
theories/bi/big_op.v
theories/bi/big_op.v
+53
-48
theories/bi/plainly.v
theories/bi/plainly.v
+10
-10
No files found.
theories/algebra/big_op.v
View file @
73e38f15
...
...
@@ -35,11 +35,13 @@ Notation "'[^' o 'list]' x ∈ l , P" := (big_opL o (λ _ x, P) l)
(
at
level
200
,
o
at
level
1
,
l
at
level
10
,
x
at
level
1
,
right
associativity
,
format
"[^ o list] x ∈ l , P"
)
:
stdpp_scope
.
Definition
big_opM
`
{
Monoid
M
o
}
`
{
Countable
K
}
{
A
}
(
f
:
K
→
A
→
M
)
(
m
:
gmap
K
A
)
:
M
:
=
big_opL
o
(
λ
_
,
curry
f
)
(
map_to_list
m
).
Definition
big_opM_def
`
{
Monoid
M
o
}
`
{
Countable
K
}
{
A
}
(
f
:
K
→
A
→
M
)
(
m
:
gmap
K
A
)
:
M
:
=
big_opL
o
(
λ
_
,
curry
f
)
(
map_to_list
m
).
Definition
big_opM_aux
:
seal
(@
big_opM_def
).
by
eexists
.
Qed
.
Definition
big_opM
:
=
big_opM_aux
.(
unseal
).
Arguments
big_opM
{
M
}
o
{
_
K
_
_
A
}
_
_
.
Definition
big_opM_eq
:
@
big_opM
=
@
big_opM_def
:
=
big_opM_aux
.(
seal_eq
).
Instance
:
Params
(@
big_opM
)
7
:
=
{}.
Arguments
big_opM
{
M
}
o
{
_
K
_
_
A
}
_
_
:
simpl
never
.
Typeclasses
Opaque
big_opM
.
Notation
"'[^' o 'map]' k ↦ x ∈ m , P"
:
=
(
big_opM
o
(
λ
k
x
,
P
)
m
)
(
at
level
200
,
o
at
level
1
,
m
at
level
10
,
k
,
x
at
level
1
,
right
associativity
,
format
"[^ o map] k ↦ x ∈ m , P"
)
:
stdpp_scope
.
...
...
@@ -47,20 +49,24 @@ Notation "'[^' o 'map]' x ∈ m , P" := (big_opM o (λ _ x, P) m)
(
at
level
200
,
o
at
level
1
,
m
at
level
10
,
x
at
level
1
,
right
associativity
,
format
"[^ o map] x ∈ m , P"
)
:
stdpp_scope
.
Definition
big_opS
`
{
Monoid
M
o
}
`
{
Countable
A
}
(
f
:
A
→
M
)
Definition
big_opS
_def
`
{
Monoid
M
o
}
`
{
Countable
A
}
(
f
:
A
→
M
)
(
X
:
gset
A
)
:
M
:
=
big_opL
o
(
λ
_
,
f
)
(
elements
X
).
Definition
big_opS_aux
:
seal
(@
big_opS_def
).
by
eexists
.
Qed
.
Definition
big_opS
:
=
big_opS_aux
.(
unseal
).
Arguments
big_opS
{
M
}
o
{
_
A
_
_
}
_
_
.
Definition
big_opS_eq
:
@
big_opS
=
@
big_opS_def
:
=
big_opS_aux
.(
seal_eq
).
Instance
:
Params
(@
big_opS
)
6
:
=
{}.
Arguments
big_opS
{
M
}
o
{
_
A
_
_
}
_
_
:
simpl
never
.
Typeclasses
Opaque
big_opS
.
Notation
"'[^' o 'set]' x ∈ X , P"
:
=
(
big_opS
o
(
λ
x
,
P
)
X
)
(
at
level
200
,
o
at
level
1
,
X
at
level
10
,
x
at
level
1
,
right
associativity
,
format
"[^ o set] x ∈ X , P"
)
:
stdpp_scope
.
Definition
big_opMS
`
{
Monoid
M
o
}
`
{
Countable
A
}
(
f
:
A
→
M
)
Definition
big_opMS
_def
`
{
Monoid
M
o
}
`
{
Countable
A
}
(
f
:
A
→
M
)
(
X
:
gmultiset
A
)
:
M
:
=
big_opL
o
(
λ
_
,
f
)
(
elements
X
).
Instance
:
Params
(@
big_opMS
)
7
:
=
{}.
Arguments
big_opMS
{
M
}
o
{
_
A
_
_
}
_
_
:
simpl
never
.
Typeclasses
Opaque
big_opMS
.
Definition
big_opMS_aux
:
seal
(@
big_opMS_def
).
by
eexists
.
Qed
.
Definition
big_opMS
:
=
big_opMS_aux
.(
unseal
).
Arguments
big_opMS
{
M
}
o
{
_
A
_
_
}
_
_
.
Definition
big_opMS_eq
:
@
big_opMS
=
@
big_opMS_def
:
=
big_opMS_aux
.(
seal_eq
).
Instance
:
Params
(@
big_opMS
)
6
:
=
{}.
Notation
"'[^' o 'mset]' x ∈ X , P"
:
=
(
big_opMS
o
(
λ
x
,
P
)
X
)
(
at
level
200
,
o
at
level
1
,
X
at
level
10
,
x
at
level
1
,
right
associativity
,
format
"[^ o mset] x ∈ X , P"
)
:
stdpp_scope
.
...
...
@@ -171,7 +177,7 @@ Section gmap.
(
∀
k
x
,
m
!!
k
=
Some
x
→
R
(
f
k
x
)
(
g
k
x
))
→
R
([^
o
map
]
k
↦
x
∈
m
,
f
k
x
)
([^
o
map
]
k
↦
x
∈
m
,
g
k
x
).
Proof
.
intros
??
Hf
.
apply
(
big_opL_forall
R
)
;
auto
.
intros
??
Hf
.
rewrite
big_opM_eq
.
apply
(
big_opL_forall
R
)
;
auto
.
intros
k
[
i
x
]
?%
elem_of_list_lookup_2
.
by
apply
Hf
,
elem_of_map_to_list
.
Qed
.
...
...
@@ -194,12 +200,12 @@ Section gmap.
Proof
.
intros
f
g
Hf
m
?
<-.
apply
big_opM_forall
;
apply
_
||
intros
;
apply
Hf
.
Qed
.
Lemma
big_opM_empty
f
:
([^
o
map
]
k
↦
x
∈
∅
,
f
k
x
)
=
monoid_unit
.
Proof
.
by
rewrite
/
big_opM
map_to_list_empty
.
Qed
.
Proof
.
by
rewrite
big_opM_eq
/
big_opM_def
map_to_list_empty
.
Qed
.
Lemma
big_opM_insert
f
m
i
x
:
m
!!
i
=
None
→
([^
o
map
]
k
↦
y
∈
<[
i
:
=
x
]>
m
,
f
k
y
)
≡
f
i
x
`
o
`
[^
o
map
]
k
↦
y
∈
m
,
f
k
y
.
Proof
.
intros
?.
by
rewrite
/
big_opM
map_to_list_insert
.
Qed
.
Proof
.
intros
?.
by
rewrite
big_opM_eq
/
big_opM_def
map_to_list_insert
.
Qed
.
Lemma
big_opM_delete
f
m
i
x
:
m
!!
i
=
Some
x
→
...
...
@@ -216,12 +222,12 @@ Section gmap.
Qed
.
Lemma
big_opM_unit
m
:
([^
o
map
]
k
↦
y
∈
m
,
monoid_unit
)
≡
(
monoid_unit
:
M
).
Proof
.
induction
m
using
map_ind
;
rewrite
/=
?big_opM_insert
?left_id
//
.
Qed
.
Proof
.
by
induction
m
using
map_ind
;
rewrite
/=
?big_opM_insert
?left_id
//
big_opM_eq
.
Qed
.
Lemma
big_opM_fmap
{
B
}
(
h
:
A
→
B
)
(
f
:
K
→
B
→
M
)
m
:
([^
o
map
]
k
↦
y
∈
h
<$>
m
,
f
k
y
)
≡
([^
o
map
]
k
↦
y
∈
m
,
f
k
(
h
y
)).
Proof
.
rewrite
/
big_opM
map_to_list_fmap
big_opL_fmap
.
rewrite
big_opM_eq
/
big_opM_def
map_to_list_fmap
big_opL_fmap
.
by
apply
big_opL_proper
=>
?
[??].
Qed
.
...
...
@@ -262,7 +268,7 @@ Section gmap.
Lemma
big_opM_op
f
g
m
:
([^
o
map
]
k
↦
x
∈
m
,
f
k
x
`
o
`
g
k
x
)
≡
([^
o
map
]
k
↦
x
∈
m
,
f
k
x
)
`
o
`
([^
o
map
]
k
↦
x
∈
m
,
g
k
x
).
Proof
.
rewrite
/
big_opM
-
big_opL_op
.
by
apply
big_opL_proper
=>
?
[??].
Qed
.
Proof
.
rewrite
big_opM_eq
/
big_opM_def
-
big_opL_op
.
by
apply
big_opL_proper
=>
?
[??].
Qed
.
End
gmap
.
...
...
@@ -277,7 +283,7 @@ Section gset.
(
∀
x
,
x
∈
X
→
R
(
f
x
)
(
g
x
))
→
R
([^
o
set
]
x
∈
X
,
f
x
)
([^
o
set
]
x
∈
X
,
g
x
).
Proof
.
intros
??
Hf
.
apply
(
big_opL_forall
R
)
;
auto
.
rewrite
big_opS_eq
.
intros
??
Hf
.
apply
(
big_opL_forall
R
)
;
auto
.
intros
k
x
?%
elem_of_list_lookup_2
.
by
apply
Hf
,
elem_of_elements
.
Qed
.
...
...
@@ -298,11 +304,11 @@ Section gset.
Proof
.
intros
f
g
Hf
m
?
<-.
apply
big_opS_forall
;
apply
_
||
intros
;
apply
Hf
.
Qed
.
Lemma
big_opS_empty
f
:
([^
o
set
]
x
∈
∅
,
f
x
)
=
monoid_unit
.
Proof
.
by
rewrite
/
big_opS
elements_empty
.
Qed
.
Proof
.
by
rewrite
big_opS_eq
/
big_opS_def
elements_empty
.
Qed
.
Lemma
big_opS_insert
f
X
x
:
x
∉
X
→
([^
o
set
]
y
∈
{[
x
]}
∪
X
,
f
y
)
≡
(
f
x
`
o
`
[^
o
set
]
y
∈
X
,
f
y
).
Proof
.
intros
.
by
rewrite
/
big_opS
elements_union_singleton
.
Qed
.
Proof
.
intros
.
by
rewrite
big_opS_eq
/
big_opS_def
elements_union_singleton
.
Qed
.
Lemma
big_opS_fn_insert
{
B
}
(
f
:
A
→
B
→
M
)
h
X
x
b
:
x
∉
X
→
([^
o
set
]
y
∈
{[
x
]}
∪
X
,
f
y
(<[
x
:
=
b
]>
h
y
))
...
...
@@ -334,22 +340,22 @@ Section gset.
Qed
.
Lemma
big_opS_singleton
f
x
:
([^
o
set
]
y
∈
{[
x
]},
f
y
)
≡
f
x
.
Proof
.
intros
.
by
rewrite
/
big_opS
elements_singleton
/=
right_id
.
Qed
.
Proof
.
intros
.
by
rewrite
big_opS_eq
/
big_opS_def
elements_singleton
/=
right_id
.
Qed
.
Lemma
big_opS_unit
X
:
([^
o
set
]
y
∈
X
,
monoid_unit
)
≡
(
monoid_unit
:
M
).
Proof
.
induction
X
using
set_ind_L
;
rewrite
/=
?big_opS_insert
?left_id
//
.
by
induction
X
using
set_ind_L
;
rewrite
/=
?big_opS_insert
?left_id
//
big_opS_eq
.
Qed
.
Lemma
big_opS_op
f
g
X
:
([^
o
set
]
y
∈
X
,
f
y
`
o
`
g
y
)
≡
([^
o
set
]
y
∈
X
,
f
y
)
`
o
`
([^
o
set
]
y
∈
X
,
g
y
).
Proof
.
by
rewrite
/
big_opS
-
big_opL_op
.
Qed
.
Proof
.
by
rewrite
big_opS_eq
/
big_opS_def
-
big_opL_op
.
Qed
.
End
gset
.
Lemma
big_opM_dom
`
{
Countable
K
}
{
A
}
(
f
:
K
→
M
)
(
m
:
gmap
K
A
)
:
([^
o
map
]
k
↦
_
∈
m
,
f
k
)
≡
([^
o
set
]
k
∈
dom
_
m
,
f
k
).
Proof
.
induction
m
as
[|
i
x
??
IH
]
using
map_ind
;
[
by
rewrite
dom_empty_L
|].
induction
m
as
[|
i
x
??
IH
]
using
map_ind
;
[
by
rewrite
big_opM_eq
big_opS_eq
dom_empty_L
|].
by
rewrite
dom_insert_L
big_opM_insert
//
IH
big_opS_insert
?not_elem_of_dom
.
Qed
.
...
...
@@ -364,7 +370,7 @@ Section gmultiset.
(
∀
x
,
x
∈
X
→
R
(
f
x
)
(
g
x
))
→
R
([^
o
mset
]
x
∈
X
,
f
x
)
([^
o
mset
]
x
∈
X
,
g
x
).
Proof
.
intros
??
Hf
.
apply
(
big_opL_forall
R
)
;
auto
.
rewrite
big_opMS_eq
.
intros
??
Hf
.
apply
(
big_opL_forall
R
)
;
auto
.
intros
k
x
?%
elem_of_list_lookup_2
.
by
apply
Hf
,
gmultiset_elem_of_elements
.
Qed
.
...
...
@@ -385,15 +391,15 @@ Section gmultiset.
Proof
.
intros
f
g
Hf
m
?
<-.
apply
big_opMS_forall
;
apply
_
||
intros
;
apply
Hf
.
Qed
.
Lemma
big_opMS_empty
f
:
([^
o
mset
]
x
∈
∅
,
f
x
)
=
monoid_unit
.
Proof
.
by
rewrite
/
big_opMS
gmultiset_elements_empty
.
Qed
.
Proof
.
by
rewrite
big_opMS_eq
/
big_opMS_def
gmultiset_elements_empty
.
Qed
.
Lemma
big_opMS_disj_union
f
X
Y
:
([^
o
mset
]
y
∈
X
⊎
Y
,
f
y
)
≡
([^
o
mset
]
y
∈
X
,
f
y
)
`
o
`
[^
o
mset
]
y
∈
Y
,
f
y
.
Proof
.
by
rewrite
/
big_opMS
gmultiset_elements_disj_union
big_opL_app
.
Qed
.
Proof
.
by
rewrite
big_opMS_eq
/
big_opMS_def
gmultiset_elements_disj_union
big_opL_app
.
Qed
.
Lemma
big_opMS_singleton
f
x
:
([^
o
mset
]
y
∈
{[
x
]},
f
y
)
≡
f
x
.
Proof
.
intros
.
by
rewrite
/
big_opMS
gmultiset_elements_singleton
/=
right_id
.
intros
.
by
rewrite
big_opMS_eq
/
big_opMS_def
gmultiset_elements_singleton
/=
right_id
.
Qed
.
Lemma
big_opMS_delete
f
X
x
:
...
...
@@ -405,13 +411,13 @@ Section gmultiset.
Lemma
big_opMS_unit
X
:
([^
o
mset
]
y
∈
X
,
monoid_unit
)
≡
(
monoid_unit
:
M
).
Proof
.
induction
X
using
gmultiset_ind
;
rewrite
/=
?big_opMS_disj_union
?big_opMS_singleton
?left_id
//.
by
induction
X
using
gmultiset_ind
;
rewrite
/=
?big_opMS_disj_union
?big_opMS_singleton
?left_id
//
big_opMS_eq
.
Qed
.
Lemma
big_opMS_op
f
g
X
:
([^
o
mset
]
y
∈
X
,
f
y
`
o
`
g
y
)
≡
([^
o
mset
]
y
∈
X
,
f
y
)
`
o
`
([^
o
mset
]
y
∈
X
,
g
y
).
Proof
.
by
rewrite
/
big_opMS
-
big_opL_op
.
Qed
.
Proof
.
by
rewrite
big_opMS_eq
/
big_opMS_def
-
big_opL_op
.
Qed
.
End
gmultiset
.
End
big_op
.
...
...
theories/algebra/cmra_big_op.v
View file @
73e38f15
...
...
@@ -13,7 +13,7 @@ Qed.
Lemma
big_opM_None
{
M
:
cmraT
}
`
{
Countable
K
}
{
A
}
(
f
:
K
→
A
→
option
M
)
m
:
([^
op
map
]
k
↦
x
∈
m
,
f
k
x
)
=
None
↔
∀
k
x
,
m
!!
k
=
Some
x
→
f
k
x
=
None
.
Proof
.
induction
m
as
[|
i
x
m
?
IH
]
using
map_ind
=>
/
/=
.
induction
m
as
[|
i
x
m
?
IH
]
using
map_ind
=>
/
=
;
first
by
rewrite
big_opM_eq
.
rewrite
-
equiv_None
big_opM_insert
//
equiv_None
op_None
IH
.
split
.
{
intros
[??]
k
y
.
rewrite
lookup_insert_Some
;
naive_solver
.
}
intros
Hm
;
split
.
...
...
@@ -23,7 +23,7 @@ Qed.
Lemma
big_opS_None
{
M
:
cmraT
}
`
{
Countable
A
}
(
f
:
A
→
option
M
)
X
:
([^
op
set
]
x
∈
X
,
f
x
)
=
None
↔
∀
x
,
x
∈
X
→
f
x
=
None
.
Proof
.
induction
X
as
[|
x
X
?
IH
]
using
set_ind_L
;
[
done
|].
induction
X
as
[|
x
X
?
IH
]
using
set_ind_L
;
[
by
rewrite
big_opS_eq
|].
rewrite
-
equiv_None
big_opS_insert
//
equiv_None
op_None
IH
.
set_solver
.
Qed
.
Lemma
big_opMS_None
{
M
:
cmraT
}
`
{
Countable
A
}
(
f
:
A
→
option
M
)
X
:
...
...
theories/base_logic/lib/boxes.v
View file @
73e38f15
...
...
@@ -100,7 +100,7 @@ Qed.
Lemma
box_alloc
:
box
N
∅
True
%
I
.
Proof
.
iIntros
.
iExists
(
λ
_
,
True
)%
I
.
iSplit
;
by
auto
.
iIntros
.
iExists
(
λ
_
,
True
)%
I
.
by
rewrite
!
big_opM_empty
.
Qed
.
Lemma
slice_insert_empty
E
q
f
Q
P
:
...
...
theories/bi/big_op.v
View file @
73e38f15
...
...
@@ -50,12 +50,15 @@ Notation "'[∗' 'list]' k ↦ x1 ; x2 ∈ l1 ; l2 , P" :=
Notation
"'[∗' 'list]' x1 ; x2 ∈ l1 ; l2 , P"
:
=
(
big_sepL2
(
λ
_
x1
x2
,
P
)
l1
l2
)
:
bi_scope
.
Definition
big_sepM2
{
PROP
:
bi
}
`
{
Countable
K
}
{
A
B
}
Definition
big_sepM2
_def
{
PROP
:
bi
}
`
{
Countable
K
}
{
A
B
}
(
Φ
:
K
→
A
→
B
→
PROP
)
(
m1
:
gmap
K
A
)
(
m2
:
gmap
K
B
)
:
PROP
:
=
(
⌜
∀
k
,
is_Some
(
m1
!!
k
)
↔
is_Some
(
m2
!!
k
)
⌝
∧
[
∗
map
]
k
↦
xy
∈
map_zip
m1
m2
,
Φ
k
xy
.
1
xy
.
2
)%
I
.
Definition
big_sepM2_aux
:
seal
(@
big_sepM2_def
).
by
eexists
.
Qed
.
Definition
big_sepM2
:
=
big_sepM2_aux
.(
unseal
).
Arguments
big_sepM2
{
PROP
K
_
_
A
B
}
_
_
_
.
Definition
big_sepM2_eq
:
@
big_sepM2
=
@
big_sepM2_def
:
=
big_sepM2_aux
.(
seal_eq
).
Instance
:
Params
(@
big_sepM2
)
6
:
=
{}.
Typeclasses
Opaque
big_sepM2
.
Notation
"'[∗' 'map]' k ↦ x1 ; x2 ∈ m1 ; m2 , P"
:
=
(
big_sepM2
(
λ
k
x1
x2
,
P
)
m1
m2
)
:
bi_scope
.
Notation
"'[∗' 'map]' x1 ; x2 ∈ m1 ; m2 , P"
:
=
...
...
@@ -687,7 +690,7 @@ Section map.
Proof
.
apply
big_opM_proper
.
Qed
.
Lemma
big_sepM_subseteq
`
{
BiAffine
PROP
}
Φ
m1
m2
:
m2
⊆
m1
→
([
∗
map
]
k
↦
x
∈
m1
,
Φ
k
x
)
⊢
[
∗
map
]
k
↦
x
∈
m2
,
Φ
k
x
.
Proof
.
intros
.
by
apply
big_sepL_submseteq
,
map_to_list_submseteq
.
Qed
.
Proof
.
rewrite
big_opM_eq
.
intros
.
by
apply
big_sepL_submseteq
,
map_to_list_submseteq
.
Qed
.
Global
Instance
big_sepM_mono'
:
Proper
(
pointwise_relation
_
(
pointwise_relation
_
(
⊢
))
==>
(=)
==>
(
⊢
))
...
...
@@ -834,7 +837,7 @@ Section map.
[
∗
map
]
k
↦
x
∈
m
,
Ψ
k
x
.
Proof
.
apply
wand_intro_l
.
induction
m
as
[|
i
x
m
?
IH
]
using
map_ind
.
{
by
rewrite
sep_elim_r
.
}
{
by
rewrite
big_opM_eq
sep_elim_r
.
}
rewrite
!
big_sepM_insert
//
intuitionistically_sep_dup
.
rewrite
-
assoc
[(
□
_
∗
_
)%
I
]
comm
-!
assoc
assoc
.
apply
sep_mono
.
-
rewrite
(
forall_elim
i
)
(
forall_elim
x
)
pure_True
?lookup_insert
//.
...
...
@@ -848,17 +851,17 @@ Section map.
Global
Instance
big_sepM_empty_persistent
Φ
:
Persistent
([
∗
map
]
k
↦
x
∈
∅
,
Φ
k
x
).
Proof
.
rewrite
/
big_opM
map_to_list_empty
.
apply
_
.
Qed
.
Proof
.
rewrite
big_opM_eq
/
big_opM_def
map_to_list_empty
.
apply
_
.
Qed
.
Global
Instance
big_sepM_persistent
Φ
m
:
(
∀
k
x
,
Persistent
(
Φ
k
x
))
→
Persistent
([
∗
map
]
k
↦
x
∈
m
,
Φ
k
x
).
Proof
.
intros
.
apply
big_sepL_persistent
=>
_
[??]
;
apply
_
.
Qed
.
Proof
.
rewrite
big_opM_eq
.
intros
.
apply
big_sepL_persistent
=>
_
[??]
;
apply
_
.
Qed
.
Global
Instance
big_sepM_empty_affine
Φ
:
Affine
([
∗
map
]
k
↦
x
∈
∅
,
Φ
k
x
).
Proof
.
rewrite
/
big_opM
map_to_list_empty
.
apply
_
.
Qed
.
Proof
.
rewrite
big_opM_eq
/
big_opM_def
map_to_list_empty
.
apply
_
.
Qed
.
Global
Instance
big_sepM_affine
Φ
m
:
(
∀
k
x
,
Affine
(
Φ
k
x
))
→
Affine
([
∗
map
]
k
↦
x
∈
m
,
Φ
k
x
).
Proof
.
intros
.
apply
big_sepL_affine
=>
_
[??]
;
apply
_
.
Qed
.
Proof
.
rewrite
big_opM_eq
.
intros
.
apply
big_sepL_affine
=>
_
[??]
;
apply
_
.
Qed
.
End
map
.
(** ** Big ops over two maps *)
...
...
@@ -869,7 +872,7 @@ Section map2.
Lemma
big_sepM2_dom
Φ
m1
m2
:
([
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Φ
k
y1
y2
)
-
∗
⌜
dom
(
gset
K
)
m1
=
dom
(
gset
K
)
m2
⌝
.
Proof
.
rewrite
/
big_sepM2
and_elim_l
.
apply
pure_mono
=>
Hm
.
rewrite
big_sepM2_eq
/
big_sepM2_def
and_elim_l
.
apply
pure_mono
=>
Hm
.
set_unfold
=>
k
.
by
rewrite
!
elem_of_dom
.
Qed
.
...
...
@@ -877,7 +880,8 @@ Section map2.
(
∀
k
y1
y2
,
m1
!!
k
=
Some
y1
→
m2
!!
k
=
Some
y2
→
Φ
k
y1
y2
⊢
Ψ
k
y1
y2
)
→
([
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Φ
k
y1
y2
)
⊢
[
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Ψ
k
y1
y2
.
Proof
.
intros
Hm1m2
.
rewrite
/
big_sepM2
.
apply
and_mono_r
,
big_sepM_mono
.
intros
Hm1m2
.
rewrite
big_sepM2_eq
/
big_sepM2_def
.
apply
and_mono_r
,
big_sepM_mono
.
intros
k
[
x1
x2
].
rewrite
map_lookup_zip_with
.
specialize
(
Hm1m2
k
x1
x2
).
destruct
(
m1
!!
k
)
as
[
y1
|]
;
last
done
.
...
...
@@ -897,8 +901,8 @@ Section map2.
==>
(=)
==>
(=)
==>
(
dist
n
))
(
big_sepM2
(
PROP
:
=
PROP
)
(
K
:
=
K
)
(
A
:
=
A
)
(
B
:
=
B
)).
Proof
.
intros
Φ
1
Φ
2
H
Φ
x1
?
<-
x2
?
<-.
rewrite
/
big_sepM2
.
f_equiv
.
f_equiv
=>
k
[
y1
y2
].
apply
H
Φ
.
intros
Φ
1
Φ
2
H
Φ
x1
?
<-
x2
?
<-.
rewrite
big_sepM2_eq
/
big_sepM2_def
.
f_equiv
.
f_equiv
=>
k
[
y1
y2
].
apply
H
Φ
.
Qed
.
Global
Instance
big_sepM2_mono'
:
Proper
(
pointwise_relation
_
(
pointwise_relation
_
(
pointwise_relation
_
(
⊢
)))
...
...
@@ -913,7 +917,7 @@ Section map2.
Lemma
big_sepM2_empty
Φ
:
([
∗
map
]
k
↦
y1
;
y2
∈
∅
;
∅
,
Φ
k
y1
y2
)
⊣
⊢
emp
.
Proof
.
rewrite
/
big_sepM2
pure_True
?left_id
//.
rewrite
big_sepM2_eq
/
big_sepM2_def
big_opM_eq
pure_True
?left_id
//.
intros
k
.
rewrite
!
lookup_empty
;
split
;
by
inversion
1
.
Qed
.
Lemma
big_sepM2_empty'
`
{
BiAffine
PROP
}
P
Φ
:
P
⊢
[
∗
map
]
k
↦
y1
;
y2
∈
∅
;
∅
,
Φ
k
y1
y2
.
...
...
@@ -938,7 +942,7 @@ Section map2.
([
∗
map
]
k
↦
y1
;
y2
∈
<[
i
:
=
x1
]>
m1
;
<[
i
:
=
x2
]>
m2
,
Φ
k
y1
y2
)
⊣
⊢
Φ
i
x1
x2
∗
[
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Φ
k
y1
y2
.
Proof
.
intros
Hm1
Hm2
.
rewrite
/
big_sepM2
-
map_insert_zip_with
.
intros
Hm1
Hm2
.
rewrite
big_sepM2_eq
/
big_sepM2_def
-
map_insert_zip_with
.
rewrite
big_sepM_insert
;
last
by
rewrite
map_lookup_zip_with
Hm1
.
rewrite
!
persistent_and_affinely_sep_l
/=.
...
...
@@ -959,7 +963,7 @@ Section map2.
([
∗
map
]
k
↦
x
;
y
∈
m1
;
m2
,
Φ
k
x
y
)
⊣
⊢
Φ
i
x1
x2
∗
[
∗
map
]
k
↦
x
;
y
∈
delete
i
m1
;
delete
i
m2
,
Φ
k
x
y
.
Proof
.
rewrite
/
big_sepM2
=>
Hx1
Hx2
.
rewrite
big_sepM2_eq
/
big_sepM2_def
=>
Hx1
Hx2
.
rewrite
!
persistent_and_affinely_sep_l
/=.
rewrite
sep_assoc
(
sep_comm
(
Φ
_
_
_
))
-
sep_assoc
.
apply
sep_proper
.
...
...
@@ -993,7 +997,7 @@ Section map2.
([
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Φ
k
y1
y2
)
-
∗
([
∗
map
]
k
↦
y1
;
y2
∈
<[
i
:
=
x1
]>
m1
;
<[
i
:
=
x2
]>
m2
,
Φ
k
y1
y2
).
Proof
.
intros
Ha
.
rewrite
/
big_sepM2
.
intros
Ha
.
rewrite
big_sepM2_eq
/
big_sepM2_def
.
assert
(
TCOr
(
∀
x
,
Affine
(
Φ
i
x
.
1
x
.
2
))
(
Absorbing
(
Φ
i
x1
x2
))).
{
destruct
Ha
;
try
apply
_
.
}
apply
wand_intro_r
.
...
...
@@ -1027,7 +1031,7 @@ Section map2.
([
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Φ
k
y1
y2
)
⊢
∃
x2
,
⌜
m2
!!
i
=
Some
x2
⌝
∧
Φ
i
x1
x2
.
Proof
.
intros
Hm1
.
rewrite
/
big_sepM2
.
intros
Hm1
.
rewrite
big_sepM2_eq
/
big_sepM2_def
.
rewrite
persistent_and_sep_1
.
apply
wand_elim_l'
.
apply
pure_elim'
=>
Hm
.
assert
(
is_Some
(
m2
!!
i
))
as
[
x2
Hm2
].
...
...
@@ -1044,7 +1048,7 @@ Section map2.
([
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Φ
k
y1
y2
)
⊢
∃
x1
,
⌜
m1
!!
i
=
Some
x1
⌝
∧
Φ
i
x1
x2
.
Proof
.
intros
Hm2
.
rewrite
/
big_sepM2
.
intros
Hm2
.
rewrite
big_sepM2_eq
/
big_sepM2_def
.
rewrite
persistent_and_sep_1
.
apply
wand_elim_l'
.
apply
pure_elim'
=>
Hm
.
assert
(
is_Some
(
m1
!!
i
))
as
[
x1
Hm1
].
...
...
@@ -1059,7 +1063,8 @@ Section map2.
Lemma
big_sepM2_singleton
Φ
i
x1
x2
:
([
∗
map
]
k
↦
y1
;
y2
∈
{[
i
:
=
x1
]}
;
{[
i
:
=
x2
]},
Φ
k
y1
y2
)
⊣
⊢
Φ
i
x1
x2
.
Proof
.
rewrite
/
big_sepM2
map_zip_with_singleton
big_sepM_singleton
.
rewrite
big_sepM2_eq
/
big_sepM2_def
.
rewrite
map_zip_with_singleton
big_sepM_singleton
.
apply
(
anti_symm
_
).
-
apply
and_elim_r
.
-
rewrite
<-
(
left_id
True
%
I
(
∧
)%
I
(
Φ
i
x1
x2
)).
...
...
@@ -1072,7 +1077,7 @@ Section map2.
([
∗
map
]
k
↦
y1
;
y2
∈
f
<$>
m1
;
g
<$>
m2
,
Φ
k
y1
y2
)
⊣
⊢
([
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Φ
k
(
f
y1
)
(
g
y2
)).
Proof
.
rewrite
/
big_sepM2
.
rewrite
map_fmap_zip
.
rewrite
big_sepM2_eq
/
big_sepM2_def
.
rewrite
map_fmap_zip
.
apply
and_proper
.
-
apply
pure_proper
.
split
.
+
intros
Hm
k
.
specialize
(
Hm
k
).
revert
Hm
.
...
...
@@ -1096,7 +1101,7 @@ Section map2.
([
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Φ
k
y1
y2
∗
Ψ
k
y1
y2
)
⊣
⊢
([
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Φ
k
y1
y2
)
∗
([
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Ψ
k
y1
y2
).
Proof
.
rewrite
/
big_sepM2
.
rewrite
big_sepM2_eq
/
big_sepM2_def
.
rewrite
-{
1
}(
and_idem
⌜
∀
k
:
K
,
is_Some
(
m1
!!
k
)
↔
is_Some
(
m2
!!
k
)
⌝
%
I
).
rewrite
-
and_assoc
.
rewrite
!
persistent_and_affinely_sep_l
/=.
...
...
@@ -1114,7 +1119,7 @@ Section map2.
<
pers
>
([
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Φ
k
y1
y2
)
⊣
⊢
[
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
<
pers
>
(
Φ
k
y1
y2
).
Proof
.
by
rewrite
/
big_sepM2
persistently_and
by
rewrite
big_sepM2_eq
/
big_sepM2_def
persistently_and
persistently_pure
big_sepM_persistently
.
Qed
.
...
...
@@ -1124,7 +1129,7 @@ Section map2.
⌜
∀
k
:
K
,
is_Some
(
m1
!!
k
)
↔
is_Some
(
m2
!!
k
)
⌝
∧
(
∀
k
x1
x2
,
⌜
m1
!!
k
=
Some
x1
⌝
→
⌜
m2
!!
k
=
Some
x2
⌝
→
Φ
k
x1
x2
).
Proof
.
rewrite
/
big_sepM2
=>
?.
apply
and_proper
=>//.
rewrite
big_sepM2_eq
/
big_sepM2_def
=>
?.
apply
and_proper
=>//.
rewrite
big_sepM_forall
.
apply
forall_proper
=>
k
.
apply
(
anti_symm
_
).
-
apply
forall_intro
=>
x1
.
apply
forall_intro
=>
x2
.
...
...
@@ -1145,7 +1150,7 @@ Section map2.
[
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Ψ
k
y1
y2
.
Proof
.
apply
wand_intro_l
.
rewrite
/
big_sepM2
.
rewrite
big_sepM2_eq
/
big_sepM2_def
.
rewrite
!
persistent_and_affinely_sep_l
/=.
rewrite
sep_assoc
.
rewrite
(
sep_comm
(
□
_
)%
I
)
-
sep_assoc
.
apply
sep_mono_r
.
apply
wand_elim_r'
.
...
...
@@ -1164,7 +1169,7 @@ Section map2.
Global
Instance
big_sepM2_persistent
Φ
m1
m2
:
(
∀
k
x1
x2
,
Persistent
(
Φ
k
x1
x2
))
→
Persistent
([
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Φ
k
y1
y2
).
Proof
.
rewrite
/
big_sepM2
.
apply
_
.
Qed
.
Proof
.
rewrite
big_sepM2_eq
/
big_sepM2_def
.
apply
_
.
Qed
.
Global
Instance
big_sepM2_empty_affine
Φ
:
Affine
([
∗
map
]
k
↦
y1
;
y2
∈
∅
;
∅
,
Φ
k
y1
y2
).
...
...
@@ -1172,7 +1177,7 @@ Section map2.
Global
Instance
big_sepM2_affine
Φ
m1
m2
:
(
∀
k
x1
x2
,
Affine
(
Φ
k
x1
x2
))
→
Affine
([
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Φ
k
y1
y2
).
Proof
.
rewrite
/
big_sepM2
.
apply
_
.
Qed
.
Proof
.
rewrite
big_sepM2_eq
/
big_sepM2_def
.
apply
_
.
Qed
.
End
map2
.
(** ** Big ops over finite sets *)
...
...
@@ -1191,7 +1196,7 @@ Section gset.
Proof
.
apply
big_opS_proper
.
Qed
.
Lemma
big_sepS_subseteq
`
{
BiAffine
PROP
}
Φ
X
Y
:
Y
⊆
X
→
([
∗
set
]
x
∈
X
,
Φ
x
)
⊢
[
∗
set
]
x
∈
Y
,
Φ
x
.
Proof
.
intros
.
by
apply
big_sepL_submseteq
,
elements_submseteq
.
Qed
.
Proof
.
rewrite
big_opS_eq
.
intros
.
by
apply
big_sepL_submseteq
,
elements_submseteq
.
Qed
.
Global
Instance
big_sepS_mono'
:
Proper
(
pointwise_relation
_
(
⊢
)
==>
(=)
==>
(
⊢
))
(
big_opS
(@
bi_sep
PROP
)
(
A
:
=
A
)).
...
...
@@ -1309,7 +1314,7 @@ Section gset.
[
∗
set
]
x
∈
X
,
Ψ
x
.
Proof
.
apply
wand_intro_l
.
induction
X
as
[|
x
X
?
IH
]
using
set_ind_L
.
{
by
rewrite
sep_elim_r
.
}
{
by
rewrite
big_opS_eq
sep_elim_r
.
}
rewrite
!
big_sepS_insert
//
intuitionistically_sep_dup
.
rewrite
-
assoc
[(
□
_
∗
_
)%
I
]
comm
-!
assoc
assoc
.
apply
sep_mono
.
-
rewrite
(
forall_elim
x
)
pure_True
;
last
set_solver
.
...
...
@@ -1321,16 +1326,16 @@ Section gset.
Global
Instance
big_sepS_empty_persistent
Φ
:
Persistent
([
∗
set
]
x
∈
∅
,
Φ
x
).
Proof
.
rewrite
/
big_opS
elements_empty
.
apply
_
.
Qed
.
Proof
.
rewrite
big_opS_eq
/
big_opS_def
elements_empty
.
apply
_
.
Qed
.
Global
Instance
big_sepS_persistent
Φ
X
:
(
∀
x
,
Persistent
(
Φ
x
))
→
Persistent
([
∗
set
]
x
∈
X
,
Φ
x
).
Proof
.
rewrite
/
big_opS
.
apply
_
.
Qed
.
Proof
.
rewrite
big_opS_eq
/
big_opS_def
.
apply
_
.
Qed
.
Global
Instance
big_sepS_empty_affine
Φ
:
Affine
([
∗
set
]
x
∈
∅
,
Φ
x
).
Proof
.
rewrite
/
big_opS
elements_empty
.
apply
_
.
Qed
.
Proof
.
rewrite
big_opS_eq
/
big_opS_def
elements_empty
.
apply
_
.
Qed
.
Global
Instance
big_sepS_affine
Φ
X
:
(
∀
x
,
Affine
(
Φ
x
))
→
Affine
([
∗
set
]
x
∈
X
,
Φ
x
).
Proof
.
rewrite
/
big_opS
.
apply
_
.
Qed
.
Proof
.
rewrite
big_opS_eq
/
big_opS_def
.
apply
_
.
Qed
.
End
gset
.
Lemma
big_sepM_dom
`
{
Countable
K
}
{
A
}
(
Φ
:
K
→
PROP
)
(
m
:
gmap
K
A
)
:
...
...
@@ -1353,7 +1358,7 @@ Section gmultiset.
Proof
.
apply
big_opMS_proper
.
Qed
.
Lemma
big_sepMS_subseteq
`
{
BiAffine
PROP
}
Φ
X
Y
:
Y
⊆
X
→
([
∗
mset
]
x
∈
X
,
Φ
x
)
⊢
[
∗
mset
]
x
∈
Y
,
Φ
x
.
Proof
.
intros
.
by
apply
big_sepL_submseteq
,
gmultiset_elements_submseteq
.
Qed
.
Proof
.
rewrite
big_opMS_eq
.
intros
.
by
apply
big_sepL_submseteq
,
gmultiset_elements_submseteq
.
Qed
.
Global
Instance
big_sepMS_mono'
:
Proper
(
pointwise_relation
_
(
⊢
)
==>
(=)
==>
(
⊢
))
(
big_opMS
(@
bi_sep
PROP
)
(
A
:
=
A
)).
...
...
@@ -1400,16 +1405,16 @@ Section gmultiset.
Global
Instance
big_sepMS_empty_persistent
Φ
:
Persistent
([
∗
mset
]
x
∈
∅
,
Φ
x
).
Proof
.
rewrite
/
big_opMS
gmultiset_elements_empty
.
apply
_
.
Qed
.
Proof
.
rewrite
big_opMS_eq
/
big_opMS_def
gmultiset_elements_empty
.
apply
_
.
Qed
.
Global
Instance
big_sepMS_persistent
Φ
X
:
(
∀
x
,
Persistent
(
Φ
x
))
→
Persistent
([
∗
mset
]
x
∈
X
,
Φ
x
).
Proof
.
rewrite
/
big_opMS
.
apply
_
.
Qed
.
Proof
.
rewrite
big_opMS_eq
/
big_opMS_def
.
apply
_
.
Qed
.
Global
Instance
big_sepMS_empty_affine
Φ
:
Affine
([
∗
mset
]
x
∈
∅
,
Φ
x
).
Proof
.
rewrite
/
big_opMS
gmultiset_elements_empty
.
apply
_
.
Qed
.
Proof
.
rewrite
big_opMS_eq
/
big_opMS_def
gmultiset_elements_empty
.
apply
_
.
Qed
.
Global
Instance
big_sepMS_affine
Φ
X
:
(
∀
x
,
Affine
(
Φ
x
))
→
Affine
([
∗
mset
]
x
∈
X
,
Φ
x
).
Proof
.
rewrite
/
big_opMS
.
apply
_
.
Qed
.
Proof
.
rewrite
big_opMS_eq
/
big_opMS_def
.
apply
_
.
Qed
.
End
gmultiset
.
End
bi_big_op
.
...
...
@@ -1513,10 +1518,10 @@ Section gmap.
Global
Instance
big_sepM_empty_timeless
`
{!
Timeless
(
emp
%
I
:
PROP
)}
Φ
:
Timeless
([
∗
map
]
k
↦
x
∈
∅
,
Φ
k
x
).
Proof
.
rewrite
/
big_opM
map_to_list_empty
.
apply
_
.
Qed
.
Proof
.
rewrite
big_opM_eq
/
big_opM_def
map_to_list_empty
.
apply
_
.
Qed
.
Global
Instance
big_sepM_timeless
`
{!
Timeless
(
emp
%
I
:
PROP
)}
Φ
m
:
(
∀
k
x
,
Timeless
(
Φ
k
x
))
→
Timeless
([
∗
map
]
k
↦
x
∈
m
,
Φ
k
x
).
Proof
.
intros
.
apply
big_sepL_timeless
=>
_
[??]
;
apply
_
.
Qed
.
Proof
.
rewrite
big_opM_eq
.
intros
.
apply
big_sepL_timeless
=>
_
[??]
;
apply
_
.
Qed
.
End
gmap
.
Section
gmap2
.
...
...
@@ -1527,7 +1532,7 @@ Section gmap2.
(
▷
[
∗
map
]
k
↦
x1
;
x2
∈
m1
;
m2
,
Φ
k
x1
x2
)
⊢
◇
([
∗
map
]
k
↦
x1
;
x2
∈
m1
;
m2
,
▷
Φ
k
x1
x2
).
Proof
.
rewrite
/
big_sepM2
later_and
(
timeless
⌜
_
⌝
%
I
).
rewrite
big_sepM2_eq
/
big_sepM2_def
later_and
(
timeless
⌜
_
⌝
%
I
).
rewrite
big_sepM_later
except_0_and
.
auto
using
and_mono_r
,
except_0_intro
.
Qed
.
...
...
@@ -1535,7 +1540,7 @@ Section gmap2.
([
∗
map
]
k
↦
x1
;
x2
∈
m1
;
m2
,
▷
Φ
k
x1
x2
)
⊢
▷
[
∗
map
]
k
↦
x1
;
x2
∈
m1
;
m2
,
Φ
k
x1
x2
.
Proof
.
rewrite
/
big_sepM2
later_and
-(
later_intro
⌜
_
⌝
%
I
).
rewrite
big_sepM2_eq
/
big_sepM2_def
later_and
-(
later_intro
⌜
_
⌝
%
I
).
apply
and_mono_r
.
by
rewrite
big_opM_commute
.
Qed
.
...
...
@@ -1551,18 +1556,18 @@ Section gmap2.
Lemma
big_sepM2_flip
Φ
m1
m2
:
([
∗
map
]
k
↦
y1
;
y2
∈
m2
;
m1
,
Φ
k
y2
y1
)
⊣
⊢
([
∗
map
]
k
↦
y1
;
y2
∈
m1
;
m2
,
Φ
k
y1
y2
).
Proof
.
rewrite
/
big_sepM2
.
apply
and_proper
;
[
apply
pure_proper
;
naive_solver
|].
rewrite
big_sepM2_eq
/
big_sepM2_def
.
apply
and_proper
;
[
apply
pure_proper
;
naive_solver
|].
rewrite
-
map_zip_with_flip
map_zip_with_map_zip
big_sepM_fmap
.
apply
big_sepM_proper
.
by
intros
k
[
b
a
].
Qed
.
Global
Instance
big_sepM2_empty_timeless
`
{!
Timeless
(
emp
%
I
:
PROP
)}
Φ
:
Timeless
([
∗
map
]
k
↦
x1
;
x2
∈
∅
;
∅
,
Φ
k
x1
x2
).
Proof
.
rewrite
/
big_sepM2
map_zip_with_empty
.
apply
_
.
Qed
.
Proof
.
rewrite
big_sepM2_eq
/
big_sepM2_def
map_zip_with_empty
.
apply
_
.
Qed
.
Global
Instance
big_sepM2_timeless
`
{!
Timeless
(
emp
%
I
:
PROP
)}
Φ
m1
m2
:
(
∀
k
x1
x2
,
Timeless
(
Φ
k
x1
x2
))
→
Timeless
([
∗
map
]
k
↦
x1
;
x2
∈
m1
;
m2
,
Φ
k
x1
x2
).
Proof
.
intros
.
rewrite
/
big_sepM2
.
apply
_
.
Qed
.
Proof
.
intros
.
rewrite
big_sepM2_eq
/
big_sepM2_def
.
apply
_
.
Qed
.
End
gmap2
.
(** ** Big ops over finite sets *)
...
...
@@ -1587,10 +1592,10 @@ Section gset.