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
Rodolphe Lepigre
Iris
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.
...
@@ -248,11 +248,8 @@ Arguments authR : clear implicits.
Arguments
authUR
:
clear
implicits
.
Arguments
authUR
:
clear
implicits
.
(* Proof mode class instances *)
(* Proof mode class instances *)
Instance
from_op_auth_frag
{
A
:
ucmraT
}
(
a
b1
b2
:
A
)
:
Instance
is_op_auth_frag
{
A
:
ucmraT
}
(
a
b1
b2
:
A
)
:
FromOp
a
b1
b2
→
FromOp
(
◯
a
)
(
◯
b1
)
(
◯
b2
).
IsOp
a
b1
b2
→
IsOp'
(
◯
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
).
Proof
.
done
.
Qed
.
Proof
.
done
.
Qed
.
(* Functor *)
(* Functor *)
...
...
theories/algebra/frac.v
View file @
ab451b4b
...
@@ -50,7 +50,5 @@ Proof. done. Qed.
...
@@ -50,7 +50,5 @@ Proof. done. Qed.
Lemma
frac_valid'
(
p
:
Qp
)
:
✓
p
↔
(
p
≤
1
%
Qp
)%
Qc
.
Lemma
frac_valid'
(
p
:
Qp
)
:
✓
p
↔
(
p
≤
1
%
Qp
)%
Qc
.
Proof
.
done
.
Qed
.
Proof
.
done
.
Qed
.
Global
Instance
frac_into_op
q
:
IntoOp
q
(
q
/
2
)%
Qp
(
q
/
2
)%
Qp
.
Global
Instance
is_op_frac
q
:
IsOp'
q
(
q
/
2
)%
Qp
(
q
/
2
)%
Qp
.
Proof
.
by
rewrite
/
IntoOp
frac_op'
Qp_div_2
.
Qed
.
Proof
.
by
rewrite
/
IsOp'
/
IsOp
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
theories/algebra/frac_auth.v
View file @
ab451b4b
...
@@ -89,23 +89,14 @@ Section frac_auth.
...
@@ -89,23 +89,14 @@ Section frac_auth.
Lemma
frac_auth_frag_valid_op_1_l
q
a
b
:
✓
(
◯
!{
1
}
a
⋅
◯
!{
q
}
b
)
→
False
.
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
.
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
)
:
Global
Instance
is_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
).
IsOp
q
q1
q2
→
IsOp
a
a1
a2
→
IsOp'
(
◯
!{
q
}
a
)
(
◯
!{
q1
}
a1
)
(
◯
!{
q2
}
a2
).
Proof
.
by
rewrite
/
IntoOp
=>
/
leibniz_equiv_iff
->
->.
Qed
.
Proof
.
by
rewrite
/
IsOp'
/
IsOp
=>
/
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
).
Global
Instance
is_op_frac_auth_persistent
(
q
q1
q2
:
frac
)
(
a
:
A
)
:
Proof
.
by
rewrite
/
FromOp
=>
/
leibniz_equiv_iff
<-
<-.
Qed
.
Persistent
a
→
IsOp
q
q1
q2
→
IsOp'
(
◯
!{
q
}
a
)
(
◯
!{
q1
}
a
)
(
◯
!{
q2
}
a
).
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
).
Proof
.
Proof
.
rewrite
/
From
Op
=>
?
/
leibniz_equiv_iff
<
-.
rewrite
/
IsOp'
/
Is
Op
=>
?
/
leibniz_equiv_iff
-
>
.
by
rewrite
-
frag_auth_op
-
persistent_dup
.
by
rewrite
-
frag_auth_op
-
persistent_dup
.
Qed
.
Qed
.
...
...
theories/base_logic/lib/auth.v
View file @
ab451b4b
...
@@ -74,21 +74,21 @@ Section auth.
...
@@ -74,21 +74,21 @@ Section auth.
Proof
.
by
rewrite
/
auth_own
-
own_op
auth_frag_op
.
Qed
.
Proof
.
by
rewrite
/
auth_own
-
own_op
auth_frag_op
.
Qed
.
Global
Instance
from_and_auth_own
γ
a
b1
b2
:
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
.
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
:
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
.
FromAnd
true
(
auth_own
γ
a
)
(
auth_own
γ
b1
)
(
auth_own
γ
b2
)
|
91
.
Proof
.
Proof
.
intros
?
Hper
;
apply
mk_from_and_persistent
;
[
destruct
Hper
;
apply
_
|].
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
.
Qed
.
Global
Instance
into_and_auth_own
p
γ
a
b1
b2
:
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
.
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
.
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
.
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.
...
@@ -187,16 +187,16 @@ Section proofmode_classes.
Implicit
Types
a
b
:
A
.
Implicit
Types
a
b
:
A
.
Global
Instance
into_and_own
p
γ
a
b1
b2
:
Global
Instance
into_and_own
p
γ
a
b1
b2
:
I
nto
Op
a
b1
b2
→
IntoAnd
p
(
own
γ
a
)
(
own
γ
b1
)
(
own
γ
b2
).
I
s
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
.
Proof
.
intros
.
apply
mk_into_and_sep
.
by
rewrite
(
i
s
_op
a
)
own_op
.
Qed
.
Global
Instance
from_and_own
γ
a
b1
b2
:
Global
Instance
from_and_own
γ
a
b1
b2
:
From
Op
a
b1
b2
→
FromAnd
false
(
own
γ
a
)
(
own
γ
b1
)
(
own
γ
b2
).
Is
Op
a
b1
b2
→
FromAnd
false
(
own
γ
a
)
(
own
γ
b1
)
(
own
γ
b2
).
Proof
.
intros
.
by
rewrite
/
FromAnd
-
own_op
from
_op
.
Qed
.
Proof
.
intros
.
by
rewrite
/
FromAnd
-
own_op
-
is
_op
.
Qed
.
Global
Instance
from_and_own_persistent
γ
a
b1
b2
:
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
).
FromAnd
true
(
own
γ
a
)
(
own
γ
b1
)
(
own
γ
b2
).
Proof
.
Proof
.
intros
?
Hper
;
apply
mk_from_and_persistent
;
[
destruct
Hper
;
apply
_
|].
intros
?
Hper
;
apply
mk_from_and_persistent
;
[
destruct
Hper
;
apply
_
|].
by
rewrite
-
own_op
from
_op
.
by
rewrite
-
own_op
-
is
_op
.
Qed
.
Qed
.
End
proofmode_classes
.
End
proofmode_classes
.
theories/proofmode/class_instances.v
View file @
ab451b4b
...
@@ -355,15 +355,15 @@ Proof.
...
@@ -355,15 +355,15 @@ Proof.
Qed
.
Qed
.
Global
Instance
from_sep_ownM
(
a
b1
b2
:
M
)
:
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
).
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
)
:
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
).
FromAnd
true
(
uPred_ownM
a
)
(
uPred_ownM
b1
)
(
uPred_ownM
b2
).
Proof
.
Proof
.
intros
?
Hper
;
apply
mk_from_and_persistent
;
[
destruct
Hper
;
apply
_
|].
intros
?
Hper
;
apply
mk_from_and_persistent
;
[
destruct
Hper
;
apply
_
|].
by
rewrite
-
ownM_op
from
_op
.
by
rewrite
-
ownM_op
-
is
_op
.
Qed
.
Qed
.
Global
Instance
from_sep_bupd
P
Q1
Q2
:
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
...
@@ -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
.
Proof
.
intros
.
by
rewrite
/
FromAnd
big_opL_app
always_and_sep_l
.
Qed
.
(* FromOp *)
(* 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,
(* TODO: Worst case there could be a lot of backtracking on these instances,
try to refactor. *)
try to refactor. *)
Global
Instance
from_op_pair
{
A
B
:
cmraT
}
(
a
b1
b2
:
A
)
(
a'
b1'
b2'
:
B
)
:
Global
Instance
is_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'
).
IsOp'
a
b1
b2
→
IsOp
a'
b1'
b2'
→
IsOp'
(
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'
).
Proof
.
by
constructor
.
Qed
.
Proof
.
by
constructor
.
Qed
.
Global
Instance
i
nto
_op_pair_persistent_l
{
A
B
:
cmraT
}
(
a
:
A
)
(
a'
b1'
b2'
:
B
)
:
Global
Instance
i
s
_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'
).
Persistent
a
→
I
s
Op
a'
b1'
b2'
→
I
s
Op
'
(
a
,
a'
)
(
a
,
b1'
)
(
a
,
b2'
).
Proof
.
constructor
=>
//=.
by
rewrite
-
persistent_dup
.
Qed
.
Proof
.
constructor
=>
//=.
by
rewrite
-
persistent_dup
.
Qed
.
Global
Instance
i
nto
_op_pair_persistent_r
{
A
B
:
cmraT
}
(
a
b1
b2
:
A
)
(
a'
:
B
)
:
Global
Instance
i
s
_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'
).
Persistent
a'
→
I
s
Op
a
b1
b2
→
I
s
Op
'
(
a
,
a'
)
(
b1
,
a'
)
(
b2
,
a'
).
Proof
.
constructor
=>
//=.
by
rewrite
-
persistent_dup
.
Qed
.
Proof
.
constructor
=>
//=.
by
rewrite
-
persistent_dup
.
Qed
.
Global
Instance
i
nto
_op_Some
{
A
:
cmraT
}
(
a
:
A
)
b1
b2
:
Global
Instance
i
s
_op_Some
{
A
:
cmraT
}
(
a
:
A
)
b1
b2
:
I
nto
Op
a
b1
b2
→
I
nto
Op
(
Some
a
)
(
Some
b1
)
(
Some
b2
).
I
s
Op
a
b1
b2
→
I
s
Op
'
(
Some
a
)
(
Some
b1
)
(
Some
b2
).
Proof
.
by
constructor
.
Qed
.
Proof
.
by
constructor
.
Qed
.
(* IntoAnd *)
(* IntoAnd *)
Global
Instance
into_and_sep
p
P
Q
:
IntoAnd
p
(
P
∗
Q
)
P
Q
.
Global
Instance
into_and_sep
p
P
Q
:
IntoAnd
p
(
P
∗
Q
)
P
Q
.
Proof
.
by
apply
mk_into_and_sep
.
Qed
.
Proof
.
by
apply
mk_into_and_sep
.
Qed
.
Global
Instance
into_and_ownM
p
(
a
b1
b2
:
M
)
:
Global
Instance
into_and_ownM
p
(
a
b1
b2
:
M
)
:
IntoOp
a
b1
b2
→
IsOp
a
b1
b2
→
IntoAnd
p
(
uPred_ownM
a
)
(
uPred_ownM
b1
)
(
uPred_ownM
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
.
Proof
.
intros
.
apply
mk_into_and_sep
.
by
rewrite
(
into_op
a
)
ownM_op
.
Qed
.
Global
Instance
into_and_and
P
Q
:
IntoAnd
true
(
P
∧
Q
)
P
Q
.
Global
Instance
into_and_and
P
Q
:
IntoAnd
true
(
P
∧
Q
)
P
Q
.
Proof
.
done
.
Qed
.
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) :
...
@@ -108,15 +108,36 @@ Lemma mk_into_and_sep {M} p (P Q1 Q2 : uPred M) :
(
P
⊢
Q1
∗
Q2
)
→
IntoAnd
p
P
Q1
Q2
.
(
P
⊢
Q1
∗
Q2
)
→
IntoAnd
p
P
Q1
Q2
.
Proof
.
rewrite
/
IntoAnd
=>->.
destruct
p
;
auto
using
sep_and
.
Qed
.
Proof
.
rewrite
/
IntoAnd
=>->.
destruct
p
;
auto
using
sep_and
.
Qed
.
Class
FromOp
{
A
:
cmraT
}
(
a
b1
b2
:
A
)
:
=
from_op
:
b1
⋅
b2
≡
a
.
(* There are various versions of [IsOp] with different modes:
Arguments
from_op
{
_
}
_
_
_
{
_
}.
Hint
Mode
FromOp
+
!
-
-
:
typeclass_instances
.
- [IsOp a b1 b2]: this one has no mode, it can be used regardless of whether
Hint
Mode
FromOp
+
-
!
!
:
typeclass_instances
.
(* For iCombine *)
any of the arguments is an evar. This class has only one direct instance:
[IsOp (a ⋅ b) a b].
Class
IntoOp
{
A
:
cmraT
}
(
a
b1
b2
:
A
)
:
=
into_op
:
a
≡
b1
⋅
b2
.
- [IsOp' a b1 b2]: requires either [a] to start with a constructor, OR [b1] and
Arguments
into_op
{
_
}
_
_
_
{
_
}.
[b2] to start with a constructor. All usual instances should be of this
(* No [Hint Mode] since we want to turn [?x] into [?x1 ⋅ ?x2], for example
class to avoid loops.
when having [H : own ?x]. *)
- [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
.
Class
Frame
{
M
}
(
p
:
bool
)
(
R
P
Q
:
uPred
M
)
:
=
frame
:
□
?p
R
∗
Q
⊢
P
.
Arguments
frame
{
_
_
}
_
_
_
{
_
}.
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