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
George Pirlea
Iris
Commits
a9031f7f
Commit
a9031f7f
authored
Apr 25, 2019
by
Robbert Krebbers
Browse files
More type annotations for
https://github.com/coq/coq/pull/9996
.
parent
3a0ab5e6
Changes
15
Hide whitespace changes
Inline
Side-by-side
opam
View file @
a9031f7f
...
...
@@ -11,5 +11,5 @@ install: [make "install"]
remove: ["rm" "-rf" "%{lib}%/coq/user-contrib/iris"]
depends: [
"coq" { (>= "8.7.1" & < "8.10~") | (= "dev") }
"coq-stdpp" { (= "dev.2019-04-25.
0.0f2d2c8a
") | (= "dev") }
"coq-stdpp" { (= "dev.2019-04-25.
1.d6eb24f2
") | (= "dev") }
]
theories/algebra/cmra.v
View file @
a9031f7f
...
...
@@ -45,21 +45,21 @@ Section mixin.
Record
CmraMixin
A
`
{
Dist
A
,
Equiv
A
,
PCore
A
,
Op
A
,
Valid
A
,
ValidN
A
}
:
=
{
(* setoids *)
mixin_cmra_op_ne
(
x
:
A
)
:
NonExpansive
(
op
x
)
;
mixin_cmra_pcore_ne
n
x
y
cx
:
mixin_cmra_pcore_ne
n
(
x
y
:
A
)
cx
:
x
≡
{
n
}
≡
y
→
pcore
x
=
Some
cx
→
∃
cy
,
pcore
y
=
Some
cy
∧
cx
≡
{
n
}
≡
cy
;
mixin_cmra_validN_ne
n
:
Proper
(
dist
n
==>
impl
)
(
validN
n
)
;
(* valid *)
mixin_cmra_valid_validN
x
:
✓
x
↔
∀
n
,
✓
{
n
}
x
;
mixin_cmra_validN_S
n
x
:
✓
{
S
n
}
x
→
✓
{
n
}
x
;
mixin_cmra_valid_validN
(
x
:
A
)
:
✓
x
↔
∀
n
,
✓
{
n
}
x
;
mixin_cmra_validN_S
n
(
x
:
A
)
:
✓
{
S
n
}
x
→
✓
{
n
}
x
;
(* monoid *)
mixin_cmra_assoc
:
Assoc
(
≡
)
(
⋅
)
;
mixin_cmra_comm
:
Comm
(
≡
)
(
⋅
)
;
mixin_cmra_pcore_l
x
cx
:
pcore
x
=
Some
cx
→
cx
⋅
x
≡
x
;
mixin_cmra_pcore_idemp
x
cx
:
pcore
x
=
Some
cx
→
pcore
cx
≡
Some
cx
;
mixin_cmra_pcore_mono
x
y
cx
:
mixin_cmra_assoc
:
Assoc
(
≡
@{
A
}
)
(
⋅
)
;
mixin_cmra_comm
:
Comm
(
≡
@{
A
}
)
(
⋅
)
;
mixin_cmra_pcore_l
(
x
:
A
)
cx
:
pcore
x
=
Some
cx
→
cx
⋅
x
≡
x
;
mixin_cmra_pcore_idemp
(
x
:
A
)
cx
:
pcore
x
=
Some
cx
→
pcore
cx
≡
Some
cx
;
mixin_cmra_pcore_mono
(
x
y
:
A
)
cx
:
x
≼
y
→
pcore
x
=
Some
cx
→
∃
cy
,
pcore
y
=
Some
cy
∧
cx
≼
cy
;
mixin_cmra_validN_op_l
n
x
y
:
✓
{
n
}
(
x
⋅
y
)
→
✓
{
n
}
x
;
mixin_cmra_extend
n
x
y1
y2
:
mixin_cmra_validN_op_l
n
(
x
y
:
A
)
:
✓
{
n
}
(
x
⋅
y
)
→
✓
{
n
}
x
;
mixin_cmra_extend
n
(
x
y1
y2
:
A
)
:
✓
{
n
}
x
→
x
≡
{
n
}
≡
y1
⋅
y2
→
{
z1
:
A
&
{
z2
|
x
≡
z1
⋅
z2
∧
z1
≡
{
n
}
≡
y1
∧
z2
≡
{
n
}
≡
y2
}
}
}.
...
...
@@ -187,7 +187,7 @@ Class Unit (A : Type) := ε : A.
Arguments
ε
{
_
_
}.
Record
UcmraMixin
A
`
{
Dist
A
,
Equiv
A
,
PCore
A
,
Op
A
,
Valid
A
,
Unit
A
}
:
=
{
mixin_ucmra_unit_valid
:
✓
ε
;
mixin_ucmra_unit_valid
:
✓
(
ε
:
A
)
;
mixin_ucmra_unit_left_id
:
LeftId
(
≡
)
ε
(
⋅
)
;
mixin_ucmra_pcore_unit
:
pcore
ε
≡
Some
ε
}.
...
...
@@ -861,17 +861,17 @@ End cmra_transport.
Record
RAMixin
A
`
{
Equiv
A
,
PCore
A
,
Op
A
,
Valid
A
}
:
=
{
(* setoids *)
ra_op_proper
(
x
:
A
)
:
Proper
((
≡
)
==>
(
≡
))
(
op
x
)
;
ra_core_proper
x
y
cx
:
ra_core_proper
(
x
y
:
A
)
cx
:
x
≡
y
→
pcore
x
=
Some
cx
→
∃
cy
,
pcore
y
=
Some
cy
∧
cx
≡
cy
;
ra_validN_proper
:
Proper
((
≡
)
==>
impl
)
valid
;
ra_validN_proper
:
Proper
((
≡
@{
A
}
)
==>
impl
)
valid
;
(* monoid *)
ra_assoc
:
Assoc
(
≡
)
(
⋅
)
;
ra_comm
:
Comm
(
≡
)
(
⋅
)
;
ra_pcore_l
x
cx
:
pcore
x
=
Some
cx
→
cx
⋅
x
≡
x
;
ra_pcore_idemp
x
cx
:
pcore
x
=
Some
cx
→
pcore
cx
≡
Some
cx
;
ra_pcore_mono
x
y
cx
:
ra_assoc
:
Assoc
(
≡
@{
A
}
)
(
⋅
)
;
ra_comm
:
Comm
(
≡
@{
A
}
)
(
⋅
)
;
ra_pcore_l
(
x
:
A
)
cx
:
pcore
x
=
Some
cx
→
cx
⋅
x
≡
x
;
ra_pcore_idemp
(
x
:
A
)
cx
:
pcore
x
=
Some
cx
→
pcore
cx
≡
Some
cx
;
ra_pcore_mono
(
x
y
:
A
)
cx
:
x
≼
y
→
pcore
x
=
Some
cx
→
∃
cy
,
pcore
y
=
Some
cy
∧
cx
≼
cy
;
ra_valid_op_l
x
y
:
✓
(
x
⋅
y
)
→
✓
x
ra_valid_op_l
(
x
y
:
A
)
:
✓
(
x
⋅
y
)
→
✓
x
}.
Section
discrete
.
...
...
theories/algebra/dra.v
View file @
a9031f7f
...
...
@@ -3,26 +3,27 @@ Set Default Proof Using "Type".
Record
DraMixin
A
`
{
Equiv
A
,
Core
A
,
Disjoint
A
,
Op
A
,
Valid
A
}
:
=
{
(* setoids *)
mixin_dra_equivalence
:
Equivalence
(
(
≡
)
:
relation
A
)
;
mixin_dra_op_proper
:
Proper
((
≡
)
==>
(
≡
)
==>
(
≡
))
(
⋅
)
;
mixin_dra_core_proper
:
Proper
((
≡
)
==>
(
≡
))
core
;
mixin_dra_valid_proper
:
Proper
((
≡
)
==>
impl
)
valid
;
mixin_dra_disjoint_proper
x
:
Proper
((
≡
)
==>
impl
)
(
disjoint
x
)
;
mixin_dra_equivalence
:
Equivalence
(
≡
@{
A
}
)
;
mixin_dra_op_proper
:
Proper
((
≡
@{
A
}
)
==>
(
≡
)
==>
(
≡
))
(
⋅
)
;
mixin_dra_core_proper
:
Proper
((
≡
@{
A
}
)
==>
(
≡
))
core
;
mixin_dra_valid_proper
:
Proper
((
≡
@{
A
}
)
==>
impl
)
valid
;
mixin_dra_disjoint_proper
(
x
:
A
)
:
Proper
((
≡
)
==>
impl
)
(
disjoint
x
)
;
(* validity *)
mixin_dra_op_valid
x
y
:
✓
x
→
✓
y
→
x
##
y
→
✓
(
x
⋅
y
)
;
mixin_dra_core_valid
x
:
✓
x
→
✓
core
x
;
mixin_dra_op_valid
(
x
y
:
A
)
:
✓
x
→
✓
y
→
x
##
y
→
✓
(
x
⋅
y
)
;
mixin_dra_core_valid
(
x
:
A
)
:
✓
x
→
✓
core
x
;
(* monoid *)
mixin_dra_assoc
x
y
z
:
mixin_dra_assoc
(
x
y
z
:
A
)
:
✓
x
→
✓
y
→
✓
z
→
x
##
y
→
x
⋅
y
##
z
→
x
⋅
(
y
⋅
z
)
≡
(
x
⋅
y
)
⋅
z
;
mixin_dra_disjoint_ll
x
y
z
:
✓
x
→
✓
y
→
✓
z
→
x
##
y
→
x
⋅
y
##
z
→
x
##
z
;
mixin_dra_disjoint_move_l
x
y
z
:
mixin_dra_disjoint_ll
(
x
y
z
:
A
)
:
✓
x
→
✓
y
→
✓
z
→
x
##
y
→
x
⋅
y
##
z
→
x
##
z
;
mixin_dra_disjoint_move_l
(
x
y
z
:
A
)
:
✓
x
→
✓
y
→
✓
z
→
x
##
y
→
x
⋅
y
##
z
→
x
##
y
⋅
z
;
mixin_dra_symmetric
:
Symmetric
(@
disjoint
A
_
)
;
mixin_dra_comm
x
y
:
✓
x
→
✓
y
→
x
##
y
→
x
⋅
y
≡
y
⋅
x
;
mixin_dra_core_disjoint_l
x
:
✓
x
→
core
x
##
x
;
mixin_dra_core_l
x
:
✓
x
→
core
x
⋅
x
≡
x
;
mixin_dra_core_idemp
x
:
✓
x
→
core
(
core
x
)
≡
core
x
;
mixin_dra_core_mono
x
y
:
mixin_dra_comm
(
x
y
:
A
)
:
✓
x
→
✓
y
→
x
##
y
→
x
⋅
y
≡
y
⋅
x
;
mixin_dra_core_disjoint_l
(
x
:
A
)
:
✓
x
→
core
x
##
x
;
mixin_dra_core_l
(
x
:
A
)
:
✓
x
→
core
x
⋅
x
≡
x
;
mixin_dra_core_idemp
(
x
:
A
)
:
✓
x
→
core
(
core
x
)
≡
core
x
;
mixin_dra_core_mono
(
x
y
:
A
)
:
∃
z
,
✓
x
→
✓
y
→
x
##
y
→
core
(
x
⋅
y
)
≡
core
x
⋅
z
∧
✓
z
∧
core
x
##
z
}.
Structure
draT
:
=
DraT
{
...
...
theories/bi/embedding.v
View file @
a9031f7f
...
...
@@ -12,17 +12,23 @@ Hint Mode Embed - ! : typeclass_instances.
(* Mixins allow us to create instances easily without having to use Program *)
Record
BiEmbedMixin
(
PROP1
PROP2
:
bi
)
`
(
Embed
PROP1
PROP2
)
:
=
{
bi_embed_mixin_ne
:
NonExpansive
embed
;
bi_embed_mixin_mono
:
Proper
((
⊢
)
==>
(
⊢
))
embed
;
bi_embed_mixin_ne
:
NonExpansive
(
embed
(
A
:
=
PROP1
)
(
B
:
=
PROP2
))
;
bi_embed_mixin_mono
:
Proper
((
⊢
)
==>
(
⊢
))
(
embed
(
A
:
=
PROP1
)
(
B
:
=
PROP2
))
;
bi_embed_mixin_emp_valid_inj
(
P
:
PROP1
)
:
bi_emp_valid
(
PROP
:
=
PROP2
)
⎡
P
⎤
→
bi_emp_valid
P
;
bi_embed_mixin_emp_2
:
emp
⊢
⎡
emp
⎤
;
bi_embed_mixin_impl_2
P
Q
:
(
⎡
P
⎤
→
⎡
Q
⎤
)
⊢
⎡
P
→
Q
⎤
;
bi_embed_mixin_forall_2
A
(
Φ
:
A
→
PROP1
)
:
(
∀
x
,
⎡Φ
x
⎤
)
⊢
⎡
∀
x
,
Φ
x
⎤
;
bi_embed_mixin_exist_1
A
(
Φ
:
A
→
PROP1
)
:
⎡
∃
x
,
Φ
x
⎤
⊢
∃
x
,
⎡Φ
x
⎤
;
bi_embed_mixin_sep
P
Q
:
⎡
P
∗
Q
⎤
⊣
⊢
⎡
P
⎤
∗
⎡
Q
⎤
;
bi_embed_mixin_wand_2
P
Q
:
(
⎡
P
⎤
-
∗
⎡
Q
⎤
)
⊢
⎡
P
-
∗
Q
⎤
;
bi_embed_mixin_persistently
P
:
⎡
<
pers
>
P
⎤
⊣
⊢
<
pers
>
⎡
P
⎤
bi_embed_mixin_emp_2
:
emp
⊢
@{
PROP2
}
⎡
emp
⎤
;
bi_embed_mixin_impl_2
(
P
Q
:
PROP1
)
:
(
⎡
P
⎤
→
⎡
Q
⎤
)
⊢
@{
PROP2
}
⎡
P
→
Q
⎤
;
bi_embed_mixin_forall_2
A
(
Φ
:
A
→
PROP1
)
:
(
∀
x
,
⎡Φ
x
⎤
)
⊢
@{
PROP2
}
⎡
∀
x
,
Φ
x
⎤
;
bi_embed_mixin_exist_1
A
(
Φ
:
A
→
PROP1
)
:
⎡
∃
x
,
Φ
x
⎤
⊢
@{
PROP2
}
∃
x
,
⎡Φ
x
⎤
;
bi_embed_mixin_sep
(
P
Q
:
PROP1
)
:
⎡
P
∗
Q
⎤
⊣
⊢
@{
PROP2
}
⎡
P
⎤
∗
⎡
Q
⎤
;
bi_embed_mixin_wand_2
(
P
Q
:
PROP1
)
:
(
⎡
P
⎤
-
∗
⎡
Q
⎤
)
⊢
@{
PROP2
}
⎡
P
-
∗
Q
⎤
;
bi_embed_mixin_persistently
(
P
:
PROP1
)
:
⎡
<
pers
>
P
⎤
⊣
⊢
@{
PROP2
}
<
pers
>
⎡
P
⎤
}.
Class
BiEmbed
(
PROP1
PROP2
:
bi
)
:
=
{
...
...
@@ -302,7 +308,8 @@ Section sbi_embed.
⎡■
?p
P
⎤
⊢
■
?p
⎡
P
⎤
.
Proof
.
destruct
p
;
simpl
;
auto
using
embed_plainly_1
.
Qed
.
Lemma
embed_plain
`
{!
BiPlainly
PROP1
,
!
BiPlainly
PROP2
}
P
:
Plain
P
→
Plain
⎡
P
⎤
.
Lemma
embed_plain
`
{!
BiPlainly
PROP1
,
!
BiPlainly
PROP2
}
(
P
:
PROP1
)
:
Plain
P
→
Plain
(
PROP
:
=
PROP2
)
⎡
P
⎤
.
Proof
.
intros
?.
by
rewrite
/
Plain
{
1
}(
plain
P
)
embed_plainly_1
.
Qed
.
Global
Instance
embed_timeless
P
:
Timeless
P
→
Timeless
⎡
P
⎤
.
...
...
theories/bi/lib/atomic.v
View file @
a9031f7f
...
...
@@ -288,7 +288,7 @@ Section lemmas.
rewrite
atomic_update_eq
{
1
}/
atomic_update_def
/=.
iIntros
(???
HAU
)
"[#HP HQ]"
.
iApply
(
greatest_fixpoint_coind
_
(
λ
_
,
Q
))
;
last
done
.
iIntros
"!#"
([])
"HQ"
.
iApply
(
make_laterable_intro
with
"[] HQ"
).
iIntros
"!# >HQ"
.
iApply
(
make_laterable_intro
Q
with
"[] HQ"
).
iIntros
"!# >HQ"
.
iApply
HAU
.
by
iFrame
.
Qed
.
...
...
theories/bi/lib/fractional.v
View file @
a9031f7f
...
...
@@ -30,11 +30,11 @@ Section fractional.
Lemma
fractional_split_1
P
P1
P2
Φ
q1
q2
:
AsFractional
P
Φ
(
q1
+
q2
)
→
AsFractional
P1
Φ
q1
→
AsFractional
P2
Φ
q2
→
P
-
∗
P1
∗
P2
.
Proof
.
intros
.
by
rewrite
-
fractional_split
.
Qed
.
Proof
.
intros
.
by
rewrite
-
(
fractional_split
P
)
.
Qed
.
Lemma
fractional_split_2
P
P1
P2
Φ
q1
q2
:
AsFractional
P
Φ
(
q1
+
q2
)
→
AsFractional
P1
Φ
q1
→
AsFractional
P2
Φ
q2
→
P1
-
∗
P2
-
∗
P
.
Proof
.
intros
.
apply
bi
.
wand_intro_r
.
by
rewrite
-
fractional_split
.
Qed
.
Proof
.
intros
.
apply
bi
.
wand_intro_r
.
by
rewrite
-
(
fractional_split
P
)
.
Qed
.
Lemma
fractional_half
P
P12
Φ
q
:
AsFractional
P
Φ
q
→
AsFractional
P12
Φ
(
q
/
2
)
→
...
...
@@ -43,11 +43,11 @@ Section fractional.
Lemma
fractional_half_1
P
P12
Φ
q
:
AsFractional
P
Φ
q
→
AsFractional
P12
Φ
(
q
/
2
)
→
P
-
∗
P12
∗
P12
.
Proof
.
intros
.
by
rewrite
-
fractional_half
.
Qed
.
Proof
.
intros
.
by
rewrite
-
(
fractional_half
P
)
.
Qed
.
Lemma
fractional_half_2
P
P12
Φ
q
:
AsFractional
P
Φ
q
→
AsFractional
P12
Φ
(
q
/
2
)
→
P12
-
∗
P12
-
∗
P
.
Proof
.
intros
.
apply
bi
.
wand_intro_r
.
by
rewrite
-
fractional_half
.
Qed
.
Proof
.
intros
.
apply
bi
.
wand_intro_r
.
by
rewrite
-
(
fractional_half
P
)
.
Qed
.
(** Fractional and logical connectives *)
Global
Instance
persistent_fractional
P
:
...
...
theories/bi/monpred.v
View file @
a9031f7f
...
...
@@ -7,7 +7,7 @@ Structure biIndex :=
{
bi_index_type
:
>
Type
;
bi_index_inhabited
:
Inhabited
bi_index_type
;
bi_index_rel
:
SqSubsetEq
bi_index_type
;
bi_index_rel_preorder
:
PreOrder
(
⊑
)
}.
bi_index_rel_preorder
:
PreOrder
(
⊑
@{
bi_index_type
}
)
}.
Existing
Instances
bi_index_inhabited
bi_index_rel
bi_index_rel_preorder
.
(* We may want to instantiate monPred with the reflexivity relation in
...
...
theories/bi/plainly.v
View file @
a9031f7f
...
...
@@ -9,11 +9,11 @@ Notation "■ P" := (plainly P) : bi_scope.
(* Mixins allow us to create instances easily without having to use Program *)
Record
BiPlainlyMixin
(
PROP
:
sbi
)
`
(
Plainly
PROP
)
:
=
{
bi_plainly_mixin_plainly_ne
:
NonExpansive
plainly
;
bi_plainly_mixin_plainly_ne
:
NonExpansive
(
plainly
(
A
:
=
PROP
))
;
bi_plainly_mixin_plainly_mono
P
Q
:
(
P
⊢
Q
)
→
■
P
⊢
■
Q
;
bi_plainly_mixin_plainly_elim_persistently
P
:
■
P
⊢
<
pers
>
P
;
bi_plainly_mixin_plainly_idemp_2
P
:
■
P
⊢
■
■
P
;
bi_plainly_mixin_plainly_mono
(
P
Q
:
PROP
)
:
(
P
⊢
Q
)
→
■
P
⊢
■
Q
;
bi_plainly_mixin_plainly_elim_persistently
(
P
:
PROP
)
:
■
P
⊢
<
pers
>
P
;
bi_plainly_mixin_plainly_idemp_2
(
P
:
PROP
)
:
■
P
⊢
■
■
P
;
bi_plainly_mixin_plainly_forall_2
{
A
}
(
Ψ
:
A
→
PROP
)
:
(
∀
a
,
■
(
Ψ
a
))
⊢
■
(
∀
a
,
Ψ
a
)
;
...
...
@@ -21,17 +21,18 @@ Record BiPlainlyMixin (PROP : sbi) `(Plainly PROP) := {
(* The following two laws are very similar, and indeed they hold not just
for persistently and plainly, but for any modality defined as `M P n x :=
∀ y, R x y → P n y`. *)
bi_plainly_mixin_persistently_impl_plainly
P
Q
:
bi_plainly_mixin_persistently_impl_plainly
(
P
Q
:
PROP
)
:
(
■
P
→
<
pers
>
Q
)
⊢
<
pers
>
(
■
P
→
Q
)
;
bi_plainly_mixin_plainly_impl_plainly
P
Q
:
(
■
P
→
■
Q
)
⊢
■
(
■
P
→
Q
)
;
bi_plainly_mixin_plainly_impl_plainly
(
P
Q
:
PROP
)
:
(
■
P
→
■
Q
)
⊢
■
(
■
P
→
Q
)
;
bi_plainly_mixin_plainly_emp_intro
P
:
P
⊢
■
emp
;
bi_plainly_mixin_plainly_absorb
P
Q
:
■
P
∗
Q
⊢
■
P
;
bi_plainly_mixin_plainly_emp_intro
(
P
:
PROP
)
:
P
⊢
■
emp
;
bi_plainly_mixin_plainly_absorb
(
P
Q
:
PROP
)
:
■
P
∗
Q
⊢
■
P
;
bi_plainly_mixin_prop_ext
P
Q
:
■
((
P
-
∗
Q
)
∧
(
Q
-
∗
P
))
⊢
P
≡
Q
;
bi_plainly_mixin_prop_ext
(
P
Q
:
PROP
)
:
■
((
P
-
∗
Q
)
∧
(
Q
-
∗
P
))
⊢
P
≡
Q
;
bi_plainly_mixin_later_plainly_1
P
:
▷
■
P
⊢
■
▷
P
;
bi_plainly_mixin_later_plainly_2
P
:
■
▷
P
⊢
▷
■
P
;
bi_plainly_mixin_later_plainly_1
(
P
:
PROP
)
:
▷
■
P
⊢
■
▷
P
;
bi_plainly_mixin_later_plainly_2
(
P
:
PROP
)
:
■
▷
P
⊢
▷
■
P
;
}.
Class
BiPlainly
(
PROP
:
sbi
)
:
=
{
...
...
theories/bi/updates.v
View file @
a9031f7f
...
...
@@ -39,7 +39,7 @@ Notation "P ={ E1 , E2 }▷=∗^ n Q" := (P -∗ |={E1,E2}▷=>^n Q)%I : bi_scop
(** Bundled versions *)
(* Mixins allow us to create instances easily without having to use Program *)
Record
BiBUpdMixin
(
PROP
:
bi
)
`
(
BUpd
PROP
)
:
=
{
bi_bupd_mixin_bupd_ne
:
NonExpansive
bupd
;
bi_bupd_mixin_bupd_ne
:
NonExpansive
(
bupd
(
PROP
:
=
PROP
))
;
bi_bupd_mixin_bupd_intro
(
P
:
PROP
)
:
P
==
∗
P
;
bi_bupd_mixin_bupd_mono
(
P
Q
:
PROP
)
:
(
P
⊢
Q
)
→
(|==>
P
)
==
∗
Q
;
bi_bupd_mixin_bupd_trans
(
P
:
PROP
)
:
(|==>
|==>
P
)
==
∗
P
;
...
...
@@ -47,7 +47,7 @@ Record BiBUpdMixin (PROP : bi) `(BUpd PROP) := {
}.
Record
BiFUpdMixin
(
PROP
:
sbi
)
`
(
FUpd
PROP
)
:
=
{
bi_fupd_mixin_fupd_ne
E1
E2
:
NonExpansive
(
fupd
E1
E2
)
;
bi_fupd_mixin_fupd_ne
E1
E2
:
NonExpansive
(
fupd
(
PROP
:
=
PROP
)
E1
E2
)
;
bi_fupd_mixin_fupd_intro_mask
E1
E2
(
P
:
PROP
)
:
E2
⊆
E1
→
P
⊢
|={
E1
,
E2
}=>
|={
E2
,
E1
}=>
P
;
bi_fupd_mixin_except_0_fupd
E1
E2
(
P
:
PROP
)
:
◇
(|={
E1
,
E2
}=>
P
)
={
E1
,
E2
}=
∗
P
;
bi_fupd_mixin_fupd_mono
E1
E2
(
P
Q
:
PROP
)
:
(
P
⊢
Q
)
→
(|={
E1
,
E2
}=>
P
)
⊢
|={
E1
,
E2
}=>
Q
;
...
...
theories/heap_lang/lib/atomic_heap.v
View file @
a9031f7f
...
...
@@ -19,7 +19,7 @@ Class atomic_heap {Σ} `{!heapG Σ} := AtomicHeap {
mapsto_fractional
l
v
:
>
Fractional
(
λ
q
,
mapsto
l
q
v
)
;
mapsto_as_fractional
l
q
v
:
>
AsFractional
(
mapsto
l
q
v
)
(
λ
q
,
mapsto
l
q
v
)
q
;
mapsto_agree
l
q1
q2
v1
v2
:
>
mapsto
l
q1
v1
-
∗
mapsto
l
q2
v2
-
∗
⌜
v1
=
v2
⌝
;
mapsto_agree
l
q1
q2
v1
v2
:
mapsto
l
q1
v1
-
∗
mapsto
l
q2
v2
-
∗
⌜
v1
=
v2
⌝
;
(* -- operation specs -- *)
alloc_spec
(
v
:
val
)
:
{{{
True
}}}
alloc
v
{{{
l
,
RET
#
l
;
mapsto
l
1
v
}}}
;
...
...
theories/proofmode/class_instances_bi.v
View file @
a9031f7f
...
...
@@ -730,7 +730,7 @@ Global Instance into_sep_and_persistent_l P P' Q Q' :
Persistent
P
→
AndIntoSep
P
P'
Q
Q'
→
IntoSep
(
P
∧
Q
)
P'
Q'
.
Proof
.
destruct
2
as
[
P
Q
Q'
|
P
Q
]
;
rewrite
/
IntoSep
.
-
rewrite
-(
from_affinely
Q'
)
-(
affine_affinely
P
)
affinely_and_lr
.
-
rewrite
-(
from_affinely
Q'
Q
)
-(
affine_affinely
P
)
affinely_and_lr
.
by
rewrite
persistent_and_affinely_sep_l_1
.
-
by
rewrite
persistent_and_affinely_sep_l_1
.
Qed
.
...
...
@@ -738,7 +738,7 @@ Global Instance into_sep_and_persistent_r P P' Q Q' :
Persistent
Q
→
AndIntoSep
Q
Q'
P
P'
→
IntoSep
(
P
∧
Q
)
P'
Q'
.
Proof
.
destruct
2
as
[
Q
P
P'
|
Q
P
]
;
rewrite
/
IntoSep
.
-
rewrite
-(
from_affinely
P'
)
-(
affine_affinely
Q
)
-
affinely_and_lr
.
-
rewrite
-(
from_affinely
P'
P
)
-(
affine_affinely
Q
)
-
affinely_and_lr
.
by
rewrite
persistent_and_affinely_sep_r_1
.
-
by
rewrite
persistent_and_affinely_sep_r_1
.
Qed
.
...
...
theories/proofmode/class_instances_sbi.v
View file @
a9031f7f
...
...
@@ -392,7 +392,7 @@ Proof. by rewrite /FromModal. Qed.
Global
Instance
from_modal_plainly_embed
`
{
BiPlainly
PROP
,
BiPlainly
PROP'
,
BiEmbedPlainly
PROP
PROP'
,
!
SbiEmbed
PROP
PROP'
}
`
(
sel
:
A
)
P
Q
:
FromModal
modality_plainly
sel
P
Q
→
FromModal
modality_plainly
sel
⎡
P
⎤
⎡
Q
⎤
|
100
.
FromModal
(
PROP2
:
=
PROP'
)
modality_plainly
sel
⎡
P
⎤
⎡
Q
⎤
|
100
.
Proof
.
rewrite
/
FromModal
/=
=><-.
by
rewrite
embed_plainly
.
Qed
.
(** IntoInternalEq *)
...
...
theories/proofmode/classes.v
View file @
a9031f7f
...
...
@@ -285,7 +285,7 @@ Proof. done. Qed.
Class
Frame
{
PROP
:
bi
}
(
p
:
bool
)
(
R
P
Q
:
PROP
)
:
=
frame
:
□
?p
R
∗
Q
⊢
P
.
Arguments
Frame
{
_
}
_
_
%
I
_
%
I
_
%
I
.
Arguments
frame
{
_
_
}
_
%
I
_
%
I
_
%
I
{
_
}.
Arguments
frame
{
_
}
_
_
%
I
_
%
I
_
%
I
{
_
}.
Hint
Mode
Frame
+
+
!
!
-
:
typeclass_instances
.
(* The boolean [progress] indicates whether actual framing has been performed.
...
...
theories/proofmode/coq_tactics.v
View file @
a9031f7f
...
...
@@ -109,7 +109,7 @@ Qed.
Lemma
tac_pure_intro
Δ
Q
φ
af
:
env_spatial_is_nil
Δ
=
af
→
FromPure
af
Q
φ
→
φ
→
envs_entails
Δ
Q
.
Proof
.
intros
???.
rewrite
envs_entails_eq
-(
from_pure
_
Q
).
destruct
af
.
intros
???.
rewrite
envs_entails_eq
-(
from_pure
af
Q
).
destruct
af
.
-
rewrite
env_spatial_is_nil_intuitionistically
//=
/
bi_intuitionistically
.
f_equiv
.
by
apply
pure_intro
.
-
by
apply
pure_intro
.
...
...
@@ -145,7 +145,7 @@ Lemma tac_intuitionistic Δ Δ' i p P P' Q :
Proof
.
rewrite
envs_entails_eq
=>??
HPQ
?
HQ
.
rewrite
envs_replace_singleton_sound
//=.
destruct
p
;
simpl
;
rewrite
/
bi_intuitionistically
.
-
by
rewrite
-(
into_persistent
_
P
)
/=
wand_elim_r
.
-
by
rewrite
-(
into_persistent
true
P
)
/=
wand_elim_r
.
-
destruct
HPQ
.
+
rewrite
-(
affine_affinely
P
)
(
_
:
P
=
<
pers
>
?false
P
)%
I
//
(
into_persistent
_
P
)
wand_elim_r
//.
...
...
@@ -165,10 +165,10 @@ Proof.
rewrite
/
FromImpl
envs_entails_eq
=>
<-
???
<-.
destruct
(
env_spatial_is_nil
Δ
)
eqn
:
?.
-
rewrite
(
env_spatial_is_nil_intuitionistically
Δ
)
//
;
simpl
.
apply
impl_intro_l
.
rewrite
envs_app_singleton_sound
//
;
simpl
.
rewrite
-(
from_affinely
P'
)
-
affinely_and_lr
.
rewrite
-(
from_affinely
P'
P
)
-
affinely_and_lr
.
by
rewrite
persistently_and_intuitionistically_sep_r
intuitionistically_elim
wand_elim_r
.
-
apply
impl_intro_l
.
rewrite
envs_app_singleton_sound
//
;
simpl
.
by
rewrite
-(
from_affinely
P'
)
persistent_and_affinely_sep_l_1
wand_elim_r
.
by
rewrite
-(
from_affinely
P'
P
)
persistent_and_affinely_sep_l_1
wand_elim_r
.
Qed
.
Lemma
tac_impl_intro_intuitionistic
Δ
Δ
'
i
P
P'
Q
R
:
FromImpl
R
P
Q
→
...
...
@@ -251,7 +251,7 @@ Proof.
destruct
(
envs_app
_
_
_
)
eqn
:
?
;
simplify_eq
/=.
rewrite
envs_lookup_sound
//
envs_split_sound
//.
rewrite
(
envs_app_singleton_sound
Δ
2
)
//
;
simpl
.
rewrite
HP1
into_wand
/=
-(
add_modal
P1'
P1
Q
).
cancel
[
P1'
].
rewrite
HP1
(
into_wand
q
false
)
/=
-(
add_modal
P1'
P1
Q
).
cancel
[
P1'
].
apply
wand_intro_l
.
by
rewrite
assoc
!
wand_elim_r
.
Qed
.
...
...
@@ -272,7 +272,7 @@ Lemma tac_specialize_frame Δ Δ' j q R P1 P2 P1' Q Q' :
Proof
.
rewrite
envs_entails_eq
.
intros
[?
->]%
envs_lookup_delete_Some
??
HPQ
->.
rewrite
envs_lookup_sound
//.
rewrite
HPQ
-
lock
.
rewrite
into_wand
-{
2
}(
add_modal
P1'
P1
Q
).
cancel
[
P1'
].
rewrite
(
into_wand
q
false
)
-{
2
}(
add_modal
P1'
P1
Q
).
cancel
[
P1'
].
apply
wand_intro_l
.
by
rewrite
assoc
!
wand_elim_r
.
Qed
.
...
...
@@ -284,7 +284,8 @@ Lemma tac_specialize_assert_pure Δ Δ' j q R P1 P2 φ Q :
φ
→
envs_entails
Δ
'
Q
→
envs_entails
Δ
Q
.
Proof
.
rewrite
envs_entails_eq
=>
?????
<-.
rewrite
envs_simple_replace_singleton_sound
//=.
rewrite
-
intuitionistically_if_idemp
into_wand
/=
-(
from_pure
_
P1
)
/
bi_intuitionistically
.
rewrite
-
intuitionistically_if_idemp
(
into_wand
q
true
)
/=.
rewrite
-(
from_pure
true
P1
)
/
bi_intuitionistically
.
rewrite
pure_True
//=
persistently_affinely_elim
persistently_pure
affinely_True_emp
affinely_emp
.
by
rewrite
emp_wand
wand_elim_r
.
...
...
@@ -302,11 +303,11 @@ Proof.
rewrite
envs_lookup_sound
//.
rewrite
-(
idemp
bi_and
(
of_envs
(
envs_delete
_
_
_
_
))).
rewrite
{
2
}
envs_simple_replace_singleton_sound'
//
;
simpl
.
rewrite
{
1
}
HP1
(
into_absorbingly
P1'
)
(
persistent_persistently_2
P1
).
rewrite
{
1
}
HP1
(
into_absorbingly
P1'
P1
)
(
persistent_persistently_2
P1
).
rewrite
absorbingly_elim_persistently
persistently_and_intuitionistically_sep_l
assoc
.
rewrite
-
intuitionistically_if_idemp
-
intuitionistically_idemp
.
rewrite
(
intuitionistically_intuitionistically_if
q
).
by
rewrite
intuitionistically_if_sep_2
into_wand
wand_elim_l
wand_elim_r
.
by
rewrite
intuitionistically_if_sep_2
(
into_wand
q
true
)
wand_elim_l
wand_elim_r
.
Qed
.
Lemma
tac_specialize_intuitionistic_helper
Δ
Δ
''
j
q
P
R
R'
Q
:
...
...
@@ -402,7 +403,7 @@ Lemma tac_apply Δ Δ' i p R P1 P2 :
envs_entails
Δ
'
P1
→
envs_entails
Δ
P2
.
Proof
.
rewrite
envs_entails_eq
=>
??
HP1
.
rewrite
envs_lookup_delete_sound
//.
by
rewrite
into_wand
/=
HP1
wand_elim_l
.
by
rewrite
(
into_wand
p
false
)
/=
HP1
wand_elim_l
.
Qed
.
(** * Conjunction splitting *)
...
...
@@ -487,7 +488,7 @@ Qed.
Lemma
tac_frame_pure
Δ
(
φ
:
Prop
)
P
Q
:
φ
→
Frame
true
⌜φ⌝
P
Q
→
envs_entails
Δ
Q
→
envs_entails
Δ
P
.
Proof
.
rewrite
envs_entails_eq
=>
??
->.
rewrite
-(
frame
⌜φ⌝
P
)
/=.
rewrite
envs_entails_eq
=>
??
->.
rewrite
-(
frame
true
⌜φ⌝
P
)
/=.
rewrite
-
persistently_and_intuitionistically_sep_l
persistently_pure
.
auto
using
and_intro
,
pure_intro
.
Qed
.
...
...
@@ -498,7 +499,7 @@ Lemma tac_frame Δ Δ' i p R P Q :
envs_entails
Δ
'
Q
→
envs_entails
Δ
P
.
Proof
.
rewrite
envs_entails_eq
.
intros
[?
->]%
envs_lookup_delete_Some
?
HQ
.
rewrite
(
envs_lookup_sound'
_
false
)
//.
by
rewrite
-(
frame
R
P
)
HQ
.
rewrite
(
envs_lookup_sound'
_
false
)
//.
by
rewrite
-(
frame
p
R
P
)
HQ
.
Qed
.
(** * Disjunction *)
...
...
theories/proofmode/frame_instances.v
View file @
a9031f7f
...
...
@@ -33,10 +33,10 @@ Proof.
Qed
.
Global
Instance
make_embed_pure
`
{
BiEmbed
PROP
PROP'
}
φ
:
KnownMakeEmbed
⌜φ⌝
⌜φ⌝
.
KnownMakeEmbed
(
PROP
:
=
PROP
)
⌜φ⌝
⌜φ⌝
.
Proof
.
apply
embed_pure
.
Qed
.
Global
Instance
make_embed_emp
`
{
BiEmbedEmp
PROP
PROP'
}
:
KnownMakeEmbed
emp
emp
.
KnownMakeEmbed
(
PROP
:
=
PROP
)
emp
emp
.
Proof
.
apply
embed_emp
.
Qed
.
Global
Instance
make_embed_default
`
{
BiEmbed
PROP
PROP'
}
P
:
MakeEmbed
P
⎡
P
⎤
|
100
.
...
...
Write
Preview
Markdown
is supported
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