Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Iris
Iris
Commits
ab451b4b
Commit
ab451b4b
authored
Jun 08, 2017
by
Robbert Krebbers
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Merge FromOp and IntoOp into IsOp and perform some tweak the modes.
parent
39a5e48f
Pipeline
#4245
passed with stage
in 2 minutes and 35 seconds
Changes
7
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
67 additions
and
83 deletions
+67
-83
theories/algebra/auth.v
theories/algebra/auth.v
+2
-5
theories/algebra/frac.v
theories/algebra/frac.v
+2
-4
theories/algebra/frac_auth.v
theories/algebra/frac_auth.v
+7
-16
theories/base_logic/lib/auth.v
theories/base_logic/lib/auth.v
+6
-6
theories/base_logic/lib/own.v
theories/base_logic/lib/own.v
+6
-6
theories/proofmode/class_instances.v
theories/proofmode/class_instances.v
+14
-37
theories/proofmode/classes.v
theories/proofmode/classes.v
+30
-9
No files found.
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
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment