Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Marianna Rapoport
iris-coq
Commits
ab451b4b
Commit
ab451b4b
authored
Jun 08, 2017
by
Robbert Krebbers
Browse files
Merge FromOp and IntoOp into IsOp and perform some tweak the modes.
parent
39a5e48f
Changes
7
Hide whitespace changes
Inline
Side-by-side
theories/algebra/auth.v
View file @
ab451b4b
...
...
@@ -248,11 +248,8 @@ Arguments authR : clear implicits.
Arguments
authUR
:
clear
implicits
.
(* Proof mode class instances *)
Instance
from_op_auth_frag
{
A
:
ucmraT
}
(
a
b1
b2
:
A
)
:
FromOp
a
b1
b2
→
FromOp
(
◯
a
)
(
◯
b1
)
(
◯
b2
).
Proof
.
done
.
Qed
.
Instance
into_op_auth_frag
{
A
:
ucmraT
}
(
a
b1
b2
:
A
)
:
IntoOp
a
b1
b2
→
IntoOp
(
◯
a
)
(
◯
b1
)
(
◯
b2
).
Instance
is_op_auth_frag
{
A
:
ucmraT
}
(
a
b1
b2
:
A
)
:
IsOp
a
b1
b2
→
IsOp'
(
◯
a
)
(
◯
b1
)
(
◯
b2
).
Proof
.
done
.
Qed
.
(* Functor *)
...
...
theories/algebra/frac.v
View file @
ab451b4b
...
...
@@ -50,7 +50,5 @@ Proof. done. Qed.
Lemma
frac_valid'
(
p
:
Qp
)
:
✓
p
↔
(
p
≤
1
%
Qp
)%
Qc
.
Proof
.
done
.
Qed
.
Global
Instance
frac_into_op
q
:
IntoOp
q
(
q
/
2
)%
Qp
(
q
/
2
)%
Qp
.
Proof
.
by
rewrite
/
IntoOp
frac_op'
Qp_div_2
.
Qed
.
Global
Instance
frac_from_op
q
:
FromOp
q
(
q
/
2
)%
Qp
(
q
/
2
)%
Qp
.
Proof
.
by
rewrite
/
FromOp
frac_op'
Qp_div_2
.
Qed
.
\ No newline at end of file
Global
Instance
is_op_frac
q
:
IsOp'
q
(
q
/
2
)%
Qp
(
q
/
2
)%
Qp
.
Proof
.
by
rewrite
/
IsOp'
/
IsOp
frac_op'
Qp_div_2
.
Qed
.
theories/algebra/frac_auth.v
View file @
ab451b4b
...
...
@@ -89,23 +89,14 @@ Section frac_auth.
Lemma
frac_auth_frag_valid_op_1_l
q
a
b
:
✓
(
◯
!{
1
}
a
⋅
◯
!{
q
}
b
)
→
False
.
Proof
.
rewrite
-
frag_auth_op
frac_auth_frag_valid
=>
-[/
exclusive_l
[]].
Qed
.
Global
Instance
into_op_frac_auth
(
q
q1
q2
:
frac
)
(
a
a1
a2
:
A
)
:
IntoOp
q
q1
q2
→
IntoOp
a
a1
a2
→
IntoOp
(
◯
!{
q
}
a
)
(
◯
!{
q1
}
a1
)
(
◯
!{
q2
}
a2
).
Proof
.
by
rewrite
/
IntoOp
=>
/
leibniz_equiv_iff
->
->.
Qed
.
Global
Instance
from_op_frac_auth
(
q
q1
q2
:
frac
)
(
a
a1
a2
:
A
)
:
FromOp
q
q1
q2
→
FromOp
a
a1
a2
→
FromOp
(
◯
!{
q
}
a
)
(
◯
!{
q1
}
a1
)
(
◯
!{
q2
}
a2
).
Proof
.
by
rewrite
/
FromOp
=>
/
leibniz_equiv_iff
<-
<-.
Qed
.
Global
Instance
into_op_frac_auth_persistent
(
q
q1
q2
:
frac
)
(
a
:
A
)
:
Persistent
a
→
IntoOp
q
q1
q2
→
IntoOp
(
◯
!{
q
}
a
)
(
◯
!{
q1
}
a
)
(
◯
!{
q2
}
a
).
Proof
.
rewrite
/
IntoOp
=>
?
/
leibniz_equiv_iff
->.
by
rewrite
-
frag_auth_op
-
persistent_dup
.
Qed
.
Global
Instance
from_op_frac_auth_persistent
(
q
q1
q2
:
frac
)
(
a
:
A
)
:
Persistent
a
→
FromOp
q
q1
q2
→
FromOp
(
◯
!{
q
}
a
)
(
◯
!{
q1
}
a
)
(
◯
!{
q2
}
a
).
Global
Instance
is_op_frac_auth
(
q
q1
q2
:
frac
)
(
a
a1
a2
:
A
)
:
IsOp
q
q1
q2
→
IsOp
a
a1
a2
→
IsOp'
(
◯
!{
q
}
a
)
(
◯
!{
q1
}
a1
)
(
◯
!{
q2
}
a2
).
Proof
.
by
rewrite
/
IsOp'
/
IsOp
=>
/
leibniz_equiv_iff
->
->.
Qed
.
Global
Instance
is_op_frac_auth_persistent
(
q
q1
q2
:
frac
)
(
a
:
A
)
:
Persistent
a
→
IsOp
q
q1
q2
→
IsOp'
(
◯
!{
q
}
a
)
(
◯
!{
q1
}
a
)
(
◯
!{
q2
}
a
).
Proof
.
rewrite
/
From
Op
=>
?
/
leibniz_equiv_iff
<
-.
rewrite
/
IsOp'
/
Is
Op
=>
?
/
leibniz_equiv_iff
-
>
.
by
rewrite
-
frag_auth_op
-
persistent_dup
.
Qed
.
...
...
theories/base_logic/lib/auth.v
View file @
ab451b4b
...
...
@@ -74,21 +74,21 @@ Section auth.
Proof
.
by
rewrite
/
auth_own
-
own_op
auth_frag_op
.
Qed
.
Global
Instance
from_and_auth_own
γ
a
b1
b2
:
From
Op
a
b1
b2
→
Is
Op
a
b1
b2
→
FromAnd
false
(
auth_own
γ
a
)
(
auth_own
γ
b1
)
(
auth_own
γ
b2
)
|
90
.
Proof
.
rewrite
/
From
Op
/
FromAnd
=>
<
-.
by
rewrite
auth_own_op
.
Qed
.
Proof
.
rewrite
/
Is
Op
/
FromAnd
=>
-
>
.
by
rewrite
auth_own_op
.
Qed
.
Global
Instance
from_and_auth_own_persistent
γ
a
b1
b2
:
From
Op
a
b1
b2
→
Or
(
Persistent
b1
)
(
Persistent
b2
)
→
Is
Op
a
b1
b2
→
Or
(
Persistent
b1
)
(
Persistent
b2
)
→
FromAnd
true
(
auth_own
γ
a
)
(
auth_own
γ
b1
)
(
auth_own
γ
b2
)
|
91
.
Proof
.
intros
?
Hper
;
apply
mk_from_and_persistent
;
[
destruct
Hper
;
apply
_
|].
by
rewrite
-
auth_own_op
from
_op
.
by
rewrite
-
auth_own_op
-
is
_op
.
Qed
.
Global
Instance
into_and_auth_own
p
γ
a
b1
b2
:
I
nto
Op
a
b1
b2
→
I
s
Op
a
b1
b2
→
IntoAnd
p
(
auth_own
γ
a
)
(
auth_own
γ
b1
)
(
auth_own
γ
b2
)
|
90
.
Proof
.
intros
.
apply
mk_into_and_sep
.
by
rewrite
(
i
nto
_op
a
)
auth_own_op
.
Qed
.
Proof
.
intros
.
apply
mk_into_and_sep
.
by
rewrite
(
i
s
_op
a
)
auth_own_op
.
Qed
.
Lemma
auth_own_mono
γ
a
b
:
a
≼
b
→
auth_own
γ
b
⊢
auth_own
γ
a
.
Proof
.
intros
[?
->].
by
rewrite
auth_own_op
sep_elim_l
.
Qed
.
...
...
theories/base_logic/lib/own.v
View file @
ab451b4b
...
...
@@ -187,16 +187,16 @@ Section proofmode_classes.
Implicit
Types
a
b
:
A
.
Global
Instance
into_and_own
p
γ
a
b1
b2
:
I
nto
Op
a
b1
b2
→
IntoAnd
p
(
own
γ
a
)
(
own
γ
b1
)
(
own
γ
b2
).
Proof
.
intros
.
apply
mk_into_and_sep
.
by
rewrite
(
i
nto
_op
a
)
own_op
.
Qed
.
I
s
Op
a
b1
b2
→
IntoAnd
p
(
own
γ
a
)
(
own
γ
b1
)
(
own
γ
b2
).
Proof
.
intros
.
apply
mk_into_and_sep
.
by
rewrite
(
i
s
_op
a
)
own_op
.
Qed
.
Global
Instance
from_and_own
γ
a
b1
b2
:
From
Op
a
b1
b2
→
FromAnd
false
(
own
γ
a
)
(
own
γ
b1
)
(
own
γ
b2
).
Proof
.
intros
.
by
rewrite
/
FromAnd
-
own_op
from
_op
.
Qed
.
Is
Op
a
b1
b2
→
FromAnd
false
(
own
γ
a
)
(
own
γ
b1
)
(
own
γ
b2
).
Proof
.
intros
.
by
rewrite
/
FromAnd
-
own_op
-
is
_op
.
Qed
.
Global
Instance
from_and_own_persistent
γ
a
b1
b2
:
From
Op
a
b1
b2
→
Or
(
Persistent
b1
)
(
Persistent
b2
)
→
Is
Op
a
b1
b2
→
Or
(
Persistent
b1
)
(
Persistent
b2
)
→
FromAnd
true
(
own
γ
a
)
(
own
γ
b1
)
(
own
γ
b2
).
Proof
.
intros
?
Hper
;
apply
mk_from_and_persistent
;
[
destruct
Hper
;
apply
_
|].
by
rewrite
-
own_op
from
_op
.
by
rewrite
-
own_op
-
is
_op
.
Qed
.
End
proofmode_classes
.
theories/proofmode/class_instances.v
View file @
ab451b4b
...
...
@@ -355,15 +355,15 @@ Proof.
Qed
.
Global
Instance
from_sep_ownM
(
a
b1
b2
:
M
)
:
From
Op
a
b1
b2
→
Is
Op
a
b1
b2
→
FromAnd
false
(
uPred_ownM
a
)
(
uPred_ownM
b1
)
(
uPred_ownM
b2
).
Proof
.
intros
.
by
rewrite
/
FromAnd
-
ownM_op
from
_op
.
Qed
.
Proof
.
intros
.
by
rewrite
/
FromAnd
-
ownM_op
-
is
_op
.
Qed
.
Global
Instance
from_sep_ownM_persistent
(
a
b1
b2
:
M
)
:
From
Op
a
b1
b2
→
Or
(
Persistent
b1
)
(
Persistent
b2
)
→
Is
Op
a
b1
b2
→
Or
(
Persistent
b1
)
(
Persistent
b2
)
→
FromAnd
true
(
uPred_ownM
a
)
(
uPred_ownM
b1
)
(
uPred_ownM
b2
).
Proof
.
intros
?
Hper
;
apply
mk_from_and_persistent
;
[
destruct
Hper
;
apply
_
|].
by
rewrite
-
ownM_op
from
_op
.
by
rewrite
-
ownM_op
-
is
_op
.
Qed
.
Global
Instance
from_sep_bupd
P
Q1
Q2
:
...
...
@@ -389,51 +389,28 @@ Global Instance from_sep_big_sepL_app_persistent {A} (Φ : nat → A → uPred M
Proof
.
intros
.
by
rewrite
/
FromAnd
big_opL_app
always_and_sep_l
.
Qed
.
(* FromOp *)
Global
Instance
from_op_op
{
A
:
cmraT
}
(
a
b
:
A
)
:
FromOp
(
a
⋅
b
)
a
b
|
100
.
Proof
.
by
rewrite
/
FromOp
.
Qed
.
(* TODO: Worst case there could be a lot of backtracking on these instances,
try to refactor. *)
Global
Instance
from_op_pair
{
A
B
:
cmraT
}
(
a
b1
b2
:
A
)
(
a'
b1'
b2'
:
B
)
:
FromOp
a
b1
b2
→
FromOp
a'
b1'
b2'
→
FromOp
(
a
,
a'
)
(
b1
,
b1'
)
(
b2
,
b2'
).
Proof
.
by
constructor
.
Qed
.
Global
Instance
from_op_pair_persistent_l
{
A
B
:
cmraT
}
(
a
:
A
)
(
a'
b1'
b2'
:
B
)
:
Persistent
a
→
FromOp
a'
b1'
b2'
→
FromOp
(
a
,
a'
)
(
a
,
b1'
)
(
a
,
b2'
).
Proof
.
constructor
=>
//=.
by
rewrite
-
persistent_dup
.
Qed
.
Global
Instance
from_op_pair_persistent_r
{
A
B
:
cmraT
}
(
a
b1
b2
:
A
)
(
a'
:
B
)
:
Persistent
a'
→
FromOp
a
b1
b2
→
FromOp
(
a
,
a'
)
(
b1
,
a'
)
(
b2
,
a'
).
Proof
.
constructor
=>
//=.
by
rewrite
-
persistent_dup
.
Qed
.
Global
Instance
from_op_Some
{
A
:
cmraT
}
(
a
:
A
)
b1
b2
:
FromOp
a
b1
b2
→
FromOp
(
Some
a
)
(
Some
b1
)
(
Some
b2
).
Proof
.
by
constructor
.
Qed
.
(* IntoOp *)
Global
Instance
into_op_op
{
A
:
cmraT
}
(
a
b
:
A
)
:
IntoOp
(
a
⋅
b
)
a
b
.
Proof
.
by
rewrite
/
IntoOp
.
Qed
.
Global
Instance
into_op_pair
{
A
B
:
cmraT
}
(
a
b1
b2
:
A
)
(
a'
b1'
b2'
:
B
)
:
IntoOp
a
b1
b2
→
IntoOp
a'
b1'
b2'
→
IntoOp
(
a
,
a'
)
(
b1
,
b1'
)
(
b2
,
b2'
).
Global
Instance
is_op_pair
{
A
B
:
cmraT
}
(
a
b1
b2
:
A
)
(
a'
b1'
b2'
:
B
)
:
IsOp'
a
b1
b2
→
IsOp
a'
b1'
b2'
→
IsOp'
(
a
,
a'
)
(
b1
,
b1'
)
(
b2
,
b2'
).
Proof
.
by
constructor
.
Qed
.
Global
Instance
i
nto
_op_pair_persistent_l
{
A
B
:
cmraT
}
(
a
:
A
)
(
a'
b1'
b2'
:
B
)
:
Persistent
a
→
I
nto
Op
a'
b1'
b2'
→
I
nto
Op
(
a
,
a'
)
(
a
,
b1'
)
(
a
,
b2'
).
Global
Instance
i
s
_op_pair_persistent_l
{
A
B
:
cmraT
}
(
a
:
A
)
(
a'
b1'
b2'
:
B
)
:
Persistent
a
→
I
s
Op
a'
b1'
b2'
→
I
s
Op
'
(
a
,
a'
)
(
a
,
b1'
)
(
a
,
b2'
).
Proof
.
constructor
=>
//=.
by
rewrite
-
persistent_dup
.
Qed
.
Global
Instance
i
nto
_op_pair_persistent_r
{
A
B
:
cmraT
}
(
a
b1
b2
:
A
)
(
a'
:
B
)
:
Persistent
a'
→
I
nto
Op
a
b1
b2
→
I
nto
Op
(
a
,
a'
)
(
b1
,
a'
)
(
b2
,
a'
).
Global
Instance
i
s
_op_pair_persistent_r
{
A
B
:
cmraT
}
(
a
b1
b2
:
A
)
(
a'
:
B
)
:
Persistent
a'
→
I
s
Op
a
b1
b2
→
I
s
Op
'
(
a
,
a'
)
(
b1
,
a'
)
(
b2
,
a'
).
Proof
.
constructor
=>
//=.
by
rewrite
-
persistent_dup
.
Qed
.
Global
Instance
i
nto
_op_Some
{
A
:
cmraT
}
(
a
:
A
)
b1
b2
:
I
nto
Op
a
b1
b2
→
I
nto
Op
(
Some
a
)
(
Some
b1
)
(
Some
b2
).
Global
Instance
i
s
_op_Some
{
A
:
cmraT
}
(
a
:
A
)
b1
b2
:
I
s
Op
a
b1
b2
→
I
s
Op
'
(
Some
a
)
(
Some
b1
)
(
Some
b2
).
Proof
.
by
constructor
.
Qed
.
(* IntoAnd *)
Global
Instance
into_and_sep
p
P
Q
:
IntoAnd
p
(
P
∗
Q
)
P
Q
.
Proof
.
by
apply
mk_into_and_sep
.
Qed
.
Global
Instance
into_and_ownM
p
(
a
b1
b2
:
M
)
:
IntoOp
a
b1
b2
→
IntoAnd
p
(
uPred_ownM
a
)
(
uPred_ownM
b1
)
(
uPred_ownM
b2
).
Proof
.
intros
.
apply
mk_into_and_sep
.
by
rewrite
(
into_op
a
)
ownM_op
.
Qed
.
IsOp
a
b1
b2
→
IntoAnd
p
(
uPred_ownM
a
)
(
uPred_ownM
b1
)
(
uPred_ownM
b2
).
Proof
.
intros
.
apply
mk_into_and_sep
.
by
rewrite
(
is_op
a
)
ownM_op
.
Qed
.
Global
Instance
into_and_and
P
Q
:
IntoAnd
true
(
P
∧
Q
)
P
Q
.
Proof
.
done
.
Qed
.
...
...
theories/proofmode/classes.v
View file @
ab451b4b
...
...
@@ -108,15 +108,36 @@ Lemma mk_into_and_sep {M} p (P Q1 Q2 : uPred M) :
(
P
⊢
Q1
∗
Q2
)
→
IntoAnd
p
P
Q1
Q2
.
Proof
.
rewrite
/
IntoAnd
=>->.
destruct
p
;
auto
using
sep_and
.
Qed
.
Class
FromOp
{
A
:
cmraT
}
(
a
b1
b2
:
A
)
:
=
from_op
:
b1
⋅
b2
≡
a
.
Arguments
from_op
{
_
}
_
_
_
{
_
}.
Hint
Mode
FromOp
+
!
-
-
:
typeclass_instances
.
Hint
Mode
FromOp
+
-
!
!
:
typeclass_instances
.
(* For iCombine *)
Class
IntoOp
{
A
:
cmraT
}
(
a
b1
b2
:
A
)
:
=
into_op
:
a
≡
b1
⋅
b2
.
Arguments
into_op
{
_
}
_
_
_
{
_
}.
(* No [Hint Mode] since we want to turn [?x] into [?x1 ⋅ ?x2], for example
when having [H : own ?x]. *)
(* There are various versions of [IsOp] with different modes:
- [IsOp a b1 b2]: this one has no mode, it can be used regardless of whether
any of the arguments is an evar. This class has only one direct instance:
[IsOp (a ⋅ b) a b].
- [IsOp' a b1 b2]: requires either [a] to start with a constructor, OR [b1] and
[b2] to start with a constructor. All usual instances should be of this
class to avoid loops.
- [IsOp'LR a b1 b2]: requires either [a] to start with a constructor. This one
has just one instance: [IsOp'LR (a ⋅ b) a b] with a very low precendence.
This is important so that when performing, for example, an [iDestruct] on
[own γ (q1 + q2)] where [q1] and [q2] are fractions, we actually get
[own γ q1] and [own γ q2] instead of [own γ ((q1 + q2)/2)] twice.
*)
Class
IsOp
{
A
:
cmraT
}
(
a
b1
b2
:
A
)
:
=
is_op
:
a
≡
b1
⋅
b2
.
Arguments
is_op
{
_
}
_
_
_
{
_
}.
Hint
Mode
IsOp
+
-
-
-
:
typeclass_instances
.
Instance
is_op_op
{
A
:
cmraT
}
(
a
b
:
A
)
:
IsOp
(
a
⋅
b
)
a
b
|
100
.
Proof
.
by
rewrite
/
IsOp
.
Qed
.
Class
IsOp'
{
A
:
cmraT
}
(
a
b1
b2
:
A
)
:
=
is_op'
:
>
IsOp
a
b1
b2
.
Hint
Mode
IsOp'
+
!
-
-
:
typeclass_instances
.
Hint
Mode
IsOp'
+
-
!
!
:
typeclass_instances
.
Class
IsOp'LR
{
A
:
cmraT
}
(
a
b1
b2
:
A
)
:
=
is_op_lr
:
IsOp
a
b1
b2
.
Existing
Instance
is_op_lr
|
0
.
Hint
Mode
IsOp'LR
+
!
-
-
:
typeclass_instances
.
Instance
is_op_lr_op
{
A
:
cmraT
}
(
a
b
:
A
)
:
IsOp'LR
(
a
⋅
b
)
a
b
|
0
.
Proof
.
by
rewrite
/
IsOp'LR
/
IsOp
.
Qed
.
Class
Frame
{
M
}
(
p
:
bool
)
(
R
P
Q
:
uPred
M
)
:
=
frame
:
□
?p
R
∗
Q
⊢
P
.
Arguments
frame
{
_
_
}
_
_
_
{
_
}.
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment