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
Rodolphe Lepigre
Iris
Commits
b2c912d8
Commit
b2c912d8
authored
Feb 24, 2016
by
Robbert Krebbers
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Make valid a primitive instead of derived notion.
This way it behaves better for discrete CMRAs.
parent
73959011
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
86 additions
and
50 deletions
+86
-50
algebra/agree.v
algebra/agree.v
+3
-0
algebra/auth.v
algebra/auth.v
+12
-2
algebra/cmra.v
algebra/cmra.v
+28
-15
algebra/excl.v
algebra/excl.v
+3
-0
algebra/fin_maps.v
algebra/fin_maps.v
+10
-8
algebra/iprod.v
algebra/iprod.v
+6
-2
algebra/option.v
algebra/option.v
+4
-1
algebra/sts.v
algebra/sts.v
+4
-8
heap_lang/heap.v
heap_lang/heap.v
+3
-3
program_logic/resources.v
program_logic/resources.v
+10
-6
program_logic/sts.v
program_logic/sts.v
+3
-5
No files found.
algebra/agree.v
View file @
b2c912d8
...
@@ -16,9 +16,12 @@ Context {A : cofeT}.
...
@@ -16,9 +16,12 @@ Context {A : cofeT}.
Instance
agree_validN
:
ValidN
(
agree
A
)
:
=
λ
n
x
,
Instance
agree_validN
:
ValidN
(
agree
A
)
:
=
λ
n
x
,
agree_is_valid
x
n
∧
∀
n'
,
n'
≤
n
→
x
n'
≡
{
n'
}
≡
x
n
.
agree_is_valid
x
n
∧
∀
n'
,
n'
≤
n
→
x
n'
≡
{
n'
}
≡
x
n
.
Instance
agree_valid
:
Valid
(
agree
A
)
:
=
λ
x
,
∀
n
,
✓
{
n
}
x
.
Lemma
agree_valid_le
n
n'
(
x
:
agree
A
)
:
Lemma
agree_valid_le
n
n'
(
x
:
agree
A
)
:
agree_is_valid
x
n
→
n'
≤
n
→
agree_is_valid
x
n'
.
agree_is_valid
x
n
→
n'
≤
n
→
agree_is_valid
x
n'
.
Proof
.
induction
2
;
eauto
using
agree_valid_S
.
Qed
.
Proof
.
induction
2
;
eauto
using
agree_valid_S
.
Qed
.
Instance
agree_equiv
:
Equiv
(
agree
A
)
:
=
λ
x
y
,
Instance
agree_equiv
:
Equiv
(
agree
A
)
:
=
λ
x
y
,
(
∀
n
,
agree_is_valid
x
n
↔
agree_is_valid
y
n
)
∧
(
∀
n
,
agree_is_valid
x
n
↔
agree_is_valid
y
n
)
∧
(
∀
n
,
agree_is_valid
x
n
→
x
n
≡
{
n
}
≡
y
n
).
(
∀
n
,
agree_is_valid
x
n
→
x
n
≡
{
n
}
≡
y
n
).
...
...
algebra/auth.v
View file @
b2c912d8
From
algebra
Require
Export
excl
.
From
algebra
Require
Export
excl
.
From
algebra
Require
Import
functor
upred
.
From
algebra
Require
Import
functor
upred
.
Local
Arguments
valid
_
_
!
_
/.
Local
Arguments
validN
_
_
_
!
_
/.
Local
Arguments
validN
_
_
_
!
_
/.
Record
auth
(
A
:
Type
)
:
Type
:
=
Auth
{
authoritative
:
excl
A
;
own
:
A
}.
Record
auth
(
A
:
Type
)
:
Type
:
=
Auth
{
authoritative
:
excl
A
;
own
:
A
}.
...
@@ -66,6 +67,13 @@ Implicit Types a b : A.
...
@@ -66,6 +67,13 @@ Implicit Types a b : A.
Implicit
Types
x
y
:
auth
A
.
Implicit
Types
x
y
:
auth
A
.
Global
Instance
auth_empty
`
{
Empty
A
}
:
Empty
(
auth
A
)
:
=
Auth
∅
∅
.
Global
Instance
auth_empty
`
{
Empty
A
}
:
Empty
(
auth
A
)
:
=
Auth
∅
∅
.
Instance
auth_valid
:
Valid
(
auth
A
)
:
=
λ
x
,
match
authoritative
x
with
|
Excl
a
=>
own
x
≼
a
∧
✓
a
|
ExclUnit
=>
✓
own
x
|
ExclBot
=>
False
end
.
Global
Arguments
auth_valid
!
_
/.
Instance
auth_validN
:
ValidN
(
auth
A
)
:
=
λ
n
x
,
Instance
auth_validN
:
ValidN
(
auth
A
)
:
=
λ
n
x
,
match
authoritative
x
with
match
authoritative
x
with
|
Excl
a
=>
own
x
≼
{
n
}
a
∧
✓
{
n
}
a
|
Excl
a
=>
own
x
≼
{
n
}
a
∧
✓
{
n
}
a
...
@@ -105,6 +113,8 @@ Proof.
...
@@ -105,6 +113,8 @@ Proof.
destruct
Hx
;
intros
?
;
cofe_subst
;
auto
.
destruct
Hx
;
intros
?
;
cofe_subst
;
auto
.
-
by
intros
n
x1
x2
[
Hx
Hx'
]
y1
y2
[
Hy
Hy'
]
;
-
by
intros
n
x1
x2
[
Hx
Hx'
]
y1
y2
[
Hy
Hy'
]
;
split
;
simpl
;
rewrite
?Hy
?Hy'
?Hx
?Hx'
.
split
;
simpl
;
rewrite
?Hy
?Hy'
?Hx
?Hx'
.
-
intros
[[]
?]
;
rewrite
/=
?cmra_included_includedN
?cmra_valid_validN
;
naive_solver
eauto
using
O
.
-
intros
n
[[]
?]
?
;
naive_solver
eauto
using
cmra_includedN_S
,
cmra_validN_S
.
-
intros
n
[[]
?]
?
;
naive_solver
eauto
using
cmra_includedN_S
,
cmra_validN_S
.
-
by
split
;
simpl
;
rewrite
assoc
.
-
by
split
;
simpl
;
rewrite
assoc
.
-
by
split
;
simpl
;
rewrite
comm
.
-
by
split
;
simpl
;
rewrite
comm
.
...
@@ -169,7 +179,7 @@ Lemma auth_local_update L `{!LocalUpdate Lv L} a a' :
...
@@ -169,7 +179,7 @@ Lemma auth_local_update L `{!LocalUpdate Lv L} a a' :
Lv
a
→
✓
L
a'
→
Lv
a
→
✓
L
a'
→
●
a'
⋅
◯
a
~~>
●
L
a'
⋅
◯
L
a
.
●
a'
⋅
◯
a
~~>
●
L
a'
⋅
◯
L
a
.
Proof
.
Proof
.
intros
.
apply
auth_update
=>
n
af
?
EQ
;
split
;
last
done
.
intros
.
apply
auth_update
=>
n
af
?
EQ
;
split
;
last
by
apply
cmra_valid_validN
.
by
rewrite
EQ
(
local_updateN
L
)
//
-
EQ
.
by
rewrite
EQ
(
local_updateN
L
)
//
-
EQ
.
Qed
.
Qed
.
...
@@ -188,7 +198,7 @@ Lemma auth_local_update_l L `{!LocalUpdate Lv L} a a' :
...
@@ -188,7 +198,7 @@ Lemma auth_local_update_l L `{!LocalUpdate Lv L} a a' :
Lv
a
→
✓
(
L
a
⋅
a'
)
→
Lv
a
→
✓
(
L
a
⋅
a'
)
→
●
(
a
⋅
a'
)
⋅
◯
a
~~>
●
(
L
a
⋅
a'
)
⋅
◯
L
a
.
●
(
a
⋅
a'
)
⋅
◯
a
~~>
●
(
L
a
⋅
a'
)
⋅
◯
L
a
.
Proof
.
Proof
.
intros
.
apply
auth_update
=>
n
af
?
EQ
;
split
;
last
done
.
intros
.
apply
auth_update
=>
n
af
?
EQ
;
split
;
last
by
apply
cmra_valid_validN
.
by
rewrite
-(
local_updateN
L
)
//
EQ
-(
local_updateN
L
)
//
-
EQ
.
by
rewrite
-(
local_updateN
L
)
//
EQ
-(
local_updateN
L
)
//
-
EQ
.
Qed
.
Qed
.
...
...
algebra/cmra.v
View file @
b2c912d8
...
@@ -26,7 +26,6 @@ Notation "✓{ n } x" := (validN n x)
...
@@ -26,7 +26,6 @@ Notation "✓{ n } x" := (validN n x)
Class
Valid
(
A
:
Type
)
:
=
valid
:
A
→
Prop
.
Class
Valid
(
A
:
Type
)
:
=
valid
:
A
→
Prop
.
Instance
:
Params
(@
valid
)
2
.
Instance
:
Params
(@
valid
)
2
.
Notation
"✓ x"
:
=
(
valid
x
)
(
at
level
20
)
:
C_scope
.
Notation
"✓ x"
:
=
(
valid
x
)
(
at
level
20
)
:
C_scope
.
Instance
validN_valid
`
{
ValidN
A
}
:
Valid
A
:
=
λ
x
,
∀
n
,
✓
{
n
}
x
.
Definition
includedN
`
{
Dist
A
,
Op
A
}
(
n
:
nat
)
(
x
y
:
A
)
:
=
∃
z
,
y
≡
{
n
}
≡
x
⋅
z
.
Definition
includedN
`
{
Dist
A
,
Op
A
}
(
n
:
nat
)
(
x
y
:
A
)
:
=
∃
z
,
y
≡
{
n
}
≡
x
⋅
z
.
Notation
"x ≼{ n } y"
:
=
(
includedN
n
x
y
)
Notation
"x ≼{ n } y"
:
=
(
includedN
n
x
y
)
...
@@ -34,13 +33,15 @@ Notation "x ≼{ n } y" := (includedN n x y)
...
@@ -34,13 +33,15 @@ Notation "x ≼{ n } y" := (includedN n x y)
Instance
:
Params
(@
includedN
)
4
.
Instance
:
Params
(@
includedN
)
4
.
Hint
Extern
0
(
_
≼
{
_
}
_
)
=>
reflexivity
.
Hint
Extern
0
(
_
≼
{
_
}
_
)
=>
reflexivity
.
Record
CMRAMixin
A
`
{
Dist
A
,
Equiv
A
,
Unit
A
,
Op
A
,
ValidN
A
,
Minus
A
}
:
=
{
Record
CMRAMixin
A
`
{
Dist
A
,
Equiv
A
,
Unit
A
,
Op
A
,
Valid
A
,
ValidN
A
,
Minus
A
}
:
=
{
(* setoids *)
(* setoids *)
mixin_cmra_op_ne
n
(
x
:
A
)
:
Proper
(
dist
n
==>
dist
n
)
(
op
x
)
;
mixin_cmra_op_ne
n
(
x
:
A
)
:
Proper
(
dist
n
==>
dist
n
)
(
op
x
)
;
mixin_cmra_unit_ne
n
:
Proper
(
dist
n
==>
dist
n
)
unit
;
mixin_cmra_unit_ne
n
:
Proper
(
dist
n
==>
dist
n
)
unit
;
mixin_cmra_validN_ne
n
:
Proper
(
dist
n
==>
impl
)
(
validN
n
)
;
mixin_cmra_validN_ne
n
:
Proper
(
dist
n
==>
impl
)
(
validN
n
)
;
mixin_cmra_minus_ne
n
:
Proper
(
dist
n
==>
dist
n
==>
dist
n
)
minus
;
mixin_cmra_minus_ne
n
:
Proper
(
dist
n
==>
dist
n
==>
dist
n
)
minus
;
(* valid *)
(* valid *)
mixin_cmra_valid_validN
x
:
✓
x
↔
∀
n
,
✓
{
n
}
x
;
mixin_cmra_validN_S
n
x
:
✓
{
S
n
}
x
→
✓
{
n
}
x
;
mixin_cmra_validN_S
n
x
:
✓
{
S
n
}
x
→
✓
{
n
}
x
;
(* monoid *)
(* monoid *)
mixin_cmra_assoc
:
Assoc
(
≡
)
(
⋅
)
;
mixin_cmra_assoc
:
Assoc
(
≡
)
(
⋅
)
;
...
@@ -63,24 +64,26 @@ Structure cmraT := CMRAT {
...
@@ -63,24 +64,26 @@ Structure cmraT := CMRAT {
cmra_compl
:
Compl
cmra_car
;
cmra_compl
:
Compl
cmra_car
;
cmra_unit
:
Unit
cmra_car
;
cmra_unit
:
Unit
cmra_car
;
cmra_op
:
Op
cmra_car
;
cmra_op
:
Op
cmra_car
;
cmra_valid
:
Valid
cmra_car
;
cmra_validN
:
ValidN
cmra_car
;
cmra_validN
:
ValidN
cmra_car
;
cmra_minus
:
Minus
cmra_car
;
cmra_minus
:
Minus
cmra_car
;
cmra_cofe_mixin
:
CofeMixin
cmra_car
;
cmra_cofe_mixin
:
CofeMixin
cmra_car
;
cmra_mixin
:
CMRAMixin
cmra_car
cmra_mixin
:
CMRAMixin
cmra_car
}.
}.
Arguments
CMRAT
{
_
_
_
_
_
_
_
_
}
_
_
.
Arguments
CMRAT
{
_
_
_
_
_
_
_
_
_
}
_
_
.
Arguments
cmra_car
:
simpl
never
.
Arguments
cmra_car
:
simpl
never
.
Arguments
cmra_equiv
:
simpl
never
.
Arguments
cmra_equiv
:
simpl
never
.
Arguments
cmra_dist
:
simpl
never
.
Arguments
cmra_dist
:
simpl
never
.
Arguments
cmra_compl
:
simpl
never
.
Arguments
cmra_compl
:
simpl
never
.
Arguments
cmra_unit
:
simpl
never
.
Arguments
cmra_unit
:
simpl
never
.
Arguments
cmra_op
:
simpl
never
.
Arguments
cmra_op
:
simpl
never
.
Arguments
cmra_valid
:
simpl
never
.
Arguments
cmra_validN
:
simpl
never
.
Arguments
cmra_validN
:
simpl
never
.
Arguments
cmra_minus
:
simpl
never
.
Arguments
cmra_minus
:
simpl
never
.
Arguments
cmra_cofe_mixin
:
simpl
never
.
Arguments
cmra_cofe_mixin
:
simpl
never
.
Arguments
cmra_mixin
:
simpl
never
.
Arguments
cmra_mixin
:
simpl
never
.
Add
Printing
Constructor
cmraT
.
Add
Printing
Constructor
cmraT
.
Existing
Instances
cmra_unit
cmra_op
cmra_validN
cmra_minus
.
Existing
Instances
cmra_unit
cmra_op
cmra_valid
cmra_valid
N
cmra_minus
.
Coercion
cmra_cofeC
(
A
:
cmraT
)
:
cofeT
:
=
CofeT
(
cmra_cofe_mixin
A
).
Coercion
cmra_cofeC
(
A
:
cmraT
)
:
cofeT
:
=
CofeT
(
cmra_cofe_mixin
A
).
Canonical
Structure
cmra_cofeC
.
Canonical
Structure
cmra_cofeC
.
...
@@ -97,6 +100,8 @@ Section cmra_mixin.
...
@@ -97,6 +100,8 @@ Section cmra_mixin.
Global
Instance
cmra_minus_ne
n
:
Global
Instance
cmra_minus_ne
n
:
Proper
(
dist
n
==>
dist
n
==>
dist
n
)
(@
minus
A
_
).
Proper
(
dist
n
==>
dist
n
==>
dist
n
)
(@
minus
A
_
).
Proof
.
apply
(
mixin_cmra_minus_ne
_
(
cmra_mixin
A
)).
Qed
.
Proof
.
apply
(
mixin_cmra_minus_ne
_
(
cmra_mixin
A
)).
Qed
.
Lemma
cmra_valid_validN
x
:
✓
x
↔
∀
n
,
✓
{
n
}
x
.
Proof
.
apply
(
mixin_cmra_valid_validN
_
(
cmra_mixin
A
)).
Qed
.
Lemma
cmra_validN_S
n
x
:
✓
{
S
n
}
x
→
✓
{
n
}
x
.
Lemma
cmra_validN_S
n
x
:
✓
{
S
n
}
x
→
✓
{
n
}
x
.
Proof
.
apply
(
mixin_cmra_validN_S
_
(
cmra_mixin
A
)).
Qed
.
Proof
.
apply
(
mixin_cmra_validN_S
_
(
cmra_mixin
A
)).
Qed
.
Global
Instance
cmra_assoc
:
Assoc
(
≡
)
(@
op
A
_
).
Global
Instance
cmra_assoc
:
Assoc
(
≡
)
(@
op
A
_
).
...
@@ -178,7 +183,10 @@ Global Instance cmra_minus_proper : Proper ((≡) ==> (≡) ==> (≡)) (@minus A
...
@@ -178,7 +183,10 @@ Global Instance cmra_minus_proper : Proper ((≡) ==> (≡) ==> (≡)) (@minus A
Proof
.
apply
(
ne_proper_2
_
).
Qed
.
Proof
.
apply
(
ne_proper_2
_
).
Qed
.
Global
Instance
cmra_valid_proper
:
Proper
((
≡
)
==>
iff
)
(@
valid
A
_
).
Global
Instance
cmra_valid_proper
:
Proper
((
≡
)
==>
iff
)
(@
valid
A
_
).
Proof
.
by
intros
x
y
Hxy
;
split
;
intros
?
n
;
[
rewrite
-
Hxy
|
rewrite
Hxy
].
Qed
.
Proof
.
intros
x
y
Hxy
;
rewrite
!
cmra_valid_validN
.
by
split
=>
?
n
;
[
rewrite
-
Hxy
|
rewrite
Hxy
].
Qed
.
Global
Instance
cmra_includedN_ne
n
:
Global
Instance
cmra_includedN_ne
n
:
Proper
(
dist
n
==>
dist
n
==>
iff
)
(@
includedN
A
_
_
n
)
|
1
.
Proper
(
dist
n
==>
dist
n
==>
iff
)
(@
includedN
A
_
_
n
)
|
1
.
Proof
.
Proof
.
...
@@ -210,8 +218,6 @@ Proof.
...
@@ -210,8 +218,6 @@ Proof.
Qed
.
Qed
.
(** ** Validity *)
(** ** Validity *)
Lemma
cmra_valid_validN
x
:
✓
x
↔
∀
n
,
✓
{
n
}
x
.
Proof
.
done
.
Qed
.
Lemma
cmra_validN_le
n
n'
x
:
✓
{
n
}
x
→
n'
≤
n
→
✓
{
n'
}
x
.
Lemma
cmra_validN_le
n
n'
x
:
✓
{
n
}
x
→
n'
≤
n
→
✓
{
n'
}
x
.
Proof
.
induction
2
;
eauto
using
cmra_validN_S
.
Qed
.
Proof
.
induction
2
;
eauto
using
cmra_validN_S
.
Qed
.
Lemma
cmra_valid_op_l
x
y
:
✓
(
x
⋅
y
)
→
✓
x
.
Lemma
cmra_valid_op_l
x
y
:
✓
(
x
⋅
y
)
→
✓
x
.
...
@@ -309,13 +315,15 @@ Lemma cmra_op_timeless x1 x2 :
...
@@ -309,13 +315,15 @@ Lemma cmra_op_timeless x1 x2 :
Proof
.
Proof
.
intros
???
z
Hz
.
intros
???
z
Hz
.
destruct
(
cmra_extend
0
z
x1
x2
)
as
([
y1
y2
]&
Hz'
&?&?)
;
auto
;
simpl
in
*.
destruct
(
cmra_extend
0
z
x1
x2
)
as
([
y1
y2
]&
Hz'
&?&?)
;
auto
;
simpl
in
*.
{
by
rewrite
-
?Hz
.
}
{
rewrite
-
?Hz
.
by
apply
cmra_valid_validN
.
}
by
rewrite
Hz'
(
timeless
x1
y1
)
//
(
timeless
x2
y2
).
by
rewrite
Hz'
(
timeless
x1
y1
)
//
(
timeless
x2
y2
).
Qed
.
Qed
.
(** ** RAs with an empty element *)
(** ** RAs with an empty element *)
Section
identity
.
Section
identity
.
Context
`
{
Empty
A
,
!
CMRAIdentity
A
}.
Context
`
{
Empty
A
,
!
CMRAIdentity
A
}.
Lemma
cmra_empty_validN
n
:
✓
{
n
}
∅
.
Proof
.
apply
cmra_valid_validN
,
cmra_empty_valid
.
Qed
.
Lemma
cmra_empty_leastN
n
x
:
∅
≼
{
n
}
x
.
Lemma
cmra_empty_leastN
n
x
:
∅
≼
{
n
}
x
.
Proof
.
by
exists
x
;
rewrite
left_id
.
Qed
.
Proof
.
by
exists
x
;
rewrite
left_id
.
Qed
.
Lemma
cmra_empty_least
x
:
∅
≼
x
.
Lemma
cmra_empty_least
x
:
∅
≼
x
.
...
@@ -333,7 +341,9 @@ Proof. intros; apply (ne_proper _). Qed.
...
@@ -333,7 +341,9 @@ Proof. intros; apply (ne_proper _). Qed.
Lemma
local_update
L
`
{!
LocalUpdate
Lv
L
}
x
y
:
Lemma
local_update
L
`
{!
LocalUpdate
Lv
L
}
x
y
:
Lv
x
→
✓
(
x
⋅
y
)
→
L
(
x
⋅
y
)
≡
L
x
⋅
y
.
Lv
x
→
✓
(
x
⋅
y
)
→
L
(
x
⋅
y
)
≡
L
x
⋅
y
.
Proof
.
by
rewrite
equiv_dist
=>??
n
;
apply
(
local_updateN
L
).
Qed
.
Proof
.
by
rewrite
cmra_valid_validN
equiv_dist
=>??
n
;
apply
(
local_updateN
L
).
Qed
.
Global
Instance
local_update_op
x
:
LocalUpdate
(
λ
_
,
True
)
(
op
x
).
Global
Instance
local_update_op
x
:
LocalUpdate
(
λ
_
,
True
)
(
op
x
).
Proof
.
split
.
apply
_
.
by
intros
n
y1
y2
_
_;
rewrite
assoc
.
Qed
.
Proof
.
split
.
apply
_
.
by
intros
n
y1
y2
_
_;
rewrite
assoc
.
Qed
.
...
@@ -464,15 +474,16 @@ Class RA A `{Equiv A, Unit A, Op A, Valid A, Minus A} := {
...
@@ -464,15 +474,16 @@ Class RA A `{Equiv A, Unit A, Op A, Valid A, Minus A} := {
Section
discrete
.
Section
discrete
.
Context
{
A
:
cofeT
}
`
{
∀
x
:
A
,
Timeless
x
}.
Context
{
A
:
cofeT
}
`
{
∀
x
:
A
,
Timeless
x
}.
Context
{
v
:
Valid
A
}
`
{
Unit
A
,
Op
A
,
Minus
A
}
(
ra
:
RA
A
).
Context
`
{
Unit
A
,
Op
A
,
Valid
A
,
Minus
A
}
(
ra
:
RA
A
).
Instance
discrete_validN
:
ValidN
A
:
=
λ
n
x
,
✓
x
.
Instance
discrete_validN
:
ValidN
A
:
=
λ
n
x
,
✓
x
.
Definition
discrete_cmra_mixin
:
CMRAMixin
A
.
Definition
discrete_cmra_mixin
:
CMRAMixin
A
.
Proof
.
Proof
.
destruct
ra
;
split
;
unfold
Proper
,
respectful
,
includedN
;
destruct
ra
;
split
;
unfold
Proper
,
respectful
,
includedN
;
try
setoid_rewrite
<-(
timeless_iff
_
_
)
;
try
done
.
try
setoid_rewrite
<-(
timeless_iff
_
_
)
;
try
done
.
intros
n
x
y1
y2
??
;
exists
(
y1
,
y2
)
;
split_and
?
;
auto
.
-
intros
x
;
split
;
first
done
.
by
move
=>
/(
_
0
).
apply
(
timeless
_
),
dist_le
with
n
;
auto
with
lia
.
-
intros
n
x
y1
y2
??
;
exists
(
y1
,
y2
)
;
split_and
?
;
auto
.
apply
(
timeless
_
),
dist_le
with
n
;
auto
with
lia
.
Qed
.
Qed
.
Definition
discreteRA
:
cmraT
:
=
CMRAT
(
cofe_mixin
A
)
discrete_cmra_mixin
.
Definition
discreteRA
:
cmraT
:
=
CMRAT
(
cofe_mixin
A
)
discrete_cmra_mixin
.
Lemma
discrete_updateP
(
x
:
discreteRA
)
(
P
:
A
→
Prop
)
:
Lemma
discrete_updateP
(
x
:
discreteRA
)
(
P
:
A
→
Prop
)
:
...
@@ -481,8 +492,6 @@ Section discrete.
...
@@ -481,8 +492,6 @@ Section discrete.
Lemma
discrete_update
(
x
y
:
discreteRA
)
:
Lemma
discrete_update
(
x
y
:
discreteRA
)
:
(
∀
z
,
✓
(
x
⋅
z
)
→
✓
(
y
⋅
z
))
→
x
~~>
y
.
(
∀
z
,
✓
(
x
⋅
z
)
→
✓
(
y
⋅
z
))
→
x
~~>
y
.
Proof
.
intros
Hvalid
n
z
;
apply
Hvalid
.
Qed
.
Proof
.
intros
Hvalid
n
z
;
apply
Hvalid
.
Qed
.
Lemma
discrete_valid
(
x
:
discreteRA
)
:
v
x
→
validN_valid
x
.
Proof
.
move
=>
Hx
n
.
exact
Hx
.
Qed
.
End
discrete
.
End
discrete
.
(** ** CMRA for the unit type *)
(** ** CMRA for the unit type *)
...
@@ -497,7 +506,7 @@ Section unit.
...
@@ -497,7 +506,7 @@ Section unit.
Canonical
Structure
unitRA
:
cmraT
:
=
Canonical
Structure
unitRA
:
cmraT
:
=
Eval
cbv
[
unitC
discreteRA
cofe_car
]
in
discreteRA
unit_ra
.
Eval
cbv
[
unitC
discreteRA
cofe_car
]
in
discreteRA
unit_ra
.
Global
Instance
unit_cmra_identity
:
CMRAIdentity
unitRA
.
Global
Instance
unit_cmra_identity
:
CMRAIdentity
unitRA
.
Proof
.
by
split
;
intros
[]
.
Qed
.
Proof
.
by
split
.
Qed
.
End
unit
.
End
unit
.
(** ** Product *)
(** ** Product *)
...
@@ -506,6 +515,7 @@ Section prod.
...
@@ -506,6 +515,7 @@ Section prod.
Instance
prod_op
:
Op
(
A
*
B
)
:
=
λ
x
y
,
(
x
.
1
⋅
y
.
1
,
x
.
2
⋅
y
.
2
).
Instance
prod_op
:
Op
(
A
*
B
)
:
=
λ
x
y
,
(
x
.
1
⋅
y
.
1
,
x
.
2
⋅
y
.
2
).
Global
Instance
prod_empty
`
{
Empty
A
,
Empty
B
}
:
Empty
(
A
*
B
)
:
=
(
∅
,
∅
).
Global
Instance
prod_empty
`
{
Empty
A
,
Empty
B
}
:
Empty
(
A
*
B
)
:
=
(
∅
,
∅
).
Instance
prod_unit
:
Unit
(
A
*
B
)
:
=
λ
x
,
(
unit
(
x
.
1
),
unit
(
x
.
2
)).
Instance
prod_unit
:
Unit
(
A
*
B
)
:
=
λ
x
,
(
unit
(
x
.
1
),
unit
(
x
.
2
)).
Instance
prod_valid
:
Valid
(
A
*
B
)
:
=
λ
x
,
✓
x
.
1
∧
✓
x
.
2
.
Instance
prod_validN
:
ValidN
(
A
*
B
)
:
=
λ
n
x
,
✓
{
n
}
x
.
1
∧
✓
{
n
}
x
.
2
.
Instance
prod_validN
:
ValidN
(
A
*
B
)
:
=
λ
n
x
,
✓
{
n
}
x
.
1
∧
✓
{
n
}
x
.
2
.
Instance
prod_minus
:
Minus
(
A
*
B
)
:
=
λ
x
y
,
(
x
.
1
⩪
y
.
1
,
x
.
2
⩪
y
.
2
).
Instance
prod_minus
:
Minus
(
A
*
B
)
:
=
λ
x
y
,
(
x
.
1
⩪
y
.
1
,
x
.
2
⩪
y
.
2
).
Lemma
prod_included
(
x
y
:
A
*
B
)
:
x
≼
y
↔
x
.
1
≼
y
.
1
∧
x
.
2
≼
y
.
2
.
Lemma
prod_included
(
x
y
:
A
*
B
)
:
x
≼
y
↔
x
.
1
≼
y
.
1
∧
x
.
2
≼
y
.
2
.
...
@@ -526,6 +536,9 @@ Section prod.
...
@@ -526,6 +536,9 @@ Section prod.
-
by
intros
n
y1
y2
[
Hy1
Hy2
]
[??]
;
split
;
rewrite
/=
-
?Hy1
-
?Hy2
.
-
by
intros
n
y1
y2
[
Hy1
Hy2
]
[??]
;
split
;
rewrite
/=
-
?Hy1
-
?Hy2
.
-
by
intros
n
x1
x2
[
Hx1
Hx2
]
y1
y2
[
Hy1
Hy2
]
;
-
by
intros
n
x1
x2
[
Hx1
Hx2
]
y1
y2
[
Hy1
Hy2
]
;
split
;
rewrite
/=
?Hx1
?Hx2
?Hy1
?Hy2
.
split
;
rewrite
/=
?Hx1
?Hx2
?Hy1
?Hy2
.
-
intros
x
;
split
.
+
intros
[??]
n
;
split
;
by
apply
cmra_valid_validN
.
+
intros
Hxy
;
split
;
apply
cmra_valid_validN
=>
n
;
apply
Hxy
.
-
by
intros
n
x
[??]
;
split
;
apply
cmra_validN_S
.
-
by
intros
n
x
[??]
;
split
;
apply
cmra_validN_S
.
-
by
split
;
rewrite
/=
assoc
.
-
by
split
;
rewrite
/=
assoc
.
-
by
split
;
rewrite
/=
comm
.
-
by
split
;
rewrite
/=
comm
.
...
...
algebra/excl.v
View file @
b2c912d8
...
@@ -83,6 +83,8 @@ Global Instance excl_leibniz : LeibnizEquiv A → LeibnizEquiv (excl A).
...
@@ -83,6 +83,8 @@ Global Instance excl_leibniz : LeibnizEquiv A → LeibnizEquiv (excl A).
Proof
.
by
destruct
2
;
f_equal
;
apply
leibniz_equiv
.
Qed
.
Proof
.
by
destruct
2
;
f_equal
;
apply
leibniz_equiv
.
Qed
.
(* CMRA *)
(* CMRA *)
Instance
excl_valid
:
Valid
(
excl
A
)
:
=
λ
x
,
match
x
with
Excl
_
|
ExclUnit
=>
True
|
ExclBot
=>
False
end
.
Instance
excl_validN
:
ValidN
(
excl
A
)
:
=
λ
n
x
,
Instance
excl_validN
:
ValidN
(
excl
A
)
:
=
λ
n
x
,
match
x
with
Excl
_
|
ExclUnit
=>
True
|
ExclBot
=>
False
end
.
match
x
with
Excl
_
|
ExclUnit
=>
True
|
ExclBot
=>
False
end
.
Global
Instance
excl_empty
:
Empty
(
excl
A
)
:
=
ExclUnit
.
Global
Instance
excl_empty
:
Empty
(
excl
A
)
:
=
ExclUnit
.
...
@@ -106,6 +108,7 @@ Proof.
...
@@ -106,6 +108,7 @@ Proof.
-
constructor
.
-
constructor
.
-
by
destruct
1
;
intros
?.
-
by
destruct
1
;
intros
?.
-
by
destruct
1
;
inversion_clear
1
;
constructor
.
-
by
destruct
1
;
inversion_clear
1
;
constructor
.
-
intros
x
;
split
.
done
.
by
move
=>
/(
_
0
).
-
intros
n
[?|
|]
;
simpl
;
auto
with
lia
.
-
intros
n
[?|
|]
;
simpl
;
auto
with
lia
.
-
by
intros
[?|
|]
[?|
|]
[?|
|]
;
constructor
.
-
by
intros
[?|
|]
[?|
|]
[?|
|]
;
constructor
.
-
by
intros
[?|
|]
[?|
|]
;
constructor
.
-
by
intros
[?|
|]
[?|
|]
;
constructor
.
...
...
algebra/fin_maps.v
View file @
b2c912d8
...
@@ -96,6 +96,7 @@ Implicit Types m : gmap K A.
...
@@ -96,6 +96,7 @@ Implicit Types m : gmap K A.
Instance
map_op
:
Op
(
gmap
K
A
)
:
=
merge
op
.
Instance
map_op
:
Op
(
gmap
K
A
)
:
=
merge
op
.
Instance
map_unit
:
Unit
(
gmap
K
A
)
:
=
fmap
unit
.
Instance
map_unit
:
Unit
(
gmap
K
A
)
:
=
fmap
unit
.
Instance
map_valid
:
Valid
(
gmap
K
A
)
:
=
λ
m
,
∀
i
,
✓
(
m
!!
i
).
Instance
map_validN
:
ValidN
(
gmap
K
A
)
:
=
λ
n
m
,
∀
i
,
✓
{
n
}
(
m
!!
i
).
Instance
map_validN
:
ValidN
(
gmap
K
A
)
:
=
λ
n
m
,
∀
i
,
✓
{
n
}
(
m
!!
i
).
Instance
map_minus
:
Minus
(
gmap
K
A
)
:
=
merge
minus
.
Instance
map_minus
:
Minus
(
gmap
K
A
)
:
=
merge
minus
.
...
@@ -106,8 +107,6 @@ Proof. by apply lookup_merge. Qed.
...
@@ -106,8 +107,6 @@ Proof. by apply lookup_merge. Qed.
Lemma
lookup_unit
m
i
:
unit
m
!!
i
=
unit
(
m
!!
i
).
Lemma
lookup_unit
m
i
:
unit
m
!!
i
=
unit
(
m
!!
i
).
Proof
.
by
apply
lookup_fmap
.
Qed
.
Proof
.
by
apply
lookup_fmap
.
Qed
.
Lemma
map_valid_spec
m
:
✓
m
↔
∀
i
,
✓
(
m
!!
i
).
Proof
.
split
;
intros
Hm
??
;
apply
Hm
.
Qed
.
Lemma
map_included_spec
(
m1
m2
:
gmap
K
A
)
:
m1
≼
m2
↔
∀
i
,
m1
!!
i
≼
m2
!!
i
.
Lemma
map_included_spec
(
m1
m2
:
gmap
K
A
)
:
m1
≼
m2
↔
∀
i
,
m1
!!
i
≼
m2
!!
i
.
Proof
.
Proof
.
split
.
split
.
...
@@ -131,6 +130,9 @@ Proof.
...
@@ -131,6 +130,9 @@ Proof.
-
by
intros
n
m1
m2
Hm
i
;
rewrite
!
lookup_unit
(
Hm
i
).
-
by
intros
n
m1
m2
Hm
i
;
rewrite
!
lookup_unit
(
Hm
i
).
-
by
intros
n
m1
m2
Hm
?
i
;
rewrite
-(
Hm
i
).
-
by
intros
n
m1
m2
Hm
?
i
;
rewrite
-(
Hm
i
).
-
by
intros
n
m1
m1'
Hm1
m2
m2'
Hm2
i
;
rewrite
!
lookup_minus
(
Hm1
i
)
(
Hm2
i
).
-
by
intros
n
m1
m1'
Hm1
m2
m2'
Hm2
i
;
rewrite
!
lookup_minus
(
Hm1
i
)
(
Hm2
i
).
-
intros
m
;
split
.
+
by
intros
?
n
i
;
apply
cmra_valid_validN
.
+
intros
Hm
i
;
apply
cmra_valid_validN
=>
n
;
apply
Hm
.
-
intros
n
m
Hm
i
;
apply
cmra_validN_S
,
Hm
.
-
intros
n
m
Hm
i
;
apply
cmra_validN_S
,
Hm
.
-
by
intros
m1
m2
m3
i
;
rewrite
!
lookup_op
assoc
.
-
by
intros
m1
m2
m3
i
;
rewrite
!
lookup_op
assoc
.
-
by
intros
m1
m2
i
;
rewrite
!
lookup_op
comm
.
-
by
intros
m1
m2
i
;
rewrite
!
lookup_op
comm
.
...
@@ -162,7 +164,7 @@ Canonical Structure mapRA : cmraT := CMRAT map_cofe_mixin map_cmra_mixin.
...
@@ -162,7 +164,7 @@ Canonical Structure mapRA : cmraT := CMRAT map_cofe_mixin map_cmra_mixin.
Global
Instance
map_cmra_identity
:
CMRAIdentity
mapRA
.
Global
Instance
map_cmra_identity
:
CMRAIdentity
mapRA
.
Proof
.
Proof
.
split
.
split
.
-
by
intros
?
n
;
rewrite
lookup_empty
.
-
by
intros
i
;
rewrite
lookup_empty
.
-
by
intros
m
i
;
rewrite
/=
lookup_op
lookup_empty
(
left_id_L
None
_
).
-
by
intros
m
i
;
rewrite
/=
lookup_op
lookup_empty
(
left_id_L
None
_
).
-
apply
map_empty_timeless
.
-
apply
map_empty_timeless
.
Qed
.
Qed
.
...
@@ -187,18 +189,18 @@ Implicit Types a : A.
...
@@ -187,18 +189,18 @@ Implicit Types a : A.
Lemma
map_lookup_validN
n
m
i
x
:
✓
{
n
}
m
→
m
!!
i
≡
{
n
}
≡
Some
x
→
✓
{
n
}
x
.
Lemma
map_lookup_validN
n
m
i
x
:
✓
{
n
}
m
→
m
!!
i
≡
{
n
}
≡
Some
x
→
✓
{
n
}
x
.
Proof
.
by
move
=>
/(
_
i
)
Hm
Hi
;
move
:
Hm
;
rewrite
Hi
.
Qed
.
Proof
.
by
move
=>
/(
_
i
)
Hm
Hi
;
move
:
Hm
;
rewrite
Hi
.
Qed
.
Lemma
map_lookup_valid
m
i
x
:
✓
m
→
m
!!
i
≡
Some
x
→
✓
x
.
Lemma
map_lookup_valid
m
i
x
:
✓
m
→
m
!!
i
≡
Some
x
→
✓
x
.
Proof
.
move
=>
Hm
Hi
n
.
move
:
(
Hm
n
i
).
by
rewrite
Hi
.
Qed
.
Proof
.
move
=>
Hm
Hi
.
move
:
(
Hm
i
).
by
rewrite
Hi
.
Qed
.
Lemma
map_insert_validN
n
m
i
x
:
✓
{
n
}
x
→
✓
{
n
}
m
→
✓
{
n
}
<[
i
:
=
x
]>
m
.
Lemma
map_insert_validN
n
m
i
x
:
✓
{
n
}
x
→
✓
{
n
}
m
→
✓
{
n
}
<[
i
:
=
x
]>
m
.
Proof
.
by
intros
??
j
;
destruct
(
decide
(
i
=
j
))
;
simplify_map_eq
.
Qed
.
Proof
.
by
intros
??
j
;
destruct
(
decide
(
i
=
j
))
;
simplify_map_eq
.
Qed
.
Lemma
map_insert_valid
m
i
x
:
✓
x
→
✓
m
→
✓
<[
i
:
=
x
]>
m
.
Lemma
map_insert_valid
m
i
x
:
✓
x
→
✓
m
→
✓
<[
i
:
=
x
]>
m
.
Proof
.
intros
??
n
j
;
apply
map_insert_validN
;
auto
.
Qed
.
Proof
.
by
intros
??
j
;
destruct
(
decide
(
i
=
j
))
;
simplify_map_eq
.
Qed
.
Lemma
map_singleton_validN
n
i
x
:
✓
{
n
}
({[
i
:
=
x
]}
:
gmap
K
A
)
↔
✓
{
n
}
x
.
Lemma
map_singleton_validN
n
i
x
:
✓
{
n
}
({[
i
:
=
x
]}
:
gmap
K
A
)
↔
✓
{
n
}
x
.
Proof
.
Proof
.
split
;
[|
by
intros
;
apply
map_insert_validN
,
cmra_empty_valid
].
split
;
[|
by
intros
;
apply
map_insert_validN
,
cmra_empty_valid
N
].
by
move
=>/(
_
i
)
;
simplify_map_eq
.
by
move
=>/(
_
i
)
;
simplify_map_eq
.
Qed
.
Qed
.
Lemma
map_singleton_valid
i
x
:
✓
({[
i
:
=
x
]}
:
gmap
K
A
)
↔
✓
x
.
Lemma
map_singleton_valid
i
x
:
✓
({[
i
:
=
x
]}
:
gmap
K
A
)
↔
✓
x
.
Proof
.
split
;
intros
?
n
;
eapply
map_singleton_validN
;
eauto
.
Qed
.
Proof
.
rewrite
!
cmra_valid_validN
.
by
setoid_rewrite
map_singleton_validN
.
Qed
.
Lemma
map_insert_singleton_opN
n
m
i
x
:
Lemma
map_insert_singleton_opN
n
m
i
x
:
m
!!
i
=
None
∨
m
!!
i
≡
{
n
}
≡
Some
(
unit
x
)
→
<[
i
:
=
x
]>
m
≡
{
n
}
≡
{[
i
:
=
x
]}
⋅
m
.
m
!!
i
=
None
∨
m
!!
i
≡
{
n
}
≡
Some
(
unit
x
)
→
<[
i
:
=
x
]>
m
≡
{
n
}
≡
{[
i
:
=
x
]}
⋅
m
.
...
@@ -275,7 +277,7 @@ Proof.
...
@@ -275,7 +277,7 @@ Proof.
intros
Hx
HQ
n
gf
Hg
.
intros
Hx
HQ
n
gf
Hg
.
destruct
(
Hx
n
(
from_option
∅
(
gf
!!
i
)))
as
(
y
&?&
Hy
).
destruct
(
Hx
n
(
from_option
∅
(
gf
!!
i
)))
as
(
y
&?&
Hy
).
{
move
:
(
Hg
i
).
rewrite
!
left_id
.
{
move
:
(
Hg
i
).
rewrite
!
left_id
.
case
_:
(
gf
!!
i
)
;
simpl
;
auto
using
cmra_empty_valid
.
}
case
_:
(
gf
!!
i
)
;
simpl
;
auto
using
cmra_empty_valid
N
.
}
exists
{[
i
:
=
y
]}
;
split
;
first
by
auto
.
exists
{[
i
:
=
y
]}
;
split
;
first
by
auto
.
intros
i'
;
destruct
(
decide
(
i'
=
i
))
as
[->|].
intros
i'
;
destruct
(
decide
(
i'
=
i
))
as
[->|].
-
rewrite
lookup_op
lookup_singleton
.
-
rewrite
lookup_op
lookup_singleton
.
...
...
algebra/iprod.v
View file @
b2c912d8
...
@@ -118,6 +118,7 @@ Section iprod_cmra.
...
@@ -118,6 +118,7 @@ Section iprod_cmra.
Instance
iprod_op
:
Op
(
iprod
B
)
:
=
λ
f
g
x
,
f
x
⋅
g
x
.
Instance
iprod_op
:
Op
(
iprod
B
)
:
=
λ
f
g
x
,
f
x
⋅
g
x
.
Instance
iprod_unit
:
Unit
(
iprod
B
)
:
=
λ
f
x
,
unit
(
f
x
).
Instance
iprod_unit
:
Unit
(
iprod
B
)
:
=
λ
f
x
,
unit
(
f
x
).
Instance
iprod_valid
:
Valid
(
iprod
B
)
:
=
λ
f
,
∀
x
,
✓
f
x
.
Instance
iprod_validN
:
ValidN
(
iprod
B
)
:
=
λ
n
f
,
∀
x
,
✓
{
n
}
f
x
.
Instance
iprod_validN
:
ValidN
(
iprod
B
)
:
=
λ
n
f
,
∀
x
,
✓
{
n
}
f
x
.
Instance
iprod_minus
:
Minus
(
iprod
B
)
:
=
λ
f
g
x
,
f
x
⩪
g
x
.
Instance
iprod_minus
:
Minus
(
iprod
B
)
:
=
λ
f
g
x
,
f
x
⩪
g
x
.
...
@@ -140,6 +141,9 @@ Section iprod_cmra.
...
@@ -140,6 +141,9 @@ Section iprod_cmra.
-
by
intros
n
f1
f2
Hf
x
;
rewrite
iprod_lookup_unit
(
Hf
x
).
-
by
intros
n
f1
f2
Hf
x
;
rewrite
iprod_lookup_unit
(
Hf
x
).
-
by
intros
n
f1
f2
Hf
?
x
;
rewrite
-(
Hf
x
).
-
by
intros
n
f1
f2
Hf
?
x
;
rewrite
-(
Hf
x
).
-
by
intros
n
f
f'
Hf
g
g'
Hg
i
;
rewrite
iprod_lookup_minus
(
Hf
i
)
(
Hg
i
).
-
by
intros
n
f
f'
Hf
g
g'
Hg
i
;
rewrite
iprod_lookup_minus
(
Hf
i
)
(
Hg
i
).
-
intros
g
;
split
.
+
intros
Hg
n
i
;
apply
cmra_valid_validN
,
Hg
.
+
intros
Hg
i
;
apply
cmra_valid_validN
=>
n
;
apply
Hg
.
-
intros
n
f
Hf
x
;
apply
cmra_validN_S
,
Hf
.
-
intros
n
f
Hf
x
;
apply
cmra_validN_S
,
Hf
.
-
by
intros
f1
f2
f3
x
;
rewrite
iprod_lookup_op
assoc
.
-
by
intros
f1
f2
f3
x
;
rewrite
iprod_lookup_op
assoc
.
-
by
intros
f1
f2
x
;
rewrite
iprod_lookup_op
comm
.
-
by
intros
f1
f2
x
;
rewrite
iprod_lookup_op
comm
.
...
@@ -160,7 +164,7 @@ Section iprod_cmra.
...
@@ -160,7 +164,7 @@ Section iprod_cmra.
(
∀
x
,
CMRAIdentity
(
B
x
))
→
CMRAIdentity
iprodRA
.
(
∀
x
,
CMRAIdentity
(
B
x
))
→
CMRAIdentity
iprodRA
.
Proof
.
Proof
.
intros
?
;
split
.
intros
?
;
split
.
-
intros
n
x
;
apply
cmra_empty_valid
.
-
intros
x
;
apply
cmra_empty_valid
.
-
by
intros
f
x
;
rewrite
iprod_lookup_op
left_id
.
-
by
intros
f
x
;
rewrite
iprod_lookup_op
left_id
.
-
by
apply
_
.
-
by
apply
_
.
Qed
.
Qed
.
...
@@ -204,7 +208,7 @@ Section iprod_cmra.
...
@@ -204,7 +208,7 @@ Section iprod_cmra.
split
;
[
by
move
=>/(
_
x
)
;
rewrite
iprod_lookup_singleton
|].
split
;
[
by
move
=>/(
_
x
)
;
rewrite
iprod_lookup_singleton
|].
move
=>
Hx
x'
;
destruct
(
decide
(
x
=
x'
))
as
[->|]
;
move
=>
Hx
x'
;
destruct
(
decide
(
x
=
x'
))
as
[->|]
;
rewrite
?iprod_lookup_singleton
?iprod_lookup_singleton_ne
//.
rewrite
?iprod_lookup_singleton
?iprod_lookup_singleton_ne
//.
by
apply
cmra_empty_valid
.
by
apply
cmra_empty_valid
N
.
Qed
.
Qed
.
Lemma
iprod_unit_singleton
x
(
y
:
B
x
)
:
Lemma
iprod_unit_singleton
x
(
y
:
B
x
)
:
...
...
algebra/option.v
View file @
b2c912d8
...
@@ -61,6 +61,8 @@ Arguments optionC : clear implicits.
...
@@ -61,6 +61,8 @@ Arguments optionC : clear implicits.
Section
cmra
.
Section
cmra
.
Context
{
A
:
cmraT
}.
Context
{
A
:
cmraT
}.
Instance
option_valid
:
Valid
(
option
A
)
:
=
λ
mx
,
match
mx
with
Some
x
=>
✓
x
|
None
=>
True
end
.
Instance
option_validN
: