Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Iris
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Terraform modules
Monitor
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Pierre Roux
Iris
Commits
f51dbf7e
Commit
f51dbf7e
authored
3 years ago
by
Ralf Jung
Browse files
Options
Downloads
Patches
Plain Diff
remove DRA layer, implement STS directly as an RA
parent
2e9d27eb
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
_CoqProject
+0
-1
0 additions, 1 deletion
_CoqProject
iris/algebra/dra.v
+0
-218
0 additions, 218 deletions
iris/algebra/dra.v
iris/algebra/sts.v
+210
-65
210 additions, 65 deletions
iris/algebra/sts.v
iris_deprecated/base_logic/sts.v
+2
-2
2 additions, 2 deletions
iris_deprecated/base_logic/sts.v
with
212 additions
and
286 deletions
_CoqProject
+
0
−
1
View file @
f51dbf7e
...
@@ -28,7 +28,6 @@ iris/algebra/view.v
...
@@ -28,7 +28,6 @@ iris/algebra/view.v
iris/algebra/auth.v
iris/algebra/auth.v
iris/algebra/gmap.v
iris/algebra/gmap.v
iris/algebra/ofe.v
iris/algebra/ofe.v
iris/algebra/dra.v
iris/algebra/cofe_solver.v
iris/algebra/cofe_solver.v
iris/algebra/agree.v
iris/algebra/agree.v
iris/algebra/excl.v
iris/algebra/excl.v
...
...
This diff is collapsed.
Click to expand it.
iris/algebra/dra.v
deleted
100644 → 0
+
0
−
218
View file @
2e9d27eb
From
iris
.
algebra
Require
Export
cmra
updates
.
From
iris
.
prelude
Require
Import
options
.
Record
DraMixin
A
`{
Equiv
A
,
PCore
A
,
Disjoint
A
,
Op
A
,
Valid
A
}
:=
{
(* setoids *)
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
:
A
)
:
✓
x
→
✓
y
→
x
##
y
→
✓
(
x
⋅
y
);
mixin_dra_core_valid
(
x
:
A
)
:
✓
x
→
✓
core
x
;
(* monoid *)
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
:
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
:
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
{
dra_car
:>
Type
;
dra_equiv
:
Equiv
dra_car
;
dra_pcore
:
PCore
dra_car
;
dra_disjoint
:
Disjoint
dra_car
;
dra_op
:
Op
dra_car
;
dra_valid
:
Valid
dra_car
;
dra_mixin
:
DraMixin
dra_car
}
.
Global
Arguments
DraT
_
{_
_
_
_
_}
_
.
Global
Arguments
dra_car
:
simpl
never
.
Global
Arguments
dra_equiv
:
simpl
never
.
Global
Arguments
dra_pcore
:
simpl
never
.
Global
Arguments
dra_disjoint
:
simpl
never
.
Global
Arguments
dra_op
:
simpl
never
.
Global
Arguments
dra_valid
:
simpl
never
.
Global
Arguments
dra_mixin
:
simpl
never
.
Add
Printing
Constructor
draT
.
(* FIXME: Should some of these be [Global]? *)
Local
Existing
Instances
dra_equiv
dra_pcore
dra_disjoint
dra_op
dra_valid
.
(** Lifting properties from the mixin *)
Section
dra_mixin
.
Context
{
A
:
draT
}
.
Implicit
Types
x
y
:
A
.
Global
Instance
dra_equivalence
:
Equivalence
((
≡
)
:
relation
A
)
.
Proof
.
apply
(
mixin_dra_equivalence
_
(
dra_mixin
A
))
.
Qed
.
Global
Instance
dra_op_proper
:
Proper
((
≡
)
==>
(
≡
)
==>
(
≡
))
(
@
op
A
_)
.
Proof
.
apply
(
mixin_dra_op_proper
_
(
dra_mixin
A
))
.
Qed
.
Global
Instance
dra_core_proper
:
Proper
((
≡
)
==>
(
≡
))
(
@
core
A
_)
.
Proof
.
apply
(
mixin_dra_core_proper
_
(
dra_mixin
A
))
.
Qed
.
Global
Instance
dra_valid_proper
:
Proper
((
≡
)
==>
impl
)
(
@
valid
A
_)
.
Proof
.
apply
(
mixin_dra_valid_proper
_
(
dra_mixin
A
))
.
Qed
.
Global
Instance
dra_disjoint_proper
x
:
Proper
((
≡
)
==>
impl
)
(
disjoint
x
)
.
Proof
.
apply
(
mixin_dra_disjoint_proper
_
(
dra_mixin
A
))
.
Qed
.
Lemma
dra_op_valid
x
y
:
✓
x
→
✓
y
→
x
##
y
→
✓
(
x
⋅
y
)
.
Proof
.
apply
(
mixin_dra_op_valid
_
(
dra_mixin
A
))
.
Qed
.
Lemma
dra_core_valid
x
:
✓
x
→
✓
core
x
.
Proof
.
apply
(
mixin_dra_core_valid
_
(
dra_mixin
A
))
.
Qed
.
Lemma
dra_assoc
x
y
z
:
✓
x
→
✓
y
→
✓
z
→
x
##
y
→
x
⋅
y
##
z
→
x
⋅
(
y
⋅
z
)
≡
(
x
⋅
y
)
⋅
z
.
Proof
.
apply
(
mixin_dra_assoc
_
(
dra_mixin
A
))
.
Qed
.
Lemma
dra_disjoint_ll
x
y
z
:
✓
x
→
✓
y
→
✓
z
→
x
##
y
→
x
⋅
y
##
z
→
x
##
z
.
Proof
.
apply
(
mixin_dra_disjoint_ll
_
(
dra_mixin
A
))
.
Qed
.
Lemma
dra_disjoint_move_l
x
y
z
:
✓
x
→
✓
y
→
✓
z
→
x
##
y
→
x
⋅
y
##
z
→
x
##
y
⋅
z
.
Proof
.
apply
(
mixin_dra_disjoint_move_l
_
(
dra_mixin
A
))
.
Qed
.
Global
Instance
dra_symmetric
:
Symmetric
(
@
disjoint
A
_)
.
Proof
.
apply
(
mixin_dra_symmetric
_
(
dra_mixin
A
))
.
Qed
.
Lemma
dra_comm
x
y
:
✓
x
→
✓
y
→
x
##
y
→
x
⋅
y
≡
y
⋅
x
.
Proof
.
apply
(
mixin_dra_comm
_
(
dra_mixin
A
))
.
Qed
.
Lemma
dra_core_disjoint_l
x
:
✓
x
→
core
x
##
x
.
Proof
.
apply
(
mixin_dra_core_disjoint_l
_
(
dra_mixin
A
))
.
Qed
.
Lemma
dra_core_l
x
:
✓
x
→
core
x
⋅
x
≡
x
.
Proof
.
apply
(
mixin_dra_core_l
_
(
dra_mixin
A
))
.
Qed
.
Lemma
dra_core_idemp
x
:
✓
x
→
core
(
core
x
)
≡
core
x
.
Proof
.
apply
(
mixin_dra_core_idemp
_
(
dra_mixin
A
))
.
Qed
.
Lemma
dra_core_mono
x
y
:
∃
z
,
✓
x
→
✓
y
→
x
##
y
→
core
(
x
⋅
y
)
≡
core
x
⋅
z
∧
✓
z
∧
core
x
##
z
.
Proof
.
apply
(
mixin_dra_core_mono
_
(
dra_mixin
A
))
.
Qed
.
End
dra_mixin
.
Record
validity
(
A
:
draT
)
:=
Validity
{
validity_car
:
A
;
validity_is_valid
:
Prop
;
validity_prf
:
validity_is_valid
→
valid
validity_car
}
.
Add
Printing
Constructor
validity
.
Global
Arguments
Validity
{_}
_
_
_
.
Global
Arguments
validity_car
{_}
_
.
Global
Arguments
validity_is_valid
{_}
_
.
Definition
to_validity
{
A
:
draT
}
(
x
:
A
)
:
validity
A
:=
Validity
x
(
valid
x
)
id
.
(* The actual construction *)
Section
dra
.
Context
(
A
:
draT
)
.
Implicit
Types
a
b
:
A
.
Implicit
Types
x
y
z
:
validity
A
.
Local
Arguments
valid
_
_
!
_
/.
Local
Instance
validity_valid_instance
:
Valid
(
validity
A
)
:=
validity_is_valid
.
Local
Instance
validity_equiv
:
Equiv
(
validity
A
)
:=
λ
x
y
,
(
valid
x
↔
valid
y
)
∧
(
valid
x
→
validity_car
x
≡
validity_car
y
)
.
Local
Instance
validity_equivalence
:
Equivalence
(
@
equiv
(
validity
A
)
_)
.
Proof
.
split
;
unfold
equiv
,
validity_equiv
.
-
by
intros
[
x
px
?];
simpl
.
-
intros
[
x
px
?]
[
y
py
?];
naive_solver
.
-
intros
[
x
px
?]
[
y
py
?]
[
z
pz
?]
[?
Hxy
]
[?
Hyz
];
simpl
in
*.
split
;
[|
intros
;
trans
y
];
tauto
.
Qed
.
Canonical
Structure
validityO
:
ofe
:=
discreteO
(
validity
A
)
.
Local
Instance
dra_valid_proper'
:
Proper
((
≡
)
==>
iff
)
(
valid
:
A
→
Prop
)
.
Proof
.
by
split
;
apply
:
dra_valid_proper
.
Qed
.
Global
Instance
to_validity_proper
:
Proper
((
≡
)
==>
(
≡
))
to_validity
.
Proof
.
by
intros
x1
x2
Hx
;
split
;
rewrite
/=
Hx
.
Qed
.
Local
Instance
:
Proper
((
≡
)
==>
(
≡
)
==>
iff
)
(
disjoint
:
relation
A
)
.
Proof
.
intros
x1
x2
Hx
y1
y2
Hy
;
split
.
-
by
rewrite
Hy
(
symmetry_iff
(
##
)
x1
)
(
symmetry_iff
(
##
)
x2
)
Hx
.
-
by
rewrite
-
Hy
(
symmetry_iff
(
##
)
x2
)
(
symmetry_iff
(
##
)
x1
)
-
Hx
.
Qed
.
Lemma
dra_disjoint_rl
a
b
c
:
✓
a
→
✓
b
→
✓
c
→
b
##
c
→
a
##
b
⋅
c
→
a
##
b
.
Proof
.
intros
???
.
rewrite
!
(
symmetry_iff
_
a
)
.
by
apply
dra_disjoint_ll
.
Qed
.
Lemma
dra_disjoint_lr
a
b
c
:
✓
a
→
✓
b
→
✓
c
→
a
##
b
→
a
⋅
b
##
c
→
b
##
c
.
Proof
.
intros
????
.
rewrite
dra_comm
//.
by
apply
dra_disjoint_ll
.
Qed
.
Lemma
dra_disjoint_move_r
a
b
c
:
✓
a
→
✓
b
→
✓
c
→
b
##
c
→
a
##
b
⋅
c
→
a
⋅
b
##
c
.
Proof
.
intros
;
symmetry
;
rewrite
dra_comm
;
eauto
using
dra_disjoint_rl
.
apply
dra_disjoint_move_l
;
auto
;
by
rewrite
dra_comm
.
Qed
.
Local
Hint
Immediate
dra_disjoint_move_l
dra_disjoint_move_r
:
core
.
Lemma
validity_valid_car_valid
z
:
✓
z
→
✓
validity_car
z
.
Proof
.
apply
validity_prf
.
Qed
.
Local
Hint
Resolve
validity_valid_car_valid
:
core
.
Local
Program
Instance
validity_pcore_instance
:
PCore
(
validity
A
)
:=
λ
x
,
Some
(
Validity
(
core
(
validity_car
x
))
(
✓
x
)
_)
.
Solve
Obligations
with
naive_solver
eauto
using
dra_core_valid
.
Local
Program
Instance
validity_op_instance
:
Op
(
validity
A
)
:=
λ
x
y
,
Validity
(
validity_car
x
⋅
validity_car
y
)
(
✓
x
∧
✓
y
∧
validity_car
x
##
validity_car
y
)
_
.
Solve
Obligations
with
naive_solver
eauto
using
dra_op_valid
.
Definition
validity_ra_mixin
:
RAMixin
(
validity
A
)
.
Proof
.
apply
ra_total_mixin
;
first
eauto
.
-
intros
???
[?
Heq
];
split
;
simpl
;
[|
by
intros
(?
&
?
&
?);
rewrite
Heq
]
.
split
;
intros
(?
&
?
&
?);
split_and
!
;
first
[
rewrite
?Heq
;
tauto
|
rewrite
-
?Heq
;
tauto
|
tauto
]
.
-
by
intros
??
[?
Heq
];
split
;
[
done
|];
simpl
;
intros
?;
rewrite
Heq
.
-
intros
??
[??];
naive_solver
.
-
intros
[
x
px
?]
[
y
py
?]
[
z
pz
?];
split
;
simpl
;
[
intuition
eauto
2
using
dra_disjoint_lr
,
dra_disjoint_rl
|
intuition
eauto
using
dra_assoc
,
dra_disjoint_rl
]
.
-
intros
[
x
px
?]
[
y
py
?];
split
;
naive_solver
eauto
using
dra_comm
.
-
intros
[
x
px
?];
split
;
naive_solver
eauto
using
dra_core_l
,
dra_core_disjoint_l
.
-
intros
[
x
px
?];
split
;
naive_solver
eauto
using
dra_core_idemp
.
-
intros
[
x
px
?]
[
y
py
?]
[[
z
pz
?]
[?
Hy
]];
simpl
in
*.
destruct
(
dra_core_mono
x
z
)
as
(
z'
&
Hz'
)
.
unshelve
eexists
(
Validity
z'
(
px
∧
py
∧
pz
)
_)
.
{
intros
(?
&
?
&
?);
apply
Hz'
;
tauto
.
}
split
;
simpl
;
first
tauto
.
intros
.
rewrite
Hy
//.
tauto
.
-
by
intros
[
x
px
?]
[
y
py
?]
(?
&
?
&
?)
.
Qed
.
Canonical
Structure
validityR
:
cmra
:=
discreteR
(
validity
A
)
validity_ra_mixin
.
Global
Instance
validity_disrete_cmra
:
CmraDiscrete
validityR
.
Proof
.
apply
discrete_cmra_discrete
.
Qed
.
Global
Instance
validity_cmra_total
:
CmraTotal
validityR
.
Proof
.
rewrite
/
CmraTotal
;
eauto
.
Qed
.
Lemma
validity_update
x
y
:
(
∀
c
,
✓
x
→
✓
c
→
validity_car
x
##
c
→
✓
y
∧
validity_car
y
##
c
)
→
x
~~>
y
.
Proof
.
intros
Hxy
;
apply
cmra_discrete_update
=>
z
[?[??]]
.
split_and
!
;
try
eapply
Hxy
;
eauto
.
Qed
.
Lemma
to_validity_op
a
b
:
(
✓
(
a
⋅
b
)
→
✓
a
∧
✓
b
∧
a
##
b
)
→
to_validity
(
a
⋅
b
)
≡
to_validity
a
⋅
to_validity
b
.
Proof
.
split
;
naive_solver
eauto
using
dra_op_valid
.
Qed
.
(* TODO: This has to be proven again. *)
(*
Lemma to_validity_included x y:
(✓ y ∧ to_validity x ≼ to_validity y)%stdpp ↔ (✓ x ∧ x ≼ y).
Proof.
split.
- move=>[Hvl [z [Hvxz EQ]]]. move:(Hvl)=>Hvl'. apply Hvxz in Hvl'.
destruct Hvl' as [? [? ?]]; split; first done.
exists (validity_car z); eauto.
- intros (Hvl & z & EQ & ? & ?).
assert (✓ y) by (rewrite EQ; by apply dra_op_valid).
split; first done. exists (to_validity z). split; first split.
+ intros _. simpl. by split_and!.
+ intros _. setoid_subst. by apply dra_op_valid.
+ intros _. rewrite /= EQ //.
Qed.
*)
End
dra
.
This diff is collapsed.
Click to expand it.
iris/algebra/sts.v
+
210
−
65
View file @
f51dbf7e
From
stdpp
Require
Export
propset
.
From
stdpp
Require
Export
propset
.
From
iris
.
algebra
Require
Export
cmra
.
From
iris
.
algebra
Require
Export
cmra
updates
.
From
iris
.
algebra
Require
Import
dra
.
From
iris
.
prelude
Require
Import
options
.
From
iris
.
prelude
Require
Import
options
.
Local
Arguments
valid
_
_
!
_
/.
Local
Arguments
valid
_
_
!
_
/.
Local
Arguments
op
_
_
!
_
!
_
/.
Local
Arguments
op
_
_
!
_
!
_
/.
...
@@ -174,8 +173,9 @@ End sts.
...
@@ -174,8 +173,9 @@ End sts.
Notation
steps
:=
(
rtc
step
)
.
Notation
steps
:=
(
rtc
step
)
.
Notation
frame_steps
T
:=
(
rtc
(
frame_step
T
))
.
Notation
frame_steps
T
:=
(
rtc
(
frame_step
T
))
.
(* The type of bounds we can give to the state of an STS. This is the type
(* The type of bounds we can give to the state of an STS. On paper, this is the
that we equip with an RA structure. *)
type that we equip with an RA structure. In Coq we have to do some work to
model composition only being defined under some non-computable conditions. *)
Inductive
car
(
sts
:
stsT
)
:=
Inductive
car
(
sts
:
stsT
)
:=
|
auth
:
state
sts
→
propset
(
token
sts
)
→
car
sts
|
auth
:
state
sts
→
propset
(
token
sts
)
→
car
sts
|
frag
:
propset
(
state
sts
)
→
propset
(
token
sts
)
→
car
sts
.
|
frag
:
propset
(
state
sts
)
→
propset
(
token
sts
)
→
car
sts
.
...
@@ -186,39 +186,39 @@ End sts.
...
@@ -186,39 +186,39 @@ End sts.
Notation
stsT
:=
sts
.
stsT
.
Notation
stsT
:=
sts
.
stsT
.
Notation
Sts
:=
sts
.
Sts
.
Notation
Sts
:=
sts
.
Sts
.
(** * STSs form a
disjoint
RA *)
(** * STSs form a
n
RA *)
Section
sts_
dra
.
Section
sts_
res
.
Context
(
sts
:
stsT
)
.
Context
{
sts
:
stsT
}
.
Import
sts
.
Import
sts
.
Implicit
Types
S
:
states
sts
.
Implicit
Types
S
:
states
sts
.
Implicit
Types
T
:
tokens
sts
.
Implicit
Types
T
:
tokens
sts
.
Inductive
sts_equiv
:
Equiv
(
car
sts
)
:=
Inductive
sts_
car_
equiv
:
Equiv
(
car
sts
)
:=
|
auth_equiv
s
T1
T2
:
T1
≡
T2
→
auth
s
T1
≡
auth
s
T2
|
auth_equiv
s
T1
T2
:
T1
≡
T2
→
auth
s
T1
≡
auth
s
T2
|
frag_equiv
S1
S2
T1
T2
:
T1
≡
T2
→
S1
≡
S2
→
frag
S1
T1
≡
frag
S2
T2
.
|
frag_equiv
S1
S2
T1
T2
:
T1
≡
T2
→
S1
≡
S2
→
frag
S1
T1
≡
frag
S2
T2
.
Local
Existing
Instance
sts_equiv
.
Local
Existing
Instance
sts_
car_
equiv
.
Local
Instance
sts_valid_instance
:
Valid
(
car
sts
)
:=
λ
x
,
Local
Instance
sts_
car_
valid_instance
:
Valid
(
car
sts
)
:=
λ
x
,
match
x
with
match
x
with
|
auth
s
T
=>
tok
s
##
T
|
auth
s
T
=>
tok
s
##
T
|
frag
S'
T
=>
closed
S'
T
∧
∃
s
,
s
∈
S'
|
frag
S'
T
=>
closed
S'
T
∧
∃
s
,
s
∈
S'
end
.
end
.
Local
Instance
sts_core_instance
:
PCore
(
car
sts
)
:=
λ
x
,
Local
Instance
sts_
car_
core_instance
:
PCore
(
car
sts
)
:=
λ
x
,
Some
match
x
with
Some
match
x
with
|
frag
S'
_
=>
frag
(
up_set
S'
∅
)
∅
|
frag
S'
_
=>
frag
(
up_set
S'
∅
)
∅
|
auth
s
_
=>
frag
(
up
s
∅
)
∅
|
auth
s
_
=>
frag
(
up
s
∅
)
∅
end
.
end
.
Inductive
sts_disjoint
:
Disjoint
(
car
sts
)
:=
Inductive
sts_
car_
disjoint
_instance
:
Disjoint
(
car
sts
)
:=
|
frag_frag_disjoint
S1
S2
T1
T2
:
|
frag_frag_disjoint
S1
S2
T1
T2
:
(
∃
s
,
s
∈
S1
∩
S2
)
→
T1
##
T2
→
frag
S1
T1
##
frag
S2
T2
(
∃
s
,
s
∈
S1
∩
S2
)
→
T1
##
T2
→
frag
S1
T1
##
frag
S2
T2
|
auth_frag_disjoint
s
S
T1
T2
:
s
∈
S
→
T1
##
T2
→
auth
s
T1
##
frag
S
T2
|
auth_frag_disjoint
s
S
T1
T2
:
s
∈
S
→
T1
##
T2
→
auth
s
T1
##
frag
S
T2
|
frag_auth_disjoint
s
S
T1
T2
:
s
∈
S
→
T1
##
T2
→
frag
S
T1
##
auth
s
T2
.
|
frag_auth_disjoint
s
S
T1
T2
:
s
∈
S
→
T1
##
T2
→
frag
S
T1
##
auth
s
T2
.
Local
Existing
Instance
sts_disjoint
.
Local
Existing
Instance
sts_
car_
disjoint
_instance
.
Local
Instance
sts_op_instance
:
Op
(
car
sts
)
:=
λ
x1
x2
,
Local
Instance
sts_op_instance
:
Op
(
car
sts
)
:=
λ
x1
x2
,
match
x1
,
x2
with
match
x1
,
x2
with
|
frag
S1
T1
,
frag
S2
T2
=>
frag
(
S1
∩
S2
)
(
T1
∪
T2
)
|
frag
S1
T1
,
frag
S2
T2
=>
frag
(
S1
∩
S2
)
(
T1
∪
T2
)
|
auth
s
T1
,
frag
_
T2
=>
auth
s
(
T1
∪
T2
)
|
auth
s
T1
,
frag
_
T2
=>
auth
s
(
T1
∪
T2
)
|
frag
_
T1
,
auth
s
T2
=>
auth
s
(
T1
∪
T2
)
|
frag
_
T1
,
auth
s
T2
=>
auth
s
(
T1
∪
T2
)
|
auth
s
T1
,
auth
_
T2
=>
auth
s
(
T1
∪
T2
)
(* never happens *)
|
auth
s
T1
,
auth
_
T2
=>
auth
s
(
T1
∪
T2
)
(* never happens *)
end
.
end
.
Local
Hint
Extern
50
(
equiv
(
A
:=
propset
_)
_
_)
=>
set_solver
:
sts
.
Local
Hint
Extern
50
(
equiv
(
A
:=
propset
_)
_
_)
=>
set_solver
:
sts
.
...
@@ -232,62 +232,199 @@ Proof. by constructor. Qed.
...
@@ -232,62 +232,199 @@ Proof. by constructor. Qed.
Global
Instance
frag_proper
:
Proper
((
≡
)
==>
(
≡
)
==>
(
≡
))
(
@
frag
sts
)
.
Global
Instance
frag_proper
:
Proper
((
≡
)
==>
(
≡
)
==>
(
≡
))
(
@
frag
sts
)
.
Proof
.
by
constructor
.
Qed
.
Proof
.
by
constructor
.
Qed
.
Local
Instance
sts_equivalence
:
Equivalence
((
≡
)
:
relation
(
car
sts
))
.
Local
Instance
sts_
car_
equivalence
:
Equivalence
((
≡
)
:
relation
(
car
sts
))
.
Proof
.
Proof
.
split
.
split
.
-
by
intros
[];
constructor
.
-
by
intros
[];
constructor
.
-
by
destruct
1
;
constructor
.
-
by
destruct
1
;
constructor
.
-
destruct
1
;
inversion_clear
1
;
constructor
;
etrans
;
eauto
.
-
destruct
1
;
inversion_clear
1
;
constructor
;
etrans
;
eauto
.
Qed
.
Qed
.
Lemma
sts_dra_mixin
:
DraMixin
(
car
sts
)
.
Local
Instance
sts_car_op_proper
:
Proper
((
≡@
{
car
sts
})
==>
(
≡
)
==>
(
≡
))
(
⋅
)
.
Proof
.
by
do
2
destruct
1
;
constructor
;
setoid_subst
.
Qed
.
Local
Instance
sts_car_core_proper
:
Proper
((
≡@
{
car
sts
})
==>
(
≡
))
core
.
Proof
.
by
destruct
1
;
constructor
;
setoid_subst
.
Qed
.
Local
Instance
sts_car_valid_proper
:
Proper
((
≡@
{
car
sts
})
==>
impl
)
valid
.
Proof
.
by
destruct
1
;
simpl
;
intros
?;
setoid_subst
.
Qed
.
Local
Instance
sts_car_valid_proper'
:
Proper
((
≡@
{
car
sts
})
==>
iff
)
valid
.
Proof
.
by
split
;
apply
:
sts_car_valid_proper
.
Qed
.
Local
Instance
sts_car_disjoint_proper
(
x
:
car
sts
)
:
Proper
((
≡
)
==>
impl
)
(
disjoint
x
)
.
Proof
.
Proof
.
split
.
by
intros
?
[|];
destruct
1
;
inversion_clear
1
;
econstructor
;
setoid_subst
.
-
apply
_
.
Qed
.
-
by
do
2
destruct
1
;
constructor
;
setoid_subst
.
-
by
destruct
1
;
constructor
;
setoid_subst
.
Local
Instance
sts_car_disjoint_symmetric
:
Symmetric
(
@
disjoint
(
car
sts
)
_)
.
-
by
destruct
1
;
simpl
;
intros
?;
setoid_subst
.
Proof
.
destruct
1
;
constructor
;
auto
with
sts
.
Qed
.
-
by
intros
?
[|];
destruct
1
;
inversion_clear
1
;
econstructor
;
setoid_subst
.
Local
Instance
sts_car_disjoint_proper'
:
-
destruct
3
;
simpl
in
*
;
destruct_and
?;
eauto
using
closed_op
;
Proper
((
≡@
{
car
sts
})
==>
(
≡
)
==>
iff
)
disjoint
.
select
(
closed
_
_)
(
fun
H
=>
destruct
H
);
set_solver
.
Proof
.
-
intros
[];
naive_solver
eauto
using
closed_up
,
closed_up_set
,
intros
x1
x2
Hx
y1
y2
Hy
;
split
.
-
by
rewrite
Hy
(
symmetry_iff
(
##
)
x1
)
(
symmetry_iff
(
##
)
x2
)
Hx
.
-
by
rewrite
-
Hy
(
symmetry_iff
(
##
)
x2
)
(
symmetry_iff
(
##
)
x1
)
-
Hx
.
Qed
.
Local
Lemma
sts_car_core_valid
(
x
:
car
sts
)
:
✓
x
→
✓
core
x
.
Proof
.
destruct
x
;
naive_solver
eauto
using
closed_up
,
closed_up_set
,
elem_of_up
,
elem_of_up_set
with
sts
.
elem_of_up
,
elem_of_up_set
with
sts
.
-
intros
[]
[]
[]
_
_
_
_
_;
constructor
;
rewrite
?assoc
;
auto
with
sts
.
Qed
.
-
destruct
4
;
inversion_clear
1
;
constructor
;
auto
with
sts
.
Local
Lemma
sts_car_op_valid
(
x
y
:
car
sts
)
:
-
destruct
4
;
inversion_clear
1
;
constructor
;
auto
with
sts
.
✓
x
→
✓
y
→
x
##
y
→
✓
(
x
⋅
y
)
.
-
destruct
1
;
constructor
;
auto
with
sts
.
Proof
.
-
destruct
3
;
constructor
;
auto
with
sts
.
destruct
3
;
simpl
in
*
;
destruct_and
?;
eauto
using
closed_op
;
-
intros
[];
constructor
;
eauto
with
sts
.
select
(
closed
_
_)
(
fun
H
=>
destruct
H
);
set_solver
.
-
intros
[];
constructor
;
auto
with
sts
.
Qed
.
-
intros
[
s
T
|
S
T
];
constructor
;
auto
with
sts
.
Local
Lemma
sts_car_op_assoc
(
x
y
z
:
car
sts
)
:
+
rewrite
(
up_closed
(
up
_
_));
auto
using
closed_up
with
sts
.
✓
x
→
✓
y
→
✓
z
→
x
##
y
→
x
⋅
y
##
z
→
x
⋅
(
y
⋅
z
)
≡
(
x
⋅
y
)
⋅
z
.
+
rewrite
(
up_closed
(
up_set
_
_));
eauto
using
closed_up_set
with
sts
.
Proof
.
-
intros
x
y
.
exists
(
core
(
x
⋅
y
))=>
??
Hxy
;
split_and
?
.
destruct
x
,
y
,
z
;
intros
_
_
_
_
_;
constructor
;
rewrite
?assoc
;
auto
with
sts
.
+
destruct
Hxy
;
constructor
;
unfold
up_set
;
set_solver
.
Qed
.
+
destruct
Hxy
;
simpl
;
Local
Lemma
sts_car_op_comm
(
x
y
:
car
sts
)
:
eauto
using
closed_up_set_empty
,
closed_up_empty
with
sts
.
✓
x
→
✓
y
→
x
##
y
→
x
⋅
y
≡
y
⋅
x
.
+
destruct
Hxy
;
econstructor
;
Proof
.
destruct
3
;
constructor
;
auto
with
sts
.
Qed
.
repeat
match
goal
with
|
|
-
context
[
up_set
?S
?T
]
=>
Local
Lemma
sts_car_disjoint_ll
(
x
y
z
:
car
sts
)
:
unless
(
S
⊆
up_set
S
T
)
by
done
;
pose
proof
(
subseteq_up_set
S
T
)
✓
x
→
✓
y
→
✓
z
→
x
##
y
→
x
⋅
y
##
z
→
x
##
z
.
|
|
-
context
[
up
?s
?T
]
=>
Proof
.
unless
(
s
∈
up
s
T
)
by
done
;
pose
proof
(
elem_of_up
s
T
)
destruct
4
;
inversion_clear
1
;
constructor
;
auto
with
sts
.
end
;
auto
with
sts
.
Qed
.
Qed
.
Local
Lemma
sts_car_disjoint_rl
(
x
y
z
:
car
sts
)
:
Canonical
Structure
stsDR
:
draT
:=
DraT
(
car
sts
)
sts_dra_mixin
.
✓
x
→
✓
y
→
✓
z
→
y
##
z
→
x
##
y
⋅
z
→
x
##
y
.
End
sts_dra
.
Proof
.
intros
???
.
rewrite
!
(
symmetry_iff
_
x
)
.
by
apply
sts_car_disjoint_ll
.
Qed
.
Local
Lemma
sts_car_disjoint_lr
(
x
y
z
:
car
sts
)
:
(** * The STS Resource Algebra *)
✓
x
→
✓
y
→
✓
z
→
x
##
y
→
x
⋅
y
##
z
→
y
##
z
.
Proof
.
intros
????
.
rewrite
sts_car_op_comm
//.
by
apply
sts_car_disjoint_ll
.
Qed
.
Local
Lemma
sts_car_disjoint_move_l
(
x
y
z
:
car
sts
)
:
✓
x
→
✓
y
→
✓
z
→
x
##
y
→
x
⋅
y
##
z
→
x
##
y
⋅
z
.
Proof
.
destruct
4
;
inversion_clear
1
;
constructor
;
auto
with
sts
.
Qed
.
Local
Lemma
sts_car_disjoint_move_r
(
a
b
c
:
car
sts
)
:
✓
a
→
✓
b
→
✓
c
→
b
##
c
→
a
##
b
⋅
c
→
a
⋅
b
##
c
.
Proof
.
intros
;
symmetry
;
rewrite
sts_car_op_comm
;
eauto
using
sts_car_disjoint_rl
.
apply
sts_car_disjoint_move_l
;
auto
;
by
rewrite
sts_car_op_comm
.
Qed
.
Local
Hint
Immediate
sts_car_disjoint_move_l
sts_car_disjoint_move_r
:
core
.
Local
Lemma
sts_car_core_disjoint_l
(
x
:
car
sts
)
:
✓
x
→
core
x
##
x
.
Proof
.
destruct
x
;
constructor
;
eauto
with
sts
.
Qed
.
Local
Lemma
sts_car_core_l
(
x
:
car
sts
)
:
✓
x
→
core
x
⋅
x
≡
x
.
Proof
.
destruct
x
;
constructor
;
eauto
with
sts
.
Qed
.
Local
Lemma
sts_car_core_idemp
(
x
:
car
sts
)
:
✓
x
→
core
(
core
x
)
≡
core
x
.
Proof
.
destruct
x
as
[
s
T
|
S
T
];
constructor
;
auto
with
sts
.
+
rewrite
(
up_closed
(
up
_
_));
auto
using
closed_up
with
sts
.
+
rewrite
(
up_closed
(
up_set
_
_));
eauto
using
closed_up_set
with
sts
.
Qed
.
Local
Lemma
sts_car_core_mono
(
x
y
:
car
sts
)
:
∃
z
,
✓
x
→
✓
y
→
x
##
y
→
core
(
x
⋅
y
)
≡
core
x
⋅
z
∧
✓
z
∧
core
x
##
z
.
Proof
.
exists
(
core
(
x
⋅
y
))=>
??
Hxy
;
split_and
?
.
+
destruct
Hxy
;
constructor
;
unfold
up_set
;
set_solver
.
+
destruct
Hxy
;
simpl
;
eauto
using
closed_up_set_empty
,
closed_up_empty
with
sts
.
+
destruct
Hxy
;
econstructor
;
repeat
match
goal
with
|
|
-
context
[
up_set
?S
?T
]
=>
unless
(
S
⊆
up_set
S
T
)
by
done
;
pose
proof
(
subseteq_up_set
S
T
)
|
|
-
context
[
up
?s
?T
]
=>
unless
(
s
∈
up
s
T
)
by
done
;
pose
proof
(
elem_of_up
s
T
)
end
;
auto
with
sts
.
Qed
.
(** The resource type for [sts]. *)
Record
sts_res
:=
StsRes
{
(** The underlying STS carrier element, storing the actual data. *)
sts_car
:
car
sts
;
(** Defines whether this element is valid. *)
sts_valid
:
Prop
;
(** Valid elements must have a valid carrier element. *)
sts_valid_prf
:
sts_valid
→
✓
sts_car
}
.
Add
Printing
Constructor
sts_res
.
Global
Arguments
StsRes
_
_
{_}
.
(** Setoid and OFE for [sts_res]. *)
Local
Instance
sts_equiv
:
Equiv
sts_res
:=
λ
x
y
,
(
sts_valid
x
↔
sts_valid
y
)
∧
(
sts_valid
x
→
sts_car
x
≡
sts_car
y
)
.
Local
Instance
sts_equivalence
:
Equivalence
(
@
equiv
sts_res
_)
.
Proof
.
split
;
unfold
equiv
,
sts_equiv
.
-
by
intros
[
x
px
?];
simpl
.
-
intros
[
x
px
?]
[
y
py
?];
naive_solver
.
-
intros
[
x
px
?]
[
y
py
?]
[
z
pz
?]
[?
Hxy
]
[?
Hyz
];
simpl
in
*.
split
;
[|
intros
;
trans
y
];
tauto
.
Qed
.
Canonical
Structure
sts_resO
:
ofe
:=
discreteO
sts_res
.
(** RA for [sts_res]. *)
Local
Instance
sts_res_valid_instance
:
Valid
sts_res
:=
sts_valid
.
Local
Program
Instance
sts_res_pcore_instance
:
PCore
sts_res
:=
λ
x
,
Some
(
StsRes
(
core
(
sts_car
x
))
(
✓
x
))
.
Next
Obligation
.
intros
[];
naive_solver
eauto
using
sts_car_core_valid
.
Qed
.
Local
Program
Instance
sts_res_op_instance
:
Op
sts_res
:=
λ
x
y
,
StsRes
(
sts_car
x
⋅
sts_car
y
)
(
✓
x
∧
✓
y
∧
sts_car
x
##
sts_car
y
)
.
Next
Obligation
.
intros
[]
[];
naive_solver
eauto
using
sts_car_op_valid
.
Qed
.
Definition
sts_res_ra_mixin
:
RAMixin
sts_res
.
Proof
.
apply
ra_total_mixin
;
first
eauto
.
-
intros
???
[?
Heq
];
split
;
simpl
;
[|
intros
(?
&
?
&
?);
by
rewrite
Heq
]
.
split
;
intros
(?
&
?
&
?);
split_and
!
;
first
[
rewrite
?Heq
;
tauto
|
rewrite
-
?Heq
;
tauto
|
tauto
]
.
-
by
intros
??
[?
Heq
];
split
;
[
done
|];
simpl
;
intros
?;
rewrite
Heq
.
-
intros
??
[??];
naive_solver
.
-
intros
[
x
px
?]
[
y
py
?]
[
z
pz
?];
split
;
simpl
;
[
intuition
eauto
2
using
sts_car_disjoint_lr
,
sts_car_disjoint_rl
|
intuition
eauto
using
sts_car_op_assoc
,
sts_car_disjoint_rl
]
.
-
intros
[
x
px
?]
[
y
py
?];
split
;
naive_solver
eauto
using
sts_car_op_comm
.
-
intros
[
x
px
?];
split
;
naive_solver
eauto
using
sts_car_core_l
,
sts_car_core_disjoint_l
.
-
intros
[
x
px
?];
split
;
naive_solver
eauto
using
sts_car_core_idemp
.
-
intros
[
x
px
?]
[
y
py
?]
[[
z
pz
?]
[?
Hy
]];
simpl
in
*.
destruct
(
sts_car_core_mono
x
z
)
as
(
z'
&
Hz'
)
.
unshelve
eexists
(
StsRes
z'
(
px
∧
py
∧
pz
))
.
{
intros
(?
&
?
&
?);
apply
Hz'
;
tauto
.
}
split
;
simpl
;
first
tauto
.
intros
.
rewrite
Hy
//.
tauto
.
-
by
intros
[
x
px
?]
[
y
py
?]
(?
&
?
&
?)
.
Qed
.
Canonical
Structure
sts_resR
:
cmra
:=
discreteR
sts_res
sts_res_ra_mixin
.
Global
Instance
sts_res_disrete_cmra
:
CmraDiscrete
sts_resR
.
Proof
.
apply
discrete_cmra_discrete
.
Qed
.
Global
Instance
sts_res_cmra_total
:
CmraTotal
sts_resR
.
Proof
.
rewrite
/
CmraTotal
;
eauto
.
Qed
.
Local
Definition
to_sts_res
(
x
:
car
sts
)
:
sts_res
:=
@
StsRes
x
(
valid
x
)
id
.
Global
Instance
to_sts_res_proper
:
Proper
((
≡
)
==>
(
≡
))
to_sts_res
.
Proof
.
by
intros
x1
x2
Hx
;
split
;
rewrite
/=
Hx
.
Qed
.
Lemma
to_sts_res_op
a
b
:
(
✓
(
a
⋅
b
)
→
✓
a
∧
✓
b
∧
a
##
b
)
→
to_sts_res
(
a
⋅
b
)
≡
to_sts_res
a
⋅
to_sts_res
b
.
Proof
.
split
;
naive_solver
eauto
using
sts_car_op_valid
.
Qed
.
End
sts_res
.
Global
Arguments
sts_resR
:
clear
implicits
.
(** Finally, the general theory of STS that should be used by users *)
(** Finally, the general theory of STS that should be used by users *)
Notation
stsC
sts
:=
(
validityO
(
stsDR
sts
))
.
Notation
stsR
sts
:=
(
validityR
(
stsDR
sts
))
.
Section
sts_definitions
.
Section
sts_definitions
.
Context
{
sts
:
stsT
}
.
Context
{
sts
:
stsT
}
.
Definition
sts_auth
(
s
:
sts
.
state
sts
)
(
T
:
sts
.
tokens
sts
)
:
stsR
sts
:=
Definition
sts_auth
(
s
:
sts
.
state
sts
)
(
T
:
sts
.
tokens
sts
)
:
sts
_res
R
sts
:=
to_
validity
(
sts
.
auth
s
T
)
.
to_
sts_res
(
sts
.
auth
s
T
)
.
Definition
sts_frag
(
S
:
sts
.
states
sts
)
(
T
:
sts
.
tokens
sts
)
:
stsR
sts
:=
Definition
sts_frag
(
S
:
sts
.
states
sts
)
(
T
:
sts
.
tokens
sts
)
:
sts
_res
R
sts
:=
to_
validity
(
sts
.
frag
S
T
)
.
to_
sts_res
(
sts
.
frag
S
T
)
.
Definition
sts_frag_up
(
s
:
sts
.
state
sts
)
(
T
:
sts
.
tokens
sts
)
:
stsR
sts
:=
Definition
sts_frag_up
(
s
:
sts
.
state
sts
)
(
T
:
sts
.
tokens
sts
)
:
sts
_res
R
sts
:=
sts_frag
(
sts
.
up
s
T
)
T
.
sts_frag
(
sts
.
up
s
T
)
T
.
End
sts_definitions
.
End
sts_definitions
.
Global
Instance
:
Params
(
@
sts_auth
)
2
:=
{}
.
Global
Instance
:
Params
(
@
sts_auth
)
2
:=
{}
.
...
@@ -300,7 +437,7 @@ Context {sts : stsT}.
...
@@ -300,7 +437,7 @@ Context {sts : stsT}.
Implicit
Types
s
:
state
sts
.
Implicit
Types
s
:
state
sts
.
Implicit
Types
S
:
states
sts
.
Implicit
Types
S
:
states
sts
.
Implicit
Types
T
:
tokens
sts
.
Implicit
Types
T
:
tokens
sts
.
Local
Arguments
d
ra_valid
_
!
_
/.
Local
Arguments
cm
ra_valid
_
!
_
/.
(** Setoids *)
(** Setoids *)
Global
Instance
sts_auth_proper
s
:
Proper
((
≡
)
==>
(
≡
))
(
sts_auth
s
)
.
Global
Instance
sts_auth_proper
s
:
Proper
((
≡
)
==>
(
≡
))
(
sts_auth
s
)
.
...
@@ -352,7 +489,7 @@ Lemma sts_frag_op S1 S2 T1 T2 :
...
@@ -352,7 +489,7 @@ Lemma sts_frag_op S1 S2 T1 T2 :
T1
##
T2
→
sts
.
closed
S1
T1
→
sts
.
closed
S2
T2
→
T1
##
T2
→
sts
.
closed
S1
T1
→
sts
.
closed
S2
T2
→
sts_frag
(
S1
∩
S2
)
(
T1
∪
T2
)
≡
sts_frag
S1
T1
⋅
sts_frag
S2
T2
.
sts_frag
(
S1
∩
S2
)
(
T1
∪
T2
)
≡
sts_frag
S1
T1
⋅
sts_frag
S2
T2
.
Proof
.
Proof
.
intros
HT
HS1
HS2
.
rewrite
/
sts_frag
-
to_
validity
_op
//.
intros
HT
HS1
HS2
.
rewrite
/
sts_frag
-
to_
sts_res
_op
//.
move
=>
/=
[?[?
?]]
.
split_and
!
;
[
set_solver
..|
constructor
;
set_solver
]
.
move
=>
/=
[?[?
?]]
.
split_and
!
;
[
set_solver
..|
constructor
;
set_solver
]
.
Qed
.
Qed
.
...
@@ -367,8 +504,10 @@ Lemma sts_frag_up_op s T1 T2 :
...
@@ -367,8 +504,10 @@ Lemma sts_frag_up_op s T1 T2 :
Lemma
sts_update_auth
s1
s2
T1
T2
:
Lemma
sts_update_auth
s1
s2
T1
T2
:
steps
(
s1
,
T1
)
(
s2
,
T2
)
→
sts_auth
s1
T1
~~>
sts_auth
s2
T2
.
steps
(
s1
,
T1
)
(
s2
,
T2
)
→
sts_auth
s1
T1
~~>
sts_auth
s2
T2
.
Proof
.
Proof
.
intros
?;
apply
validity_update
.
intros
?
.
apply
cmra_discrete_update
.
inversion
3
as
[|?
S
?
Tf
|];
simplify_eq
/=
;
destruct_and
?
.
intros
[
x
x_val
Hx_val
];
simpl
.
intros
(
Htok
&
Hval
&
Hdisj
)
.
specialize
(
Hx_val
Hval
)
.
inversion
Hdisj
as
[|?
S
?
Tf
|];
simplify_eq
/=
;
destruct_and
?
.
destruct
(
steps_closed
s1
s2
T1
T2
S
Tf
)
as
(?
&
?
&
?);
auto
;
[]
.
destruct
(
steps_closed
s1
s2
T1
T2
S
Tf
)
as
(?
&
?
&
?);
auto
;
[]
.
repeat
(
done
||
constructor
)
.
repeat
(
done
||
constructor
)
.
Qed
.
Qed
.
...
@@ -376,14 +515,18 @@ Qed.
...
@@ -376,14 +515,18 @@ Qed.
Lemma
sts_update_frag
S1
S2
T1
T2
:
Lemma
sts_update_frag
S1
S2
T1
T2
:
(
closed
S1
T1
→
closed
S2
T2
∧
S1
⊆
S2
∧
T2
⊆
T1
)
→
sts_frag
S1
T1
~~>
sts_frag
S2
T2
.
(
closed
S1
T1
→
closed
S2
T2
∧
S1
⊆
S2
∧
T2
⊆
T1
)
→
sts_frag
S1
T1
~~>
sts_frag
S2
T2
.
Proof
.
Proof
.
rewrite
/
sts_frag
=>
HC
HS
HT
.
apply
validity_update
.
rewrite
/
sts_frag
=>
HC
HS
HT
.
apply
cmra_discrete_update
.
inversion
3
as
[|?
S
?
Tf
|];
simplify_eq
/=
;
intros
[
x
x_val
Hx_val
];
simpl
.
intros
(
Htok
&
Hval
&
Hdisj
)
.
specialize
(
Hx_val
Hval
)
.
inversion
Hdisj
as
[|?
S
?
Tf
|];
simplify_eq
/=
;
(
destruct
HC
as
(?
&
?
&
?);
first
by
destruct_and
?)
.
(
destruct
HC
as
(?
&
?
&
?);
first
by
destruct_and
?)
.
-
split_and
!
;
first
done
.
-
split_and
!
;
first
done
.
+
set_solver
.
+
set_solver
.
+
done
.
+
constructor
;
set_solver
.
+
constructor
;
set_solver
.
-
split_and
!
;
first
done
.
-
split_and
!
;
first
done
.
+
set_solver
.
+
set_solver
.
+
done
.
+
constructor
;
set_solver
.
+
constructor
;
set_solver
.
Qed
.
Qed
.
...
@@ -408,7 +551,9 @@ Qed.
...
@@ -408,7 +551,9 @@ Qed.
Global
Instance
sts_frag_core_id
S
:
CoreId
(
sts_frag
S
∅
)
.
Global
Instance
sts_frag_core_id
S
:
CoreId
(
sts_frag
S
∅
)
.
Proof
.
Proof
.
constructor
;
split
=>
//=
[[??]]
.
by
rewrite
/
dra
.
dra_pcore
/=
sts
.
up_closed
.
constructor
;
split
=>
//=
[[??]]
.
(* FIXME: rewriting with [sts.up_closed] for some reason fails here. *)
f_equiv
.
by
rewrite
sts
.
up_closed
.
Qed
.
Qed
.
(** Inclusion *)
(** Inclusion *)
...
...
This diff is collapsed.
Click to expand it.
iris_deprecated/base_logic/sts.v
+
2
−
2
View file @
f51dbf7e
...
@@ -10,11 +10,11 @@ Import uPred.
...
@@ -10,11 +10,11 @@ Import uPred.
(** The CMRA we need. *)
(** The CMRA we need. *)
Class
stsG
Σ
(
sts
:
stsT
)
:=
StsG
{
Class
stsG
Σ
(
sts
:
stsT
)
:=
StsG
{
sts_inG
:>
inG
Σ
(
stsR
sts
);
sts_inG
:>
inG
Σ
(
sts
_res
R
sts
);
sts_inhabited
:>
Inhabited
(
sts
.
state
sts
);
sts_inhabited
:>
Inhabited
(
sts
.
state
sts
);
}
.
}
.
Definition
stsΣ
(
sts
:
stsT
)
:
gFunctors
:=
#
[
GFunctor
(
stsR
sts
)
]
.
Definition
stsΣ
(
sts
:
stsT
)
:
gFunctors
:=
#
[
GFunctor
(
sts
_res
R
sts
)
]
.
Global
Instance
subG_stsΣ
Σ
sts
:
Global
Instance
subG_stsΣ
Σ
sts
:
subG
(
stsΣ
sts
)
Σ
→
Inhabited
(
sts
.
state
sts
)
→
stsG
Σ
sts
.
subG
(
stsΣ
sts
)
Σ
→
Inhabited
(
sts
.
state
sts
)
→
stsG
Σ
sts
.
Proof
.
solve_inG
.
Qed
.
Proof
.
solve_inG
.
Qed
.
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment