Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Marianna Rapoport
iris-coq
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
.
Attach a 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