Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Rice Wine
Iris
Commits
15bfdc15
Commit
15bfdc15
authored
Mar 18, 2017
by
Robbert Krebbers
Browse files
Redefine big ops to get more definitional equalities.
parent
a378b828
Changes
8
Expand all
Hide whitespace changes
Inline
Side-by-side
opam.pins
View file @
15bfdc15
coq-stdpp https://gitlab.mpi-sws.org/robbertkrebbers/coq-stdpp
0ac2b4db07bdc471421c5a4c47789087b3df074c
coq-stdpp https://gitlab.mpi-sws.org/robbertkrebbers/coq-stdpp
a0ce0937cfabe16a184af2d92c0466ebacecbca2
theories/algebra/cmra_big_op.v
View file @
15bfdc15
This diff is collapsed.
Click to expand it.
theories/algebra/cmra_tactics.v
View file @
15bfdc15
...
...
@@ -23,15 +23,15 @@ Module ra_reflection. Section ra_reflection.
|
EOp
e1
e2
=>
flatten
e1
++
flatten
e2
end
.
Lemma
eval_flatten
Σ
e
:
eval
Σ
e
≡
big_op
((
λ
n
,
from_option
id
∅
(
Σ
!!
n
)
)
<$>
flatten
e
)
.
eval
Σ
e
≡
[
⋅
list
]
n
∈
flatten
e
,
from_option
id
∅
(
Σ
!!
n
).
Proof
.
induction
e
as
[|
|
e1
IH1
e2
IH2
]
;
rewrite
/=
?right_id
//.
by
rewrite
fmap_app
IH1
IH2
big_op_app
.
by
rewrite
IH1
IH2
big_op
L
_app
.
Qed
.
Lemma
flatten_correct
Σ
e1
e2
:
flatten
e1
⊆
+
flatten
e2
→
eval
Σ
e1
≼
eval
Σ
e2
.
Proof
.
by
intros
He
;
rewrite
!
eval_flatten
;
apply
big_op_submseteq
;
rewrite
->
He
.
by
intros
He
;
rewrite
!
eval_flatten
;
apply
big_op
L
_submseteq
;
rewrite
->
He
.
Qed
.
Class
Quote
(
Σ
1
Σ
2
:
list
A
)
(
l
:
A
)
(
e
:
expr
)
:
=
{}.
...
...
theories/base_logic/big_op.v
View file @
15bfdc15
...
...
@@ -85,27 +85,28 @@ Arguments uPredR : clear implicits.
Arguments
uPredUR
:
clear
implicits
.
(* Notations *)
Notation
"'[∗]' Ps"
:
=
(
big_op
(
M
:
=
uPredUR
_
)
Ps
)
(
at
level
20
)
:
uPred_scope
.
Notation
"'[∗' 'list' ] k ↦ x ∈ l , P"
:
=
(
big_opL
(
M
:
=
uPredUR
_
)
l
(
λ
k
x
,
P
))
Notation
"'[∗' 'list' ] k ↦ x ∈ l , P"
:
=
(
big_opL
(
M
:
=
uPredUR
_
)
(
λ
k
x
,
P
)
l
)
(
at
level
200
,
l
at
level
10
,
k
,
x
at
level
1
,
right
associativity
,
format
"[∗ list ] k ↦ x ∈ l , P"
)
:
uPred_scope
.
Notation
"'[∗' 'list' ] x ∈ l , P"
:
=
(
big_opL
(
M
:
=
uPredUR
_
)
l
(
λ
_
x
,
P
))
Notation
"'[∗' 'list' ] x ∈ l , P"
:
=
(
big_opL
(
M
:
=
uPredUR
_
)
(
λ
_
x
,
P
)
l
)
(
at
level
200
,
l
at
level
10
,
x
at
level
1
,
right
associativity
,
format
"[∗ list ] x ∈ l , P"
)
:
uPred_scope
.
Notation
"'[∗' 'map' ] k ↦ x ∈ m , P"
:
=
(
big_opM
(
M
:
=
uPredUR
_
)
m
(
λ
k
x
,
P
))
Notation
"'[∗]' Ps"
:
=
(
big_opL
(
M
:
=
uPredUR
_
)
(
λ
_
x
,
x
)
Ps
)
(
at
level
20
)
:
uPred_scope
.
Notation
"'[∗' 'map' ] k ↦ x ∈ m , P"
:
=
(
big_opM
(
M
:
=
uPredUR
_
)
(
λ
k
x
,
P
)
m
)
(
at
level
200
,
m
at
level
10
,
k
,
x
at
level
1
,
right
associativity
,
format
"[∗ map ] k ↦ x ∈ m , P"
)
:
uPred_scope
.
Notation
"'[∗' 'map' ] x ∈ m , P"
:
=
(
big_opM
(
M
:
=
uPredUR
_
)
m
(
λ
_
x
,
P
))
Notation
"'[∗' 'map' ] x ∈ m , P"
:
=
(
big_opM
(
M
:
=
uPredUR
_
)
(
λ
_
x
,
P
)
m
)
(
at
level
200
,
m
at
level
10
,
x
at
level
1
,
right
associativity
,
format
"[∗ map ] x ∈ m , P"
)
:
uPred_scope
.
Notation
"'[∗' 'set' ] x ∈ X , P"
:
=
(
big_opS
(
M
:
=
uPredUR
_
)
X
(
λ
x
,
P
))
Notation
"'[∗' 'set' ] x ∈ X , P"
:
=
(
big_opS
(
M
:
=
uPredUR
_
)
(
λ
x
,
P
)
X
)
(
at
level
200
,
X
at
level
10
,
x
at
level
1
,
right
associativity
,
format
"[∗ set ] x ∈ X , P"
)
:
uPred_scope
.
Notation
"'[∗' 'mset' ] x ∈ X , P"
:
=
(
big_opMS
(
M
:
=
uPredUR
_
)
X
(
λ
x
,
P
))
Notation
"'[∗' 'mset' ] x ∈ X , P"
:
=
(
big_opMS
(
M
:
=
uPredUR
_
)
(
λ
x
,
P
)
X
)
(
at
level
200
,
X
at
level
10
,
x
at
level
1
,
right
associativity
,
format
"[∗ mset ] x ∈ X , P"
)
:
uPred_scope
.
...
...
@@ -126,24 +127,6 @@ Context {M : ucmraT}.
Implicit
Types
Ps
Qs
:
list
(
uPred
M
).
Implicit
Types
A
:
Type
.
Global
Instance
big_sep_mono'
:
Proper
(
Forall2
(
⊢
)
==>
(
⊢
))
(
big_op
(
M
:
=
uPredUR
M
)).
Proof
.
by
induction
1
as
[|
P
Q
Ps
Qs
HPQ
?
IH
]
;
rewrite
/=
?HPQ
?IH
.
Qed
.
Lemma
big_sep_app
Ps
Qs
:
[
∗
]
(
Ps
++
Qs
)
⊣
⊢
[
∗
]
Ps
∗
[
∗
]
Qs
.
Proof
.
by
rewrite
big_op_app
.
Qed
.
Lemma
big_sep_submseteq
Ps
Qs
:
Qs
⊆
+
Ps
→
[
∗
]
Ps
⊢
[
∗
]
Qs
.
Proof
.
intros
.
apply
uPred_included
.
by
apply
:
big_op_submseteq
.
Qed
.
Lemma
big_sep_elem_of
Ps
P
:
P
∈
Ps
→
[
∗
]
Ps
⊢
P
.
Proof
.
intros
.
apply
uPred_included
.
by
apply
:
big_sep_elem_of
.
Qed
.
Lemma
big_sep_elem_of_acc
Ps
P
:
P
∈
Ps
→
[
∗
]
Ps
⊢
P
∗
(
P
-
∗
[
∗
]
Ps
).
Proof
.
intros
[
k
->]%
elem_of_Permutation
.
by
apply
sep_mono_r
,
wand_intro_l
.
Qed
.
(** ** Persistence *)
Global
Instance
big_sep_persistent
Ps
:
PersistentL
Ps
→
PersistentP
([
∗
]
Ps
).
Proof
.
induction
1
;
apply
_
.
Qed
.
Global
Instance
nil_persistent
:
PersistentL
(@
nil
(
uPred
M
)).
Proof
.
constructor
.
Qed
.
Global
Instance
cons_persistent
P
Ps
:
...
...
@@ -163,9 +146,7 @@ Proof.
Qed
.
Global
Instance
imap_persistent
{
A
}
(
f
:
nat
→
A
→
uPred
M
)
xs
:
(
∀
i
x
,
PersistentP
(
f
i
x
))
→
PersistentL
(
imap
f
xs
).
Proof
.
rewrite
/
PersistentL
/
imap
=>
?.
generalize
0
.
induction
xs
;
constructor
;
auto
.
Qed
.
Proof
.
revert
f
.
induction
xs
;
simpl
;
constructor
;
naive_solver
.
Qed
.
(** ** Timelessness *)
Global
Instance
big_sep_timeless
Ps
:
TimelessL
Ps
→
TimelessP
([
∗
]
Ps
).
...
...
@@ -190,9 +171,7 @@ Proof.
Qed
.
Global
Instance
imap_timeless
{
A
}
(
f
:
nat
→
A
→
uPred
M
)
xs
:
(
∀
i
x
,
TimelessP
(
f
i
x
))
→
TimelessL
(
imap
f
xs
).
Proof
.
rewrite
/
TimelessL
/
imap
=>
?.
generalize
0
.
induction
xs
;
constructor
;
auto
.
Qed
.
Proof
.
revert
f
.
induction
xs
;
simpl
;
constructor
;
naive_solver
.
Qed
.
(** ** Big ops over lists *)
Section
list
.
...
...
@@ -226,17 +205,21 @@ Section list.
l1
⊆
+
l2
→
([
∗
list
]
y
∈
l2
,
Φ
y
)
⊢
[
∗
list
]
y
∈
l1
,
Φ
y
.
Proof
.
intros
?.
apply
uPred_included
.
by
apply
:
big_opL_submseteq
.
Qed
.
Global
Instance
big_sepL_mono'
l
:
Proper
(
pointwise_relation
_
(
pointwise_relation
_
(
⊢
))
==>
(
⊢
))
(
big_opL
(
M
:
=
uPredUR
M
)
l
).
Proof
.
intros
f
g
Hf
.
apply
big_opL_forall
;
apply
_
||
intros
;
apply
Hf
.
Qed
.
Global
Instance
big_sepL_mono'
:
Proper
(
pointwise_relation
_
(
pointwise_relation
_
(
⊢
))
==>
(=)
==>
(
⊢
))
(
big_opL
(
M
:
=
uPredUR
M
)
(
A
:
=
A
)).
Proof
.
intros
f
g
Hf
m
?
<-.
apply
big_opL_forall
;
apply
_
||
intros
;
apply
Hf
.
Qed
.
Global
Instance
big_sep_mono'
:
Proper
(
Forall2
(
⊢
)
==>
(
⊢
))
(
big_opL
(
M
:
=
uPredUR
M
)
(
λ
_
P
,
P
)).
Proof
.
by
induction
1
as
[|
P
Q
Ps
Qs
HPQ
?
IH
]
;
rewrite
/=
?HPQ
?IH
.
Qed
.
Lemma
big_sepL_lookup_acc
Φ
l
i
x
:
l
!!
i
=
Some
x
→
([
∗
list
]
k
↦
y
∈
l
,
Φ
k
y
)
⊢
Φ
i
x
∗
(
Φ
i
x
-
∗
([
∗
list
]
k
↦
y
∈
l
,
Φ
k
y
)).
Proof
.
intros
Hli
.
apply
big_sep_elem_of_acc
,
(
elem_of_list_lookup_2
_
i
).
by
rewrite
list_lookup_imap
Hli
.
intros
Hli
.
rewrite
-(
take_drop_middle
l
i
x
)
//
big_sepL_app
/=.
rewrite
Nat
.
add_0_r
take_length_le
;
eauto
using
lookup_lt_Some
,
Nat
.
lt_le_incl
.
rewrite
assoc
-!(
comm
_
(
Φ
_
_
))
-
assoc
.
by
apply
sep_mono_r
,
wand_intro_l
.
Qed
.
Lemma
big_sepL_lookup
Φ
l
i
x
:
...
...
@@ -303,16 +286,21 @@ Section list.
Global
Instance
big_sepL_nil_persistent
Φ
:
PersistentP
([
∗
list
]
k
↦
x
∈
[],
Φ
k
x
).
Proof
.
rewrite
/
big_opL
.
apply
_
.
Qed
.
Proof
.
apply
_
.
Qed
.
Global
Instance
big_sepL_persistent
Φ
l
:
(
∀
k
x
,
PersistentP
(
Φ
k
x
))
→
PersistentP
([
∗
list
]
k
↦
x
∈
l
,
Φ
k
x
).
Proof
.
rewrite
/
big_opL
.
apply
_
.
Qed
.
Proof
.
revert
Φ
.
induction
l
as
[|
x
l
IH
]=>
Φ
?
/=
;
apply
_
.
Qed
.
Global
Instance
big_sepL_persistent_id
Ps
:
PersistentL
Ps
→
PersistentP
([
∗
]
Ps
).
Proof
.
induction
1
;
apply
_
.
Qed
.
Global
Instance
big_sepL_nil_timeless
Φ
:
TimelessP
([
∗
list
]
k
↦
x
∈
[],
Φ
k
x
).
Proof
.
rewrite
/
big_opL
.
apply
_
.
Qed
.
Proof
.
apply
_
.
Qed
.
Global
Instance
big_sepL_timeless
Φ
l
:
(
∀
k
x
,
TimelessP
(
Φ
k
x
))
→
TimelessP
([
∗
list
]
k
↦
x
∈
l
,
Φ
k
x
).
Proof
.
rewrite
/
big_opL
.
apply
_
.
Qed
.
Proof
.
revert
Φ
.
induction
l
as
[|
x
l
IH
]=>
Φ
?
/=
;
apply
_
.
Qed
.
Global
Instance
big_sepL_timeless_id
Ps
:
TimelessL
Ps
→
TimelessP
([
∗
]
Ps
).
Proof
.
induction
1
;
apply
_
.
Qed
.
End
list
.
Section
list2
.
...
...
@@ -325,13 +313,13 @@ Section list2.
([
∗
list
]
k
↦
x
∈
zip_with
f
l1
l2
,
Φ
k
x
)
⊣
⊢
([
∗
list
]
k
↦
x
∈
l1
,
∀
y
,
⌜
l2
!!
k
=
Some
y
⌝
→
Φ
k
(
f
x
y
)).
Proof
.
revert
Φ
l2
;
induction
l1
as
[|
x
l1
IH
]=>
Φ
[|
y
l2
]//
=
.
-
rewrite
big_sepL_nil
.
apply
(
anti_symm
_
),
True_intro
.
revert
Φ
l2
;
induction
l1
as
[|
x
l1
IH
]=>
Φ
[|
y
l2
]//.
-
apply
(
anti_symm
_
),
True_intro
.
trans
([
∗
list
]
_
↦
_
∈
x
::
l1
,
True
:
uPred
M
)%
I
.
+
rewrite
big_sepL_forall
.
auto
using
forall_intro
,
impl_intro_l
,
True_intro
.
+
apply
big_sepL_mono
=>
k
y
_
.
apply
forall_intro
=>
z
.
by
apply
impl_intro_l
,
pure_elim_l
.
-
rewrite
!
big_sepL_cons
IH
.
apply
sep_proper
=>
//.
apply
(
anti_symm
_
).
-
rewrite
/=
IH
.
apply
sep_proper
=>
//.
apply
(
anti_symm
_
).
+
apply
forall_intro
=>
z
/=.
by
apply
impl_intro_r
,
pure_elim_r
=>-[->].
+
rewrite
(
forall_elim
y
)
/=.
by
eapply
impl_elim
,
pure_intro
.
Qed
.
...
...
@@ -348,8 +336,7 @@ Section gmap.
([
∗
map
]
k
↦
x
∈
m1
,
Φ
k
x
)
⊢
[
∗
map
]
k
↦
x
∈
m2
,
Ψ
k
x
.
Proof
.
intros
Hm
H
Φ
.
trans
([
∗
map
]
k
↦
x
∈
m2
,
Φ
k
x
)%
I
.
-
apply
uPred_included
.
apply
:
big_op_submseteq
.
by
apply
fmap_submseteq
,
map_to_list_submseteq
.
-
rewrite
/
big_opM
.
by
apply
big_sepL_submseteq
,
map_to_list_submseteq
.
-
apply
big_opM_forall
;
apply
_
||
auto
.
Qed
.
Lemma
big_sepM_proper
Φ
Ψ
m
:
...
...
@@ -357,10 +344,10 @@ Section gmap.
([
∗
map
]
k
↦
x
∈
m
,
Φ
k
x
)
⊣
⊢
([
∗
map
]
k
↦
x
∈
m
,
Ψ
k
x
).
Proof
.
apply
big_opM_proper
.
Qed
.
Global
Instance
big_sepM_mono'
m
:
Proper
(
pointwise_relation
_
(
pointwise_relation
_
(
⊢
))
==>
(
⊢
))
(
big_opM
(
M
:
=
uPredUR
M
)
m
).
Proof
.
intros
f
g
Hf
.
apply
big_opM_forall
;
apply
_
||
intros
;
apply
Hf
.
Qed
.
Global
Instance
big_sepM_mono'
:
Proper
(
pointwise_relation
_
(
pointwise_relation
_
(
⊢
))
==>
(=)
==>
(
⊢
))
(
big_opM
(
M
:
=
uPredUR
M
)
(
A
:
=
A
)
).
Proof
.
intros
f
g
Hf
m
?
<-
.
apply
big_opM_forall
;
apply
_
||
intros
;
apply
Hf
.
Qed
.
Lemma
big_sepM_empty
Φ
:
([
∗
map
]
k
↦
x
∈
∅
,
Φ
k
x
)
⊣
⊢
True
.
Proof
.
by
rewrite
big_opM_empty
.
Qed
.
...
...
@@ -493,13 +480,13 @@ Section gmap.
Proof
.
rewrite
/
big_opM
map_to_list_empty
.
apply
_
.
Qed
.
Global
Instance
big_sepM_persistent
Φ
m
:
(
∀
k
x
,
PersistentP
(
Φ
k
x
))
→
PersistentP
([
∗
map
]
k
↦
x
∈
m
,
Φ
k
x
).
Proof
.
intros
.
apply
big_sep
_persistent
,
fmap
_persistent
=>
-
[??]
/=
;
auto
.
Qed
.
Proof
.
intros
.
apply
big_sep
L
_persistent
=>
_
[??]
;
apply
_
.
Qed
.
Global
Instance
big_sepM_nil_timeless
Φ
:
TimelessP
([
∗
map
]
k
↦
x
∈
∅
,
Φ
k
x
).
Proof
.
rewrite
/
big_opM
map_to_list_empty
.
apply
_
.
Qed
.
Global
Instance
big_sepM_timeless
Φ
m
:
(
∀
k
x
,
TimelessP
(
Φ
k
x
))
→
TimelessP
([
∗
map
]
k
↦
x
∈
m
,
Φ
k
x
).
Proof
.
intro
.
apply
big_sep
_timeless
,
fmap
_timeless
=>
-
[??]
/=
;
auto
.
Qed
.
Proof
.
intro
s
.
apply
big_sep
L
_timeless
=>
_
[??]
;
apply
_
.
Qed
.
End
gmap
.
...
...
@@ -514,8 +501,7 @@ Section gset.
([
∗
set
]
x
∈
X
,
Φ
x
)
⊢
[
∗
set
]
x
∈
Y
,
Ψ
x
.
Proof
.
intros
HX
H
Φ
.
trans
([
∗
set
]
x
∈
Y
,
Φ
x
)%
I
.
-
apply
uPred_included
.
apply
:
big_op_submseteq
.
by
apply
fmap_submseteq
,
elements_submseteq
.
-
rewrite
/
big_opM
.
by
apply
big_sepL_submseteq
,
elements_submseteq
.
-
apply
big_opS_forall
;
apply
_
||
auto
.
Qed
.
Lemma
big_sepS_proper
Φ
Ψ
X
:
...
...
@@ -523,9 +509,9 @@ Section gset.
([
∗
set
]
x
∈
X
,
Φ
x
)
⊣
⊢
([
∗
set
]
x
∈
X
,
Ψ
x
).
Proof
.
apply
:
big_opS_proper
.
Qed
.
Global
Instance
big_sepS_mono'
X
:
Proper
(
pointwise_relation
_
(
⊢
)
==>
(
⊢
))
(
big_opS
(
M
:
=
uPredUR
M
)
X
).
Proof
.
intros
f
g
Hf
.
apply
big_opS_forall
;
apply
_
||
intros
;
apply
Hf
.
Qed
.
Global
Instance
big_sepS_mono'
:
Proper
(
pointwise_relation
_
(
⊢
)
==>
(=)
==>
(
⊢
))
(
big_opS
(
M
:
=
uPredUR
M
)
(
A
:
=
A
)
).
Proof
.
intros
f
g
Hf
m
?
<-
.
apply
big_opS_forall
;
apply
_
||
intros
;
apply
Hf
.
Qed
.
Lemma
big_sepS_empty
Φ
:
([
∗
set
]
x
∈
∅
,
Φ
x
)
⊣
⊢
True
.
Proof
.
by
rewrite
big_opS_empty
.
Qed
.
...
...
@@ -665,8 +651,7 @@ Section gmultiset.
([
∗
mset
]
x
∈
X
,
Φ
x
)
⊢
[
∗
mset
]
x
∈
Y
,
Ψ
x
.
Proof
.
intros
HX
H
Φ
.
trans
([
∗
mset
]
x
∈
Y
,
Φ
x
)%
I
.
-
apply
uPred_included
.
apply
:
big_op_submseteq
.
by
apply
fmap_submseteq
,
gmultiset_elements_submseteq
.
-
rewrite
/
big_opM
.
by
apply
big_sepL_submseteq
,
gmultiset_elements_submseteq
.
-
apply
big_opMS_forall
;
apply
_
||
auto
.
Qed
.
Lemma
big_sepMS_proper
Φ
Ψ
X
:
...
...
@@ -674,9 +659,9 @@ Section gmultiset.
([
∗
mset
]
x
∈
X
,
Φ
x
)
⊣
⊢
([
∗
mset
]
x
∈
X
,
Ψ
x
).
Proof
.
apply
:
big_opMS_proper
.
Qed
.
Global
Instance
big_sepMS_mono'
X
:
Proper
(
pointwise_relation
_
(
⊢
)
==>
(
⊢
))
(
big_opMS
(
M
:
=
uPredUR
M
)
X
).
Proof
.
intros
f
g
Hf
.
apply
big_opMS_forall
;
apply
_
||
intros
;
apply
Hf
.
Qed
.
Global
Instance
big_sepMS_mono'
:
Proper
(
pointwise_relation
_
(
⊢
)
==>
(=)
==>
(
⊢
))
(
big_opMS
(
M
:
=
uPredUR
M
)
(
A
:
=
A
)
).
Proof
.
intros
f
g
Hf
m
?
<-
.
apply
big_opMS_forall
;
apply
_
||
intros
;
apply
Hf
.
Qed
.
Lemma
big_sepMS_empty
Φ
:
([
∗
mset
]
x
∈
∅
,
Φ
x
)
⊣
⊢
True
.
Proof
.
by
rewrite
big_opMS_empty
.
Qed
.
...
...
theories/base_logic/tactics.v
View file @
15bfdc15
...
...
@@ -23,17 +23,16 @@ Module uPred_reflection. Section uPred_reflection.
|
ESep
e1
e2
=>
flatten
e1
++
flatten
e2
end
.
Notation
eval_list
Σ
l
:
=
([
∗
]
((
λ
n
,
from_option
id
True
%
I
(
Σ
!!
n
))
<$>
l
))%
I
.
Notation
eval_list
Σ
l
:
=
([
∗
list
]
n
∈
l
,
from_option
id
True
(
Σ
!!
n
))%
I
.
Lemma
eval_flatten
Σ
e
:
eval
Σ
e
⊣
⊢
eval_list
Σ
(
flatten
e
).
Proof
.
induction
e
as
[|
|
e1
IH1
e2
IH2
]
;
rewrite
/=
?right_id
?fmap_app
?big_sep_app
?IH1
?IH2
//.
rewrite
/=
?right_id
?big_sep
L
_app
?IH1
?IH2
//.
Qed
.
Lemma
flatten_entails
Σ
e1
e2
:
flatten
e2
⊆
+
flatten
e1
→
eval
Σ
e1
⊢
eval
Σ
e2
.
Proof
.
intros
.
rewrite
!
eval_flatten
.
by
apply
big_sep_submseteq
,
fmap_submseteq
.
Qed
.
Proof
.
intros
.
rewrite
!
eval_flatten
.
by
apply
big_sepL_submseteq
.
Qed
.
Lemma
flatten_equiv
Σ
e1
e2
:
flatten
e2
≡
ₚ
flatten
e1
→
eval
Σ
e1
⊣
⊢
eval
Σ
e2
.
Proof
.
intros
He
.
by
rewrite
!
eval_flatten
He
.
Qed
.
...
...
@@ -90,7 +89,7 @@ Module uPred_reflection. Section uPred_reflection.
Proof
.
intros
??.
rewrite
!
eval_flatten
.
rewrite
(
flatten_cancel
e1
e1'
ns
)
//
(
flatten_cancel
e2
e2'
ns
)
//
;
csimpl
.
rewrite
!
fmap_app
!
big_sep_app
.
apply
sep_mono_r
.
rewrite
!
big_sep
L
_app
.
apply
sep_mono_r
.
Qed
.
Fixpoint
to_expr
(
l
:
list
nat
)
:
expr
:
=
...
...
@@ -110,7 +109,7 @@ Module uPred_reflection. Section uPred_reflection.
cancel
ns
e
=
Some
e'
→
eval
Σ
e
⊣
⊢
(
eval
Σ
(
to_expr
ns
)
∗
eval
Σ
e'
).
Proof
.
intros
He
%
flatten_cancel
.
by
rewrite
eval_flatten
He
fmap_app
big_sep_app
eval_to_expr
eval_flatten
.
by
rewrite
eval_flatten
He
big_sep
L
_app
eval_to_expr
eval_flatten
.
Qed
.
Lemma
split_r
Σ
e
ns
e'
:
cancel
ns
e
=
Some
e'
→
eval
Σ
e
⊣
⊢
(
eval
Σ
e'
∗
eval
Σ
(
to_expr
ns
)).
...
...
theories/heap_lang/lifting.v
View file @
15bfdc15
...
...
@@ -76,7 +76,7 @@ Lemma wp_fork E e Φ :
▷
Φ
(
LitV
LitUnit
)
∗
▷
WP
e
{{
_
,
True
}}
⊢
WP
Fork
e
@
E
{{
Φ
}}.
Proof
.
rewrite
-(
wp_lift_pure_det_head_step
(
Fork
e
)
(
Lit
LitUnit
)
[
e
])
//=
;
eauto
.
-
by
rewrite
-
step_fupd_intro
//
later_sep
-(
wp_value
_
_
(
Lit
_
))
//
b
ig
_sepL_singleton
.
-
by
rewrite
-
step_fupd_intro
//
later_sep
-(
wp_value
_
_
(
Lit
_
))
//
r
ig
ht_id
.
-
intros
;
inv_head_step
;
eauto
.
Qed
.
...
...
theories/proofmode/class_instances.v
View file @
15bfdc15
...
...
@@ -354,7 +354,7 @@ Proof. intros. by rewrite /FromAnd big_opL_cons always_and_sep_l. Qed.
Global
Instance
from_and_big_sepL_app
{
A
}
(
Φ
:
nat
→
A
→
uPred
M
)
l1
l2
:
FromAnd
false
([
∗
list
]
k
↦
y
∈
l1
++
l2
,
Φ
k
y
)
([
∗
list
]
k
↦
y
∈
l1
,
Φ
k
y
)
([
∗
list
]
k
↦
y
∈
l2
,
Φ
(
length
l1
+
k
)
y
).
Proof
.
by
rewrite
/
FromAnd
big_
se
pL_app
.
Qed
.
Proof
.
by
rewrite
/
FromAnd
big_
o
pL_app
.
Qed
.
Global
Instance
from_sep_big_sepL_app_persistent
{
A
}
(
Φ
:
nat
→
A
→
uPred
M
)
l1
l2
:
(
∀
k
y
,
PersistentP
(
Φ
k
y
))
→
FromAnd
true
([
∗
list
]
k
↦
y
∈
l1
++
l2
,
Φ
k
y
)
...
...
theories/proofmode/coq_tactics.v
View file @
15bfdc15
...
...
@@ -234,14 +234,14 @@ Proof.
intros
j
.
apply
(
env_app_disjoint
_
_
_
j
)
in
Happ
.
naive_solver
eauto
using
env_app_fresh
.
+
rewrite
(
env_app_perm
_
_
Γ
p'
)
//.
rewrite
big_sep_app
always_sep
.
solve_sep_entails
.
rewrite
big_sep
L
_app
always_sep
.
solve_sep_entails
.
-
destruct
(
env_app
Γ
Γ
p
)
eqn
:
Happ
,
(
env_app
Γ
Γ
s
)
as
[
Γ
s'
|]
eqn
:
?
;
simplify_eq
/=.
apply
wand_intro_l
,
sep_intro_True_l
;
[
apply
pure_intro
|].
+
destruct
Hwf
;
constructor
;
simpl
;
eauto
using
env_app_wf
.
intros
j
.
apply
(
env_app_disjoint
_
_
_
j
)
in
Happ
.
naive_solver
eauto
using
env_app_fresh
.
+
rewrite
(
env_app_perm
_
_
Γ
s'
)
//
big_sep_app
.
solve_sep_entails
.
+
rewrite
(
env_app_perm
_
_
Γ
s'
)
//
big_sep
L
_app
.
solve_sep_entails
.
Qed
.
Lemma
envs_simple_replace_sound'
Δ
Δ
'
i
p
Γ
:
...
...
@@ -257,14 +257,14 @@ Proof.
intros
j
.
apply
(
env_app_disjoint
_
_
_
j
)
in
Happ
.
destruct
(
decide
(
i
=
j
))
;
try
naive_solver
eauto
using
env_replace_fresh
.
+
rewrite
(
env_replace_perm
_
_
Γ
p'
)
//.
rewrite
big_sep_app
always_sep
.
solve_sep_entails
.
rewrite
big_sep
L
_app
always_sep
.
solve_sep_entails
.
-
destruct
(
env_app
Γ
Γ
p
)
eqn
:
Happ
,
(
env_replace
i
Γ
Γ
s
)
as
[
Γ
s'
|]
eqn
:
?
;
simplify_eq
/=.
apply
wand_intro_l
,
sep_intro_True_l
;
[
apply
pure_intro
|].
+
destruct
Hwf
;
constructor
;
simpl
;
eauto
using
env_replace_wf
.
intros
j
.
apply
(
env_app_disjoint
_
_
_
j
)
in
Happ
.
destruct
(
decide
(
i
=
j
))
;
try
naive_solver
eauto
using
env_replace_fresh
.
+
rewrite
(
env_replace_perm
_
_
Γ
s'
)
//
big_sep_app
.
solve_sep_entails
.
+
rewrite
(
env_replace_perm
_
_
Γ
s'
)
//
big_sep
L
_app
.
solve_sep_entails
.
Qed
.
Lemma
envs_simple_replace_sound
Δ
Δ
'
i
p
P
Γ
:
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment