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
Ralf Jung
Iris
Commits
a9e2d8f3
Commit
a9e2d8f3
authored
Feb 02, 2017
by
Robbert Krebbers
Browse files
Another failed approach to avoid declaring other projections than the carrier as canonical.
parent
bf069d12
Changes
5
Hide whitespace changes
Inline
Side-by-side
theories/algebra/cmra.v
View file @
a9e2d8f3
...
@@ -35,92 +35,101 @@ Notation "x ≼{ n } y" := (includedN n x y)
...
@@ -35,92 +35,101 @@ 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
,
PCore
A
,
Op
A
,
Valid
A
,
ValidN
A
}
:
=
{
Record
cmra_laws
A
`
{
Dist
A
,
Equiv
A
,
PCore
A
,
Op
A
,
Valid
A
,
ValidN
A
}
:
=
{
(* setoids *)
(* setoids *)
mixin
_cmra_op_ne
(
x
:
A
)
:
NonExpansive
(
op
x
)
;
law
_cmra_op_ne
(
x
:
A
)
:
NonExpansive
(
op
x
)
;
mixin
_cmra_pcore_ne
n
x
y
cx
:
law
_cmra_pcore_ne
n
x
y
cx
:
x
≡
{
n
}
≡
y
→
pcore
x
=
Some
cx
→
∃
cy
,
pcore
y
=
Some
cy
∧
cx
≡
{
n
}
≡
cy
;
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
)
;
law
_cmra_validN_ne
n
:
Proper
(
dist
n
==>
impl
)
(
validN
n
)
;
(* valid *)
(* valid *)
mixin
_cmra_valid_validN
x
:
✓
x
↔
∀
n
,
✓
{
n
}
x
;
law
_cmra_valid_validN
x
:
✓
x
↔
∀
n
,
✓
{
n
}
x
;
mixin
_cmra_validN_S
n
x
:
✓
{
S
n
}
x
→
✓
{
n
}
x
;
law
_cmra_validN_S
n
x
:
✓
{
S
n
}
x
→
✓
{
n
}
x
;
(* monoid *)
(* monoid *)
mixin
_cmra_assoc
:
Assoc
(
≡
)
(
⋅
)
;
law
_cmra_assoc
:
Assoc
(
≡
)
(
⋅
)
;
mixin
_cmra_comm
:
Comm
(
≡
)
(
⋅
)
;
law
_cmra_comm
:
Comm
(
≡
)
(
⋅
)
;
mixin
_cmra_pcore_l
x
cx
:
pcore
x
=
Some
cx
→
cx
⋅
x
≡
x
;
law
_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
;
law
_cmra_pcore_idemp
x
cx
:
pcore
x
=
Some
cx
→
pcore
cx
≡
Some
cx
;
mixin
_cmra_pcore_mono
x
y
cx
:
law
_cmra_pcore_mono
x
y
cx
:
x
≼
y
→
pcore
x
=
Some
cx
→
∃
cy
,
pcore
y
=
Some
cy
∧
cx
≼
cy
;
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
;
law
_cmra_validN_op_l
n
x
y
:
✓
{
n
}
(
x
⋅
y
)
→
✓
{
n
}
x
;
mixin
_cmra_extend
n
x
y1
y2
:
law
_cmra_extend
n
x
y1
y2
:
✓
{
n
}
x
→
x
≡
{
n
}
≡
y1
⋅
y2
→
✓
{
n
}
x
→
x
≡
{
n
}
≡
y1
⋅
y2
→
∃
z1
z2
,
x
≡
z1
⋅
z2
∧
z1
≡
{
n
}
≡
y1
∧
z2
≡
{
n
}
≡
y2
∃
z1
z2
,
x
≡
z1
⋅
z2
∧
z1
≡
{
n
}
≡
y1
∧
z2
≡
{
n
}
≡
y2
}.
}.
(** Bundeled version *)
Record
cmra_mixin
(
A
:
Type
)
:
=
CMRAMixin
{
Structure
cmraT
:
=
CMRAT'
{
cmra_mixin_equiv
:
Equiv
A
;
cmra_car
:
>
Type
;
cmra_mixin_dist
:
Dist
A
;
cmra_equiv
:
Equiv
cmra_car
;
cmra_mixin_pcore
:
PCore
A
;
cmra_dist
:
Dist
cmra_car
;
cmra_mixin_op
:
Op
A
;
cmra_pcore
:
PCore
cmra_car
;
cmra_mixin_valid
:
Valid
A
;
cmra_op
:
Op
cmra_car
;
cmra_mixin_validN
:
ValidN
A
;
cmra_valid
:
Valid
cmra_car
;
cmra_mixin_ofe_laws_of
:
ofe_laws
A
;
cmra_validN
:
ValidN
cmra_car
;
cmra_mixin_laws_of
:
cmra_laws
A
;
cmra_ofe_mixin
:
OfeMixin
cmra_car
;
cmra_mixin
:
CMRAMixin
cmra_car
;
_
:
Type
}.
}.
Arguments
CMRAT'
_
{
_
_
_
_
_
_
}
_
_
_
.
Arguments
CMRAMixin
{
_
_
_
_
_
_
_
}
_
_
.
Notation
CMRAT
A
m
m'
:
=
(
CMRAT'
A
m
m'
A
).
(** Bundeled version *)
Structure
cmraT
:
=
CMRAT'
{
cmra_car
:
>
Type
;
_
:
cmra_mixin
cmra_car
;
_
:
Type
}.
Notation
CMRAT
A
m
:
=
(
CMRAT'
A
m
A
).
Add
Printing
Constructor
cmraT
.
Arguments
cmra_car
:
simpl
never
.
Arguments
cmra_car
:
simpl
never
.
Arguments
cmra_equiv
:
simpl
never
.
Arguments
cmra_dist
:
simpl
never
.
Definition
cmra_mixin_of
(
A
:
cmraT
)
:
cmra_mixin
A
:
=
let
'
CMRAT'
_
m
_
:
=
A
in
m
.
Arguments
cmra_mixin_of
:
simpl
never
.
Definition
cmra_pcore
{
A
:
cmraT
}
:
PCore
A
:
=
cmra_mixin_pcore
_
(
cmra_mixin_of
A
).
Arguments
cmra_pcore
:
simpl
never
.
Arguments
cmra_pcore
:
simpl
never
.
Arguments
cmra_op
:
simpl
never
.
Arguments
cmra_valid
:
simpl
never
.
Arguments
cmra_validN
:
simpl
never
.
Arguments
cmra_ofe_mixin
:
simpl
never
.
Arguments
cmra_mixin
:
simpl
never
.
Add
Printing
Constructor
cmraT
.
Hint
Extern
0
(
PCore
_
)
=>
eapply
(@
cmra_pcore
_
)
:
typeclass_instances
.
Hint
Extern
0
(
PCore
_
)
=>
eapply
(@
cmra_pcore
_
)
:
typeclass_instances
.
Definition
cmra_op
{
A
:
cmraT
}
:
Op
A
:
=
cmra_mixin_op
_
(
cmra_mixin_of
A
).
Arguments
cmra_op
:
simpl
never
.
Hint
Extern
0
(
Op
_
)
=>
eapply
(@
cmra_op
_
)
:
typeclass_instances
.
Hint
Extern
0
(
Op
_
)
=>
eapply
(@
cmra_op
_
)
:
typeclass_instances
.
Definition
cmra_valid
{
A
:
cmraT
}
:
Valid
A
:
=
cmra_mixin_valid
_
(
cmra_mixin_of
A
).
Arguments
cmra_valid
:
simpl
never
.
Hint
Extern
0
(
Valid
_
)
=>
eapply
(@
cmra_valid
_
)
:
typeclass_instances
.
Hint
Extern
0
(
Valid
_
)
=>
eapply
(@
cmra_valid
_
)
:
typeclass_instances
.
Definition
cmra_validN
{
A
:
cmraT
}
:
ValidN
A
:
=
cmra_mixin_validN
_
(
cmra_mixin_of
A
).
Arguments
cmra_validN
:
simpl
never
.
Hint
Extern
0
(
ValidN
_
)
=>
eapply
(@
cmra_validN
_
)
:
typeclass_instances
.
Hint
Extern
0
(
ValidN
_
)
=>
eapply
(@
cmra_validN
_
)
:
typeclass_instances
.
Coercion
cmra_ofeC
(
A
:
cmraT
)
:
ofeT
:
=
OfeT
A
(
cmra_ofe_mixin
A
).
Definition
cmra_ofe_mixin_of
{
A
}
(
m
:
cmra_mixin
A
)
:
ofe_mixin
A
:
=
OfeMixin
(
cmra_mixin_ofe_laws_of
_
m
).
Coercion
cmra_ofeC
(
A
:
cmraT
)
:
ofeT
:
=
OfeT
A
(
cmra_ofe_mixin_of
(
cmra_mixin_of
A
)).
Canonical
Structure
cmra_ofeC
.
Canonical
Structure
cmra_ofeC
.
(** Lifting properties from the mixin *)
(** Lifting properties from the mixin *)
Section
cmra_mixin
.
Section
cmra_mixin
.
Context
{
A
:
cmraT
}.
Context
{
A
:
cmraT
}.
Implicit
Types
x
y
:
A
.
Implicit
Types
x
y
:
A
.
Local
Coercion
cmra_mixin_of
:
cmraT
>->
cmra_mixin
.
Global
Instance
cmra_op_ne
(
x
:
A
)
:
NonExpansive
(
op
x
).
Global
Instance
cmra_op_ne
(
x
:
A
)
:
NonExpansive
(
op
x
).
Proof
.
apply
(
mixin
_cmra_op_ne
_
(
cmra_mixin
A
)).
Qed
.
Proof
.
apply
(
law
_cmra_op_ne
_
(
cmra_mixin
_laws_of
_
A
)).
Qed
.
Lemma
cmra_pcore_ne
n
x
y
cx
:
Lemma
cmra_pcore_ne
n
x
y
cx
:
x
≡
{
n
}
≡
y
→
pcore
x
=
Some
cx
→
∃
cy
,
pcore
y
=
Some
cy
∧
cx
≡
{
n
}
≡
cy
.
x
≡
{
n
}
≡
y
→
pcore
x
=
Some
cx
→
∃
cy
,
pcore
y
=
Some
cy
∧
cx
≡
{
n
}
≡
cy
.
Proof
.
apply
(
mixin
_cmra_pcore_ne
_
(
cmra_mixin
A
)).
Qed
.
Proof
.
apply
(
law
_cmra_pcore_ne
_
(
cmra_mixin
_laws_of
_
A
)).
Qed
.
Global
Instance
cmra_validN_ne
n
:
Proper
(
dist
n
==>
impl
)
(@
validN
A
_
n
).
Global
Instance
cmra_validN_ne
n
:
Proper
(
dist
n
==>
impl
)
(@
validN
A
_
n
).
Proof
.
apply
(
mixin
_cmra_validN_ne
_
(
cmra_mixin
A
)).
Qed
.
Proof
.
apply
(
law
_cmra_validN_ne
_
(
cmra_mixin
_laws_of
_
A
)).
Qed
.
Lemma
cmra_valid_validN
x
:
✓
x
↔
∀
n
,
✓
{
n
}
x
.
Lemma
cmra_valid_validN
x
:
✓
x
↔
∀
n
,
✓
{
n
}
x
.
Proof
.
apply
(
mixin
_cmra_valid_validN
_
(
cmra_mixin
A
)).
Qed
.
Proof
.
apply
(
law
_cmra_valid_validN
_
(
cmra_mixin
_laws_of
_
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
(
law
_cmra_validN_S
_
(
cmra_mixin
_laws_of
_
A
)).
Qed
.
Global
Instance
cmra_assoc
:
Assoc
(
≡
)
(@
op
A
_
).
Global
Instance
cmra_assoc
:
Assoc
(
≡
)
(@
op
A
_
).
Proof
.
apply
(
mixin
_cmra_assoc
_
(
cmra_mixin
A
)).
Qed
.
Proof
.
apply
(
law
_cmra_assoc
_
(
cmra_mixin
_laws_of
_
A
)).
Qed
.
Global
Instance
cmra_comm
:
Comm
(
≡
)
(@
op
A
_
).
Global
Instance
cmra_comm
:
Comm
(
≡
)
(@
op
A
_
).
Proof
.
apply
(
mixin
_cmra_comm
_
(
cmra_mixin
A
)).
Qed
.
Proof
.
apply
(
law
_cmra_comm
_
(
cmra_mixin
_laws_of
_
A
)).
Qed
.
Lemma
cmra_pcore_l
x
cx
:
pcore
x
=
Some
cx
→
cx
⋅
x
≡
x
.
Lemma
cmra_pcore_l
x
cx
:
pcore
x
=
Some
cx
→
cx
⋅
x
≡
x
.
Proof
.
apply
(
mixin
_cmra_pcore_l
_
(
cmra_mixin
A
)).
Qed
.
Proof
.
apply
(
law
_cmra_pcore_l
_
(
cmra_mixin
_laws_of
_
A
)).
Qed
.
Lemma
cmra_pcore_idemp
x
cx
:
pcore
x
=
Some
cx
→
pcore
cx
≡
Some
cx
.
Lemma
cmra_pcore_idemp
x
cx
:
pcore
x
=
Some
cx
→
pcore
cx
≡
Some
cx
.
Proof
.
apply
(
mixin
_cmra_pcore_idemp
_
(
cmra_mixin
A
)).
Qed
.
Proof
.
apply
(
law
_cmra_pcore_idemp
_
(
cmra_mixin
_laws_of
_
A
)).
Qed
.
Lemma
cmra_pcore_mono
x
y
cx
:
Lemma
cmra_pcore_mono
x
y
cx
:
x
≼
y
→
pcore
x
=
Some
cx
→
∃
cy
,
pcore
y
=
Some
cy
∧
cx
≼
cy
.
x
≼
y
→
pcore
x
=
Some
cx
→
∃
cy
,
pcore
y
=
Some
cy
∧
cx
≼
cy
.
Proof
.
apply
(
mixin
_cmra_pcore_mono
_
(
cmra_mixin
A
)).
Qed
.
Proof
.
apply
(
law
_cmra_pcore_mono
_
(
cmra_mixin
_laws_of
_
A
)).
Qed
.
Lemma
cmra_validN_op_l
n
x
y
:
✓
{
n
}
(
x
⋅
y
)
→
✓
{
n
}
x
.
Lemma
cmra_validN_op_l
n
x
y
:
✓
{
n
}
(
x
⋅
y
)
→
✓
{
n
}
x
.
Proof
.
apply
(
mixin
_cmra_validN_op_l
_
(
cmra_mixin
A
)).
Qed
.
Proof
.
apply
(
law
_cmra_validN_op_l
_
(
cmra_mixin
_laws_of
_
A
)).
Qed
.
Lemma
cmra_extend
n
x
y1
y2
:
Lemma
cmra_extend
n
x
y1
y2
:
✓
{
n
}
x
→
x
≡
{
n
}
≡
y1
⋅
y2
→
✓
{
n
}
x
→
x
≡
{
n
}
≡
y1
⋅
y2
→
∃
z1
z2
,
x
≡
z1
⋅
z2
∧
z1
≡
{
n
}
≡
y1
∧
z2
≡
{
n
}
≡
y2
.
∃
z1
z2
,
x
≡
z1
⋅
z2
∧
z1
≡
{
n
}
≡
y1
∧
z2
≡
{
n
}
≡
y2
.
Proof
.
apply
(
mixin
_cmra_extend
_
(
cmra_mixin
A
)).
Qed
.
Proof
.
apply
(
law
_cmra_extend
_
(
cmra_mixin
_laws_of
_
A
)).
Qed
.
End
cmra_mixin
.
End
cmra_mixin
.
Definition
opM
{
A
:
cmraT
}
(
x
:
A
)
(
my
:
option
A
)
:
=
Definition
opM
{
A
:
cmraT
}
(
x
:
A
)
(
my
:
option
A
)
:
=
...
@@ -163,56 +172,66 @@ Arguments core' _ _ _ /.
...
@@ -163,56 +172,66 @@ Arguments core' _ _ _ /.
(** * CMRAs with a unit element *)
(** * CMRAs with a unit element *)
(** We use the notation ∅ because for most instances (maps, sets, etc) the
(** We use the notation ∅ because for most instances (maps, sets, etc) the
`empty' element is the unit. *)
`empty' element is the unit. *)
Record
UCMRAMixin
A
`
{
Dist
A
,
Equiv
A
,
PCore
A
,
Op
A
,
Valid
A
,
Empty
A
}
:
=
{
Record
ucmra_laws
A
`
{
Dist
A
,
Equiv
A
,
PCore
A
,
Op
A
,
Valid
A
,
Empty
A
}
:
=
{
mixin_ucmra_unit_valid
:
✓
∅
;
mixin_ucmra_unit_valid
:
✓
∅
;
mixin_ucmra_unit_left_id
:
LeftId
(
≡
)
∅
(
⋅
)
;
mixin_ucmra_unit_left_id
:
LeftId
(
≡
)
∅
(
⋅
)
;
mixin_ucmra_pcore_unit
:
pcore
∅
≡
Some
∅
mixin_ucmra_pcore_unit
:
pcore
∅
≡
Some
∅
}.
}.
Structure
ucmraT
:
=
UCMRAT'
{
Record
ucmra_mixin
(
A
:
Type
)
:
=
UCMRAMixin
{
ucmra_car
:
>
Type
;
ucmra_mixin_equiv
:
Equiv
A
;
ucmra_equiv
:
Equiv
ucmra_car
;
ucmra_mixin_dist
:
Dist
A
;
ucmra_dist
:
Dist
ucmra_car
;
ucmra_mixin_pcore
:
PCore
A
;
ucmra_pcore
:
PCore
ucmra_car
;
ucmra_mixin_op
:
Op
A
;
ucmra_op
:
Op
ucmra_car
;
ucmra_mixin_valid
:
Valid
A
;
ucmra_valid
:
Valid
ucmra_car
;
ucmra_mixin_validN
:
ValidN
A
;
ucmra_validN
:
ValidN
ucmra_car
;
ucmra_mixin_empty
:
Empty
A
;
ucmra_empty
:
Empty
ucmra_car
;
ucmra_mixin_ofe_laws_of
:
ofe_laws
A
;
ucmra_ofe_mixin
:
OfeMixin
ucmra_car
;
ucmra_mixin_cmra_laws_of
:
cmra_laws
A
;
ucmra_cmra_mixin
:
CMRAMixin
ucmra_car
;
ucmra_mixin_laws_of
:
ucmra_laws
A
;
ucmra_mixin
:
UCMRAMixin
ucmra_car
;
_
:
Type
;
}.
}.
Arguments
UCMRAT'
_
{
_
_
_
_
_
_
_
}
_
_
_
_
.
Arguments
UCMRAMixin
{
_
_
_
_
_
_
_
_
}
_
_
_
.
Notation
UCMRAT
A
m
m'
m''
:
=
(
UCMRAT'
A
m
m'
m''
A
).
Arguments
ucmra_car
:
simpl
never
.
Structure
ucmraT
:
=
Arguments
ucmra_equiv
:
simpl
never
.
UCMRAT'
{
ucmra_car
:
>
Type
;
_
:
ucmra_mixin
ucmra_car
;
_
:
Type
}.
Arguments
ucmra_dist
:
simpl
never
.
Notation
UCMRAT
A
m
:
=
(
UCMRAT'
A
m
A
).
Arguments
ucmra_pcore
:
simpl
never
.
Arguments
ucmra_op
:
simpl
never
.
Arguments
ucmra_valid
:
simpl
never
.
Arguments
ucmra_validN
:
simpl
never
.
Arguments
ucmra_ofe_mixin
:
simpl
never
.
Arguments
ucmra_cmra_mixin
:
simpl
never
.
Arguments
ucmra_mixin
:
simpl
never
.
Add
Printing
Constructor
ucmraT
.
Add
Printing
Constructor
ucmraT
.
Arguments
ucmra_car
:
simpl
never
.
Definition
ucmra_mixin_of
(
A
:
ucmraT
)
:
ucmra_mixin
A
:
=
let
'
UCMRAT'
_
m
_
:
=
A
in
m
.
Arguments
ucmra_mixin_of
:
simpl
never
.
Definition
ucmra_empty
{
A
:
ucmraT
}
:
Empty
A
:
=
ucmra_mixin_empty
_
(
ucmra_mixin_of
A
).
Arguments
ucmra_empty
:
simpl
never
.
Hint
Extern
0
(
Empty
_
)
=>
eapply
(@
ucmra_empty
_
)
:
typeclass_instances
.
Hint
Extern
0
(
Empty
_
)
=>
eapply
(@
ucmra_empty
_
)
:
typeclass_instances
.
Coercion
ucmra_ofeC
(
A
:
ucmraT
)
:
ofeT
:
=
OfeT
A
(
ucmra_ofe_mixin
A
).
Definition
ucmra_ofe_mixin_of
{
A
}
(
m
:
ucmra_mixin
A
)
:
ofe_mixin
A
:
=
OfeMixin
(
ucmra_mixin_ofe_laws_of
_
m
).
Definition
ucmra_cmra_mixin_of
{
A
}
(
m
:
ucmra_mixin
A
)
:
cmra_mixin
A
:
=
CMRAMixin
(
ucmra_mixin_ofe_laws_of
_
m
)
(
ucmra_mixin_cmra_laws_of
_
m
).
Arguments
ucmra_ofe_mixin_of
:
simpl
never
.
Arguments
ucmra_cmra_mixin_of
:
simpl
never
.
Coercion
ucmra_ofeC
(
A
:
ucmraT
)
:
ofeT
:
=
OfeT
A
(
ucmra_ofe_mixin_of
(
ucmra_mixin_of
A
)).
Canonical
Structure
ucmra_ofeC
.
Canonical
Structure
ucmra_ofeC
.
Coercion
ucmra_cmraR
(
A
:
ucmraT
)
:
cmraT
:
=
Coercion
ucmra_cmraR
(
A
:
ucmraT
)
:
cmraT
:
=
CMRAT
A
(
ucmra_
ofe
_mixin
A
)
(
ucmra_
cmra_
mixin
A
).
CMRAT
A
(
ucmra_
cmra
_mixin
_of
(
ucmra_mixin
_of
A
)
)
.
Canonical
Structure
ucmra_cmraR
.
Canonical
Structure
ucmra_cmraR
.
(** Lifting properties from the mixin *)
(** Lifting properties from the mixin *)
Section
ucmra_mixin
.
Section
ucmra_mixin
.
Context
{
A
:
ucmraT
}.
Context
{
A
:
ucmraT
}.
Implicit
Types
x
y
:
A
.
Implicit
Types
x
y
:
A
.
Local
Coercion
ucmra_mixin_of
:
ucmraT
>->
ucmra_mixin
.
Lemma
ucmra_unit_valid
:
✓
(
∅
:
A
).
Lemma
ucmra_unit_valid
:
✓
(
∅
:
A
).
Proof
.
apply
(
mixin_ucmra_unit_valid
_
(
ucmra_mixin
A
)).
Qed
.
Proof
.
apply
(
mixin_ucmra_unit_valid
_
(
ucmra_mixin
_laws_of
_
A
)).
Qed
.
Global
Instance
ucmra_unit_left_id
:
LeftId
(
≡
)
∅
(@
op
A
_
).
Global
Instance
ucmra_unit_left_id
:
LeftId
(
≡
)
∅
(@
op
A
_
).
Proof
.
apply
(
mixin_ucmra_unit_left_id
_
(
ucmra_mixin
A
)).
Qed
.
Proof
.
apply
(
mixin_ucmra_unit_left_id
_
(
ucmra_mixin
_laws_of
_
A
)).
Qed
.
Lemma
ucmra_pcore_unit
:
pcore
(
∅
:
A
)
≡
Some
∅
.
Lemma
ucmra_pcore_unit
:
pcore
(
∅
:
A
)
≡
Some
∅
.
Proof
.
apply
(
mixin_ucmra_pcore_unit
_
(
ucmra_mixin
A
)).
Qed
.
Proof
.
apply
(
mixin_ucmra_pcore_unit
_
(
ucmra_mixin
_laws_of
_
A
)).
Qed
.
End
ucmra_mixin
.
End
ucmra_mixin
.
(** * Discrete CMRAs *)
(** * Discrete CMRAs *)
...
@@ -698,7 +717,7 @@ Section cmra_total.
...
@@ -698,7 +717,7 @@ Section cmra_total.
Context
(
extend
:
∀
n
(
x
y1
y2
:
A
),
Context
(
extend
:
∀
n
(
x
y1
y2
:
A
),
✓
{
n
}
x
→
x
≡
{
n
}
≡
y1
⋅
y2
→
✓
{
n
}
x
→
x
≡
{
n
}
≡
y1
⋅
y2
→
∃
z1
z2
,
x
≡
z1
⋅
z2
∧
z1
≡
{
n
}
≡
y1
∧
z2
≡
{
n
}
≡
y2
).
∃
z1
z2
,
x
≡
z1
⋅
z2
∧
z1
≡
{
n
}
≡
y1
∧
z2
≡
{
n
}
≡
y2
).
Lemma
cmra_total_
mixin
:
CMRAMixin
A
.
Lemma
cmra_total_
laws
:
cmra_laws
A
.
Proof
using
Type
*.
Proof
using
Type
*.
split
;
auto
.
split
;
auto
.
-
intros
n
x
y
?
Hcx
%
core_ne
Hx
;
move
:
Hcx
.
rewrite
/
core
/=
Hx
/=.
-
intros
n
x
y
?
Hcx
%
core_ne
Hx
;
move
:
Hcx
.
rewrite
/
core
/=
Hx
/=.
...
@@ -850,7 +869,7 @@ End cmra_transport.
...
@@ -850,7 +869,7 @@ End cmra_transport.
(** * Instances *)
(** * Instances *)
(** ** Discrete CMRA *)
(** ** Discrete CMRA *)
Record
RAMixin
A
`
{
Equiv
A
,
PCore
A
,
Op
A
,
Valid
A
}
:
=
{
Record
ra_laws
A
`
{
Equiv
A
,
PCore
A
,
Op
A
,
Valid
A
}
:
=
{
(* setoids *)
(* setoids *)
ra_op_proper
(
x
:
A
)
:
Proper
((
≡
)
==>
(
≡
))
(
op
x
)
;
ra_op_proper
(
x
:
A
)
:
Proper
((
≡
)
==>
(
≡
))
(
op
x
)
;
ra_core_proper
x
y
cx
:
ra_core_proper
x
y
cx
:
...
@@ -869,18 +888,19 @@ Record RAMixin A `{Equiv A, PCore A, Op A, Valid A} := {
...
@@ -869,18 +888,19 @@ Record RAMixin A `{Equiv A, PCore A, Op A, Valid A} := {
Section
discrete
.
Section
discrete
.
Local
Set
Default
Proof
Using
"Type*"
.
Local
Set
Default
Proof
Using
"Type*"
.
Context
`
{
Equiv
A
,
PCore
A
,
Op
A
,
Valid
A
,
@
Equivalence
A
(
≡
)}.
Context
`
{
Equiv
A
,
PCore
A
,
Op
A
,
Valid
A
,
@
Equivalence
A
(
≡
)}.
Context
(
ra_mix
:
RAMixin
A
).
Context
(
laws
:
ra_laws
A
).
Existing
Instances
discrete_dist
.
Existing
Instances
discrete_dist
.
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_
laws
:
cmra_laws
A
.
Proof
.
Proof
.
destruct
ra_mix
;
split
;
try
done
.
destruct
laws
;
split
;
try
done
.
-
intros
x
;
split
;
first
done
.
by
move
=>
/(
_
0
).
-
intros
x
;
split
;
first
done
.
by
move
=>
/(
_
0
).
-
intros
n
x
y1
y2
??
;
by
exists
y1
,
y2
.
-
intros
n
x
y1
y2
??
;
by
exists
y1
,
y2
.
Qed
.
Qed
.
End
discrete
.
End
discrete
.
(*
Notation discreteR A ra_mix :=
Notation discreteR A ra_mix :=
(CMRAT A discrete_ofe_mixin (discrete_cmra_mixin ra_mix)).
(CMRAT A discrete_ofe_mixin (discrete_cmra_mixin ra_mix)).
Notation discreteUR A ra_mix ucmra_mix :=
Notation discreteUR A ra_mix ucmra_mix :=
...
@@ -889,7 +909,7 @@ Notation discreteUR A ra_mix ucmra_mix :=
...
@@ -889,7 +909,7 @@ Notation discreteUR A ra_mix ucmra_mix :=
Global Instance discrete_cmra_discrete `{Equiv A, PCore A, Op A, Valid A,
Global Instance discrete_cmra_discrete `{Equiv A, PCore A, Op A, Valid A,
@Equivalence A (≡)} (ra_mix : RAMixin A) : CMRADiscrete (discreteR A ra_mix).
@Equivalence A (≡)} (ra_mix : RAMixin A) : CMRADiscrete (discreteR A ra_mix).
Proof. split. apply _. done. Qed.
Proof. split. apply _. done. Qed.
*)
Section
ra_total
.
Section
ra_total
.
Local
Set
Default
Proof
Using
"Type*"
.
Local
Set
Default
Proof
Using
"Type*"
.
Context
A
`
{
Equiv
A
,
PCore
A
,
Op
A
,
Valid
A
}.
Context
A
`
{
Equiv
A
,
PCore
A
,
Op
A
,
Valid
A
}.
...
@@ -903,7 +923,7 @@ Section ra_total.
...
@@ -903,7 +923,7 @@ Section ra_total.
Context
(
core_idemp
:
∀
x
:
A
,
core
(
core
x
)
≡
core
x
).
Context
(
core_idemp
:
∀
x
:
A
,
core
(
core
x
)
≡
core
x
).
Context
(
core_mono
:
∀
x
y
:
A
,
x
≼
y
→
core
x
≼
core
y
).
Context
(
core_mono
:
∀
x
y
:
A
,
x
≼
y
→
core
x
≼
core
y
).
Context
(
valid_op_l
:
∀
x
y
:
A
,
✓
(
x
⋅
y
)
→
✓
x
).
Context
(
valid_op_l
:
∀
x
y
:
A
,
✓
(
x
⋅
y
)
→
✓
x
).
Lemma
ra_total_
mixin
:
RAMixin
A
.
Lemma
ra_total_
laws
:
ra_laws
A
.
Proof
.
Proof
.
split
;
auto
.
split
;
auto
.
-
intros
x
y
?
Hcx
%
core_proper
Hx
;
move
:
Hcx
.
rewrite
/
core
/=
Hx
/=.
-
intros
x
y
?
Hcx
%
core_proper
Hx
;
move
:
Hcx
.
rewrite
/
core
/=
Hx
/=.
...
@@ -922,15 +942,17 @@ Section unit.
...
@@ -922,15 +942,17 @@ Section unit.
Instance
unit_validN
:
ValidN
()
:
=
λ
n
x
,
True
.
Instance
unit_validN
:
ValidN
()
:
=
λ
n
x
,
True
.
Instance
unit_pcore
:
PCore
()
:
=
λ
x
,
Some
x
.
Instance
unit_pcore
:
PCore
()
:
=
λ
x
,
Some
x
.
Instance
unit_op
:
Op
()
:
=
λ
x
y
,
().
Instance
unit_op
:
Op
()
:
=
λ
x
y
,
().
Lemma
unit_cmra_mixin
:
CMRAMixin
().
Lemma
unit_cmra_laws
:
cmra_laws
().
Proof
.
apply
discrete_cmra_mixin
,
ra_total_mixin
;
by
eauto
.
Qed
.
Proof
.
apply
discrete_cmra_laws
,
ra_total_laws
;
by
eauto
.
Qed
.
Canonical
Structure
unitR
:
cmraT
:
=
CMRAT
()
unit_ofe_mixin
unit_cmra_mixin
.
Definition
unit_cmra_mixin
:
=
CMRAMixin
unit_ofe_laws
unit_cmra_laws
.
Canonical
Structure
unitR
:
cmraT
:
=
CMRAT
()
unit_cmra_mixin
.
Instance
unit_empty
:
Empty
()
:
=
().
Instance
unit_empty
:
Empty
()
:
=
().
Lemma
unit_ucmra_
mixin
:
UCMRAMixin
().
Lemma
unit_ucmra_
laws
:
ucmra_laws
().
Proof
.
done
.
Qed
.
Proof
.
done
.
Qed
.
Canonical
Structure
unitUR
:
ucmraT
:
=
Definition
unit_ucmra_mixin
:
=
UCMRAT
()
unit_ofe_mixin
unit_cmra_mixin
unit_ucmra_mixin
.
UCMRAMixin
unit_ofe_laws
unit_cmra_laws
unit_ucmra_laws
.
Canonical
Structure
unitUR
:
ucmraT
:
=
UCMRAT
()
unit_ucmra_mixin
.
Global
Instance
unit_cmra_discrete
:
CMRADiscrete
unitR
.
Global
Instance
unit_cmra_discrete
:
CMRADiscrete
unitR
.
Proof
.
done
.
Qed
.
Proof
.
done
.
Qed
.
...
@@ -953,31 +975,35 @@ Section nat.
...
@@ -953,31 +975,35 @@ Section nat.
-
intros
[
z
->]
;
unfold
op
,
nat_op
;
lia
.
-
intros
[
z
->]
;
unfold
op
,
nat_op
;
lia
.
-
exists
(
y
-
x
).
by
apply
le_plus_minus
.
-
exists
(
y
-
x
).
by
apply
le_plus_minus
.
Qed
.
Qed
.
Lemma
nat_ra_
mixin
:
RAMixin
nat
.
Lemma
nat_ra_
laws
:
ra_laws
nat
.
Proof
.
Proof
.
apply
ra_total_
mixin
;
try
by
eauto
.
apply
ra_total_
laws
;
try
by
eauto
.
-
solve_proper
.
-
solve_proper
.
-
intros
x
y
z
.
apply
Nat
.
add_assoc
.
-
intros
x
y
z
.
apply
Nat
.
add_assoc
.
-
intros
x
y
.
apply
Nat
.
add_comm
.
-
intros
x
y
.
apply
Nat
.
add_comm
.
-
by
exists
0
.
-
by
exists
0
.
Qed
.
Qed
.
(*
Definition nat_cmra_mixin := CMRAMixin unit_ofe_laws unit_cmra_laws.
Canonical Structure natR : cmraT := discreteR nat nat_ra_mixin.
Canonical Structure natR : cmraT := discreteR nat nat_ra_mixin.
*)
Instance
nat_empty
:
Empty
nat
:
=
0
.
Instance
nat_empty
:
Empty
nat
:
=
0
.
Lemma
nat_ucmra_
mixin
:
UCMRAMixin
nat
.
Lemma
nat_ucmra_
laws
:
ucmra_laws
nat
.
Proof
.
split
;
apply
_
||
done
.
Qed
.
Proof
.
split
;
apply
_
||
done
.
Qed
.
(*
Canonical Structure natUR : ucmraT :=
Canonical Structure natUR : ucmraT :=
discreteUR nat nat_ra_mixin nat_ucmra_mixin.
discreteUR nat nat_ra_mixin nat_ucmra_mixin.
Global Instance nat_cmra_discrete : CMRADiscrete natR.
Global Instance nat_cmra_discrete : CMRADiscrete natR.
Proof. constructor; apply _ || done. Qed.
Proof. constructor; apply _ || done. Qed.
Global Instance nat_cancelable (x : nat) : Cancelable x.
Global Instance nat_cancelable (x : nat) : Cancelable x.
Proof. by intros ???? ?%Nat.add_cancel_l. Qed.
Proof. by intros ???? ?%Nat.add_cancel_l. Qed.
*)
End
nat
.
End
nat
.
Definition
mnat
:
=
nat
.
Definition
mnat
:
=
nat
.
(*
Section mnat.
Section mnat.
Instance mnat_valid : Valid mnat := λ x, True.
Instance mnat_valid : Valid mnat := λ x, True.
Instance mnat_validN : ValidN mnat := λ n x, True.
Instance mnat_validN : ValidN mnat := λ n x, True.
...
@@ -1045,6 +1071,7 @@ Section positive.
...
@@ -1045,6 +1071,7 @@ Section positive.
by apply leibniz_equiv.
by apply leibniz_equiv.
Qed.
Qed.
End positive.
End positive.
*)
(** ** Product *)
(** ** Product *)
Section
prod
.
Section
prod
.
...
@@ -1082,7 +1109,7 @@ Section prod.
...
@@ -1082,7 +1109,7 @@ Section prod.
intros
[[
z1
Hz1
]
[
z2
Hz2
]]
;
exists
(
z1
,
z2
)
;
split
;
auto
.
intros
[[
z1
Hz1
]
[
z2
Hz2
]]
;
exists
(
z1
,
z2
)
;
split
;
auto
.
Qed
.
Qed
.
Definition
prod_cmra_
mixin
:
CMRAMixin
(
A
*
B
).
Definition
prod_cmra_
laws
:
cmra_laws
(
A
*
B
).
Proof
.
Proof
.
split
;
try
apply
_
.
split
;
try
apply
_
.
-
by
intros
n
x
y1
y2
[
Hy1
Hy2
]
;
split
;
rewrite
/=
?Hy1
?Hy2
.
-
by
intros
n
x
y1
y2
[
Hy1
Hy2
]
;
split
;
rewrite
/=
?Hy1
?Hy2
.
...
@@ -1111,8 +1138,8 @@ Section prod.
...
@@ -1111,8 +1138,8 @@ Section prod.
destruct
(
cmra_extend
n
(
x
.
2
)
(
y1
.
2
)
(
y2
.
2
))
as
(
z21
&
z22
&?&?&?)
;
auto
.
destruct
(
cmra_extend
n
(
x
.
2
)
(
y1
.
2
)
(
y2
.
2
))
as
(
z21
&
z22
&?&?&?)
;
auto
.
by
exists
(
z11
,
z21
),
(
z12
,
z22
).
by
exists
(
z11
,
z21
),
(
z12
,
z22
).
Qed
.
Qed
.
Canonical
Structure
prodR
:
=
Definition
prod_cmra_mixin
:
=
CMRAMixin
prod_ofe_laws
prod_cmra_laws
.
CMRAT
(
A
*
B
)
prod_ofe_mixin
prod_cmra_mixin
.
Canonical
Structure
prodR
:
=
CMRAT
(
A
*
B
)
prod_cmra_mixin
.
Lemma
pair_op
(
a
a'
:
A
)
(
b
b'
:
B
)
:
(
a
,
b
)
⋅
(
a'
,
b'
)
=
(
a
⋅
a'
,
b
⋅
b'
).
Lemma
pair_op
(
a
a'
:
A
)
(
b
b'
:
B
)
:
(
a
,
b
)
⋅
(
a'
,
b'
)
=
(
a
⋅
a'
,
b
⋅
b'
).
Proof
.
done
.
Qed
.
Proof
.
done
.
Qed
.
...
@@ -1152,15 +1179,16 @@ Section prod_unit.
...
@@ -1152,15 +1179,16 @@ Section prod_unit.
Context
{
A
B
:
ucmraT
}.
Context
{
A
B
:
ucmraT
}.
Instance
prod_empty
`
{
Empty
A
,
Empty
B
}
:
Empty
(
A
*
B
)
:
=
(
∅
,
∅
).
Instance
prod_empty
`
{
Empty
A
,
Empty
B
}
:
Empty
(
A
*
B
)
:
=
(
∅
,
∅
).
Lemma
prod_ucmra_
mixin
:
UCMRAMixin
(
A
*
B
).
Lemma
prod_ucmra_
laws
:
ucmra_laws
(
A
*
B
).
Proof
.
Proof
.
split
.
split
.
-
split
;
apply
ucmra_unit_valid
.
-
split
;
apply
ucmra_unit_valid
.
-
by
split
;
rewrite
/=
left_id
.
-
by
split
;
rewrite
/=
left_id
.
-
rewrite
prod_pcore_Some'
;
split
;
apply
(
persistent
_
).
-
rewrite
prod_pcore_Some'
;
split
;
apply
(
persistent
_
).
Qed
.
Qed
.
Canonical
Structure
prodUR
:
=
Definition
prod_ucmra_mixin
:
=
UCMRAT
(
A
*
B
)
prod_ofe_mixin
prod_cmra_mixin
prod_ucmra_mixin
.
UCMRAMixin
prod_ofe_laws
prod_cmra_laws
prod_ucmra_laws
.