Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
I
Iris
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
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
Ralf Jung
Iris
Commits
bd5feeea
Commit
bd5feeea
authored
7 years ago
by
Amin Timany
Committed by
Robbert Krebbers
7 years ago
Browse files
Options
Downloads
Patches
Plain Diff
Derived rules of the plain modality.
parent
660ce376
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
theories/base_logic/derived.v
+187
-18
187 additions, 18 deletions
theories/base_logic/derived.v
theories/base_logic/lib/fancy_updates.v
+39
-0
39 additions, 0 deletions
theories/base_logic/lib/fancy_updates.v
with
226 additions
and
18 deletions
theories/base_logic/derived.v
+
187
−
18
View file @
bd5feeea
...
...
@@ -39,6 +39,11 @@ Arguments persistentP {_} _ {_}.
Hint
Mode
PersistentP
+
!
:
typeclass_instances
.
Instance
:
Params
(
@
PersistentP
)
1
.
Class
PlainP
{
M
}
(
P
:
uPred
M
)
:=
plainP
:
P
⊢
☃
P
.
Arguments
plainP
{_}
_
{_}
.
Hint
Mode
PlainP
+
!
:
typeclass_instances
.
Instance
:
Params
(
@
PlainP
)
1
.
Module
uPred
.
Section
derived
.
Context
{
M
:
ucmraT
}
.
...
...
@@ -471,6 +476,104 @@ Proof. by apply forall_intro=> a; rewrite forall_elim. Qed.
Lemma
sep_forall_r
{
A
}
(
Φ
:
A
→
uPred
M
)
Q
:
(
∀
a
,
Φ
a
)
∗
Q
⊢
∀
a
,
Φ
a
∗
Q
.
Proof
.
by
apply
forall_intro
=>
a
;
rewrite
forall_elim
.
Qed
.
(* Plain modality *)
Global
Instance
plainly_mono'
:
Proper
((
⊢
)
==>
(
⊢
))
(
@
uPred_plainly
M
)
.
Proof
.
intros
P
Q
;
apply
plainly_mono
.
Qed
.
Global
Instance
naugth_flip_mono'
:
Proper
(
flip
(
⊢
)
==>
flip
(
⊢
))
(
@
uPred_plainly
M
)
.
Proof
.
intros
P
Q
;
apply
plainly_mono
.
Qed
.
Lemma
plainly_elim
P
:
☃
P
⊢
P
.
Proof
.
by
rewrite
plainly_elim'
always_elim
.
Qed
.
Hint
Resolve
plainly_mono
plainly_elim
.
Lemma
plainly_intro'
P
Q
:
(
☃
P
⊢
Q
)
→
☃
P
⊢
☃
Q
.
Proof
.
intros
<-.
apply
plainly_idemp
.
Qed
.
Lemma
plainly_idemp
P
:
☃
☃
P
⊣⊢
☃
P
.
Proof
.
apply
(
anti_symm
_);
auto
using
plainly_idemp
.
Qed
.
Lemma
always_plainly
P
:
□
☃
P
⊣⊢
☃
P
.
Proof
.
apply
(
anti_symm
_);
auto
using
always_elim
.
by
rewrite
-
plainly_elim'
plainly_idemp
.
Qed
.
Lemma
plainly_always
P
:
☃
□
P
⊣⊢
☃
P
.
Proof
.
apply
(
anti_symm
_);
auto
using
plainly_mono
,
always_elim
.
by
rewrite
-
plainly_elim'
plainly_idemp
.
Qed
.
Lemma
plainly_pure
φ
:
☃
⌜
φ
⌝
⊣⊢
⌜
φ
⌝.
Proof
.
apply
(
anti_symm
_);
auto
.
apply
pure_elim'
=>
Hφ
.
trans
(
∀
x
:
False
,
☃
True
:
uPred
M
)
%
I
;
[
by
apply
forall_intro
|]
.
rewrite
plainly_forall_2
.
auto
using
plainly_mono
,
pure_intro
.
Qed
.
Lemma
plainly_forall
{
A
}
(
Ψ
:
A
→
uPred
M
)
:
(
☃
∀
a
,
Ψ
a
)
⊣⊢
(
∀
a
,
☃
Ψ
a
)
.
Proof
.
apply
(
anti_symm
_);
auto
using
plainly_forall_2
.
apply
forall_intro
=>
x
.
by
rewrite
(
forall_elim
x
)
.
Qed
.
Lemma
plainly_exist
{
A
}
(
Ψ
:
A
→
uPred
M
)
:
(
☃
∃
a
,
Ψ
a
)
⊣⊢
(
∃
a
,
☃
Ψ
a
)
.
Proof
.
apply
(
anti_symm
_);
auto
using
plainly_exist_1
.
apply
exist_elim
=>
x
.
by
rewrite
(
exist_intro
x
)
.
Qed
.
Lemma
plainly_and
P
Q
:
☃
(
P
∧
Q
)
⊣⊢
☃
P
∧
☃
Q
.
Proof
.
rewrite
!
and_alt
plainly_forall
.
by
apply
forall_proper
=>
-
[]
.
Qed
.
Lemma
plainly_or
P
Q
:
☃
(
P
∨
Q
)
⊣⊢
☃
P
∨
☃
Q
.
Proof
.
rewrite
!
or_alt
plainly_exist
.
by
apply
exist_proper
=>
-
[]
.
Qed
.
Lemma
plainly_impl
P
Q
:
☃
(
P
→
Q
)
⊢
☃
P
→
☃
Q
.
Proof
.
apply
impl_intro_l
;
rewrite
-
plainly_and
.
apply
plainly_mono
,
impl_elim
with
P
;
auto
.
Qed
.
Lemma
plainly_internal_eq
{
A
:
ofeT
}
(
a
b
:
A
)
:
☃
(
a
≡
b
)
⊣⊢
a
≡
b
.
Proof
.
apply
(
anti_symm
(
⊢
));
auto
using
always_elim
.
apply
(
internal_eq_rewrite
a
b
(
λ
b
,
☃
(
a
≡
b
))
%
I
);
auto
.
{
intros
n
;
solve_proper
.
}
rewrite
-
(
internal_eq_refl
a
)
plainly_pure
;
auto
.
Qed
.
Lemma
plainly_and_sep_l_1
P
Q
:
☃
P
∧
Q
⊢
☃
P
∗
Q
.
Proof
.
by
rewrite
-
always_plainly
always_and_sep_l_1
.
Qed
.
Lemma
plainly_and_sep_l'
P
Q
:
☃
P
∧
Q
⊣⊢
☃
P
∗
Q
.
Proof
.
apply
(
anti_symm
(
⊢
));
auto
using
plainly_and_sep_l_1
.
Qed
.
Lemma
plainly_and_sep_r'
P
Q
:
P
∧
☃
Q
⊣⊢
P
∗
☃
Q
.
Proof
.
by
rewrite
!
(
comm
_
P
)
plainly_and_sep_l'
.
Qed
.
Lemma
plainly_sep_dup'
P
:
☃
P
⊣⊢
☃
P
∗
☃
P
.
Proof
.
by
rewrite
-
plainly_and_sep_l'
idemp
.
Qed
.
Lemma
plainly_and_sep
P
Q
:
☃
(
P
∧
Q
)
⊣⊢
☃
(
P
∗
Q
)
.
Proof
.
apply
(
anti_symm
(
⊢
));
auto
.
rewrite
-
{
1
}
plainly_idemp
plainly_and
plainly_and_sep_l'
;
auto
.
Qed
.
Lemma
plainly_sep
P
Q
:
☃
(
P
∗
Q
)
⊣⊢
☃
P
∗
☃
Q
.
Proof
.
by
rewrite
-
plainly_and_sep
-
plainly_and_sep_l'
plainly_and
.
Qed
.
Lemma
plainly_wand
P
Q
:
☃
(
P
-∗
Q
)
⊢
☃
P
-∗
☃
Q
.
Proof
.
by
apply
wand_intro_r
;
rewrite
-
plainly_sep
wand_elim_l
.
Qed
.
Lemma
plainly_wand_impl
P
Q
:
☃
(
P
-∗
Q
)
⊣⊢
☃
(
P
→
Q
)
.
Proof
.
apply
(
anti_symm
(
⊢
));
[|
by
rewrite
-
impl_wand
]
.
apply
plainly_intro'
,
impl_intro_r
.
by
rewrite
plainly_and_sep_l'
plainly_elim
wand_elim_l
.
Qed
.
Lemma
wand_impl_plainly
P
Q
:
(
☃
P
-∗
Q
)
⊣⊢
(
☃
P
→
Q
)
.
Proof
.
apply
(
anti_symm
(
⊢
));
[|
by
rewrite
-
impl_wand
]
.
apply
impl_intro_l
.
by
rewrite
plainly_and_sep_l'
wand_elim_r
.
Qed
.
Lemma
plainly_entails_l'
P
Q
:
(
P
⊢
☃
Q
)
→
P
⊢
☃
Q
∗
P
.
Proof
.
intros
;
rewrite
-
plainly_and_sep_l'
;
auto
.
Qed
.
Lemma
plainly_entails_r'
P
Q
:
(
P
⊢
☃
Q
)
→
P
⊢
P
∗
☃
Q
.
Proof
.
intros
;
rewrite
-
plainly_and_sep_r'
;
auto
.
Qed
.
Lemma
plainly_laterN
n
P
:
☃
▷^
n
P
⊣⊢
▷^
n
☃
P
.
Proof
.
induction
n
as
[|
n
IH
];
simpl
;
auto
.
by
rewrite
plainly_later
IH
.
Qed
.
(* Always derived *)
Hint
Resolve
always_mono
always_elim
.
Global
Instance
always_mono'
:
Proper
((
⊢
)
==>
(
⊢
))
(
@
uPred_always
M
)
.
...
...
@@ -485,12 +588,7 @@ Lemma always_idemp P : □ □ P ⊣⊢ □ P.
Proof
.
apply
(
anti_symm
_);
auto
using
always_idemp_2
.
Qed
.
Lemma
always_pure
φ
:
□
⌜
φ
⌝
⊣⊢
⌜
φ
⌝.
Proof
.
apply
(
anti_symm
_);
auto
.
apply
pure_elim'
=>
Hφ
.
trans
(
∀
x
:
False
,
□
True
:
uPred
M
)
%
I
;
[
by
apply
forall_intro
|]
.
rewrite
always_forall_2
.
auto
using
always_mono
,
pure_intro
.
Qed
.
Proof
.
by
rewrite
-
plainly_pure
always_plainly
.
Qed
.
Lemma
always_forall
{
A
}
(
Ψ
:
A
→
uPred
M
)
:
(
□
∀
a
,
Ψ
a
)
⊣⊢
(
∀
a
,
□
Ψ
a
)
.
Proof
.
apply
(
anti_symm
_);
auto
using
always_forall_2
.
...
...
@@ -511,12 +609,7 @@ Proof.
apply
always_mono
,
impl_elim
with
P
;
auto
.
Qed
.
Lemma
always_internal_eq
{
A
:
ofeT
}
(
a
b
:
A
)
:
□
(
a
≡
b
)
⊣⊢
a
≡
b
.
Proof
.
apply
(
anti_symm
(
⊢
));
auto
using
always_elim
.
apply
(
internal_eq_rewrite
a
b
(
λ
b
,
□
(
a
≡
b
))
%
I
);
auto
.
{
intros
n
;
solve_proper
.
}
rewrite
-
(
internal_eq_refl
a
)
always_pure
;
auto
.
Qed
.
Proof
.
by
rewrite
-
plainly_internal_eq
always_plainly
.
Qed
.
Lemma
always_and_sep_l'
P
Q
:
□
P
∧
Q
⊣⊢
□
P
∗
Q
.
Proof
.
apply
(
anti_symm
(
⊢
));
auto
using
always_and_sep_l_1
.
Qed
.
...
...
@@ -616,7 +709,6 @@ Proof. apply wand_intro_r; rewrite -later_sep; eauto using wand_elim_l. Qed.
Lemma
later_iff
P
Q
:
▷
(
P
↔
Q
)
⊢
▷
P
↔
▷
Q
.
Proof
.
by
rewrite
/
uPred_iff
later_and
!
later_impl
.
Qed
.
(* Iterated later modality *)
Global
Instance
laterN_ne
m
:
NonExpansive
(
@
uPred_laterN
M
m
)
.
Proof
.
induction
m
;
simpl
.
by
intros
???
.
solve_proper
.
Qed
.
...
...
@@ -745,6 +837,8 @@ Lemma except_0_later P : ◇ ▷ P ⊢ ▷ P.
Proof
.
by
rewrite
/
uPred_except_0
-
later_or
False_or
.
Qed
.
Lemma
except_0_always
P
:
◇
□
P
⊣⊢
□
◇
P
.
Proof
.
by
rewrite
/
uPred_except_0
always_or
always_later
always_pure
.
Qed
.
Lemma
except_0_plainly
P
:
◇
☃
P
⊣⊢
☃
◇
P
.
Proof
.
by
rewrite
/
uPred_except_0
plainly_or
plainly_later
plainly_pure
.
Qed
.
Lemma
except_0_always_if
p
P
:
◇
□
?p
P
⊣⊢
□
?p
◇
P
.
Proof
.
destruct
p
;
simpl
;
auto
using
except_0_always
.
Qed
.
Lemma
except_0_frame_l
P
Q
:
P
∗
◇
Q
⊢
◇
(
P
∗
Q
)
.
...
...
@@ -764,11 +858,10 @@ Global Instance ownM_mono : Proper (flip (≼) ==> (⊢)) (@uPred_ownM M).
Proof
.
intros
a
b
[
b'
->
]
.
rewrite
ownM_op
.
eauto
.
Qed
.
Lemma
ownM_unit'
:
uPred_ownM
ε
⊣⊢
True
.
Proof
.
apply
(
anti_symm
_);
first
by
auto
.
apply
ownM_unit
.
Qed
.
Lemma
plainly_cmra_valid
{
A
:
cmraT
}
(
a
:
A
)
:
☃
✓
a
⊣⊢
✓
a
.
Proof
.
apply
(
anti_symm
_);
auto
using
plainly_elim
,
plainly_cmra_valid_1
.
Qed
.
Lemma
always_cmra_valid
{
A
:
cmraT
}
(
a
:
A
)
:
□
✓
a
⊣⊢
✓
a
.
Proof
.
intros
;
apply
(
anti_symm
_);
first
by
apply
:
always_elim
.
apply
:
always_cmra_valid_1
.
Qed
.
Proof
.
by
rewrite
-
plainly_cmra_valid
always_plainly
.
Qed
.
(** * Derived rules *)
Global
Instance
bupd_mono'
:
Proper
((
⊢
)
==>
(
⊢
))
(
@
uPred_bupd
M
)
.
...
...
@@ -861,6 +954,24 @@ Global Instance from_option_timeless {A} P (Ψ : A → uPred M) (mx : option A)
(
∀
x
,
TimelessP
(
Ψ
x
))
→
TimelessP
P
→
TimelessP
(
from_option
Ψ
P
mx
)
.
Proof
.
destruct
mx
;
apply
_
.
Qed
.
(* Derived lemmas for plainness *)
Global
Instance
PlainP_proper
:
Proper
((
≡
)
==>
iff
)
(
@
PlainP
M
)
.
Proof
.
solve_proper
.
Qed
.
Global
Instance
limit_preserving_PlainP
{
A
:
ofeT
}
`{
Cofe
A
}
(
Φ
:
A
→
uPred
M
)
:
NonExpansive
Φ
→
LimitPreserving
(
λ
x
,
PlainP
(
Φ
x
))
.
Proof
.
intros
.
apply
limit_preserving_entails
;
solve_proper
.
Qed
.
Global
Instance
Plain_Persistent
P
:
PlainP
P
→
PersistentP
P
.
Proof
.
rewrite
/
PlainP
/
PersistentP
=>
HP
.
by
rewrite
{
1
}
HP
plainly_elim'
.
Qed
.
Lemma
plainly_plainly
P
`{
!
PlainP
P
}
:
☃
P
⊣⊢
P
.
Proof
.
apply
(
anti_symm
(
⊢
));
eauto
.
Qed
.
Lemma
plainly_intro
P
Q
`{
!
PlainP
P
}
:
(
P
⊢
Q
)
→
P
⊢
☃
Q
.
Proof
.
rewrite
-
(
plainly_plainly
P
);
apply
plainly_intro'
.
Qed
.
Lemma
bupd_plain
P
`{
!
PlainP
P
}
:
(|
==>
P
)
⊢
P
.
Proof
.
by
rewrite
-
{
1
}(
plainly_plainly
P
)
bupd_plainly
.
Qed
.
(* Derived lemmas for persistence *)
Global
Instance
PersistentP_proper
:
Proper
((
≡
)
==>
iff
)
(
@
PersistentP
M
)
.
Proof
.
solve_proper
.
Qed
.
...
...
@@ -890,6 +1001,53 @@ Proof.
apply
impl_intro_l
.
by
rewrite
always_and_sep_l
wand_elim_r
.
Qed
.
(* Plain *)
Global
Instance
pure_plain
φ
:
PlainP
(
⌜
φ
⌝
:
uPred
M
)
%
I
.
Proof
.
by
rewrite
/
PlainP
plainly_pure
.
Qed
.
Global
Instance
pure_impl_plain
φ
Q
:
PlainP
Q
→
PlainP
(
⌜
φ
⌝
→
Q
)
%
I
.
Proof
.
rewrite
/
PlainP
pure_impl_forall
plainly_forall
.
auto
using
forall_mono
.
Qed
.
Global
Instance
pure_wand_plain
φ
Q
:
PlainP
Q
→
PlainP
(
⌜
φ
⌝
-∗
Q
)
%
I
.
Proof
.
rewrite
/
PlainP
-
always_impl_wand
pure_impl_forall
plainly_forall
.
auto
using
forall_mono
.
Qed
.
Global
Instance
plainly_plain
P
:
PlainP
(
☃
P
)
.
Proof
.
by
intros
;
apply
plainly_intro'
.
Qed
.
Global
Instance
always_plain
P
:
PlainP
P
→
PlainP
(
□
P
)
.
Proof
.
rewrite
/
PlainP
=>
HP
.
by
rewrite
{
1
}
HP
always_plainly
plainly_always
.
Qed
.
Global
Instance
and_plain
P
Q
:
PlainP
P
→
PlainP
Q
→
PlainP
(
P
∧
Q
)
.
Proof
.
by
intros
;
rewrite
/
PlainP
plainly_and
;
apply
and_mono
.
Qed
.
Global
Instance
or_plain
P
Q
:
PlainP
P
→
PlainP
Q
→
PlainP
(
P
∨
Q
)
.
Proof
.
by
intros
;
rewrite
/
PlainP
plainly_or
;
apply
or_mono
.
Qed
.
Global
Instance
sep_plain
P
Q
:
PlainP
P
→
PlainP
Q
→
PlainP
(
P
∗
Q
)
.
Proof
.
by
intros
;
rewrite
/
PlainP
plainly_sep
;
apply
sep_mono
.
Qed
.
Global
Instance
forall_plain
{
A
}
(
Ψ
:
A
→
uPred
M
)
:
(
∀
x
,
PlainP
(
Ψ
x
))
→
PlainP
(
∀
x
,
Ψ
x
)
.
Proof
.
by
intros
;
rewrite
/
PlainP
plainly_forall
;
apply
forall_mono
.
Qed
.
Global
Instance
exist_palin
{
A
}
(
Ψ
:
A
→
uPred
M
)
:
(
∀
x
,
PlainP
(
Ψ
x
))
→
PlainP
(
∃
x
,
Ψ
x
)
.
Proof
.
by
intros
;
rewrite
/
PlainP
plainly_exist
;
apply
exist_mono
.
Qed
.
Global
Instance
internal_eq_plain
{
A
:
ofeT
}
(
a
b
:
A
)
:
PlainP
(
a
≡
b
:
uPred
M
)
%
I
.
Proof
.
by
intros
;
rewrite
/
PlainP
plainly_internal_eq
.
Qed
.
Global
Instance
cmra_valid_plain
{
A
:
cmraT
}
(
a
:
A
)
:
PlainP
(
✓
a
:
uPred
M
)
%
I
.
Proof
.
by
intros
;
rewrite
/
PlainP
;
apply
plainly_cmra_valid_1
.
Qed
.
Global
Instance
later_plain
P
:
PlainP
P
→
PlainP
(
▷
P
)
.
Proof
.
by
intros
;
rewrite
/
PlainP
plainly_later
;
apply
later_mono
.
Qed
.
Global
Instance
except_0_plain
P
:
PlainP
P
→
PlainP
(
◇
P
)
.
Proof
.
by
intros
;
rewrite
/
PlainP
-
except_0_plainly
;
apply
except_0_mono
.
Qed
.
Global
Instance
laterN_plain
n
P
:
PlainP
P
→
PlainP
(
▷^
n
P
)
.
Proof
.
induction
n
;
apply
_
.
Qed
.
Global
Instance
from_option_palin
{
A
}
P
(
Ψ
:
A
→
uPred
M
)
(
mx
:
option
A
)
:
(
∀
x
,
PlainP
(
Ψ
x
))
→
PlainP
P
→
PlainP
(
from_option
Ψ
P
mx
)
.
Proof
.
destruct
mx
;
apply
_
.
Qed
.
(* Persistence *)
Global
Instance
pure_persistent
φ
:
PersistentP
(
⌜
φ
⌝
:
uPred
M
)
%
I
.
Proof
.
by
rewrite
/
PersistentP
always_pure
.
Qed
.
...
...
@@ -929,6 +1087,8 @@ Global Instance cmra_valid_persistent {A : cmraT} (a : A) :
Proof
.
by
intros
;
rewrite
/
PersistentP
always_cmra_valid
.
Qed
.
Global
Instance
later_persistent
P
:
PersistentP
P
→
PersistentP
(
▷
P
)
.
Proof
.
by
intros
;
rewrite
/
PersistentP
always_later
;
apply
later_mono
.
Qed
.
Global
Instance
except_0_persistent
P
:
PersistentP
P
→
PersistentP
(
◇
P
)
.
Proof
.
by
intros
;
rewrite
/
PersistentP
-
except_0_always
;
apply
except_0_mono
.
Qed
.
Global
Instance
laterN_persistent
n
P
:
PersistentP
P
→
PersistentP
(
▷^
n
P
)
.
Proof
.
induction
n
;
apply
_
.
Qed
.
Global
Instance
ownM_persistent
:
Persistent
a
→
PersistentP
(
@
uPred_ownM
M
a
)
.
...
...
@@ -948,6 +1108,9 @@ Global Instance uPred_sep_monoid : Monoid (@uPred_sep M) :=
Global
Instance
uPred_always_and_homomorphism
:
MonoidHomomorphism
uPred_and
uPred_and
(
≡
)
(
@
uPred_always
M
)
.
Proof
.
split
;
[
split
;
try
apply
_|]
.
apply
always_and
.
apply
always_pure
.
Qed
.
Global
Instance
uPred_plainly_and_homomorphism
:
MonoidHomomorphism
uPred_and
uPred_and
(
≡
)
(
@
uPred_plainly
M
)
.
Proof
.
split
;
[
split
;
try
apply
_|]
.
apply
plainly_and
.
apply
plainly_pure
.
Qed
.
Global
Instance
uPred_always_if_and_homomorphism
b
:
MonoidHomomorphism
uPred_and
uPred_and
(
≡
)
(
@
uPred_always_if
M
b
)
.
Proof
.
split
;
[
split
;
try
apply
_|]
.
apply
always_if_and
.
apply
always_if_pure
.
Qed
.
...
...
@@ -964,6 +1127,9 @@ Proof. split; [split; try apply _|]. apply except_0_and. apply except_0_True. Qe
Global
Instance
uPred_always_or_homomorphism
:
MonoidHomomorphism
uPred_or
uPred_or
(
≡
)
(
@
uPred_always
M
)
.
Proof
.
split
;
[
split
;
try
apply
_|]
.
apply
always_or
.
apply
always_pure
.
Qed
.
Global
Instance
uPred_plainly_or_homomorphism
:
MonoidHomomorphism
uPred_or
uPred_or
(
≡
)
(
@
uPred_plainly
M
)
.
Proof
.
split
;
[
split
;
try
apply
_|]
.
apply
plainly_or
.
apply
plainly_pure
.
Qed
.
Global
Instance
uPred_always_if_or_homomorphism
b
:
MonoidHomomorphism
uPred_or
uPred_or
(
≡
)
(
@
uPred_always_if
M
b
)
.
Proof
.
split
;
[
split
;
try
apply
_|]
.
apply
always_if_or
.
apply
always_if_pure
.
Qed
.
...
...
@@ -975,11 +1141,14 @@ Global Instance uPred_laterN_or_homomorphism n :
Proof
.
split
;
try
apply
_
.
apply
laterN_or
.
Qed
.
Global
Instance
uPred_except_0_or_homomorphism
:
WeakMonoidHomomorphism
uPred_or
uPred_or
(
≡
)
(
@
uPred_except_0
M
)
.
Proof
.
split
;
try
apply
_
.
apply
except_0_or
.
Qed
.
Proof
.
split
;
try
apply
_
.
apply
except_0_or
.
Qed
.
Global
Instance
uPred_always_sep_homomorphism
:
MonoidHomomorphism
uPred_sep
uPred_sep
(
≡
)
(
@
uPred_always
M
)
.
Proof
.
split
;
[
split
;
try
apply
_|]
.
apply
always_sep
.
apply
always_pure
.
Qed
.
Global
Instance
uPred_plainly_sep_homomorphism
:
MonoidHomomorphism
uPred_sep
uPred_sep
(
≡
)
(
@
uPred_plainly
M
)
.
Proof
.
split
;
[
split
;
try
apply
_|]
.
apply
plainly_sep
.
apply
plainly_pure
.
Qed
.
Global
Instance
uPred_always_if_sep_homomorphism
b
:
MonoidHomomorphism
uPred_sep
uPred_sep
(
≡
)
(
@
uPred_always_if
M
b
)
.
Proof
.
split
;
[
split
;
try
apply
_|]
.
apply
always_if_sep
.
apply
always_if_pure
.
Qed
.
...
...
This diff is collapsed.
Click to expand it.
theories/base_logic/lib/fancy_updates.v
+
39
−
0
View file @
bd5feeea
...
...
@@ -140,6 +140,45 @@ Proof.
apply
(
big_opS_forall
(
λ
P
Q
,
P
=
{
E
}
=∗
Q
));
auto
using
fupd_intro
.
intros
P1
P2
HP
Q1
Q2
HQ
.
by
rewrite
HP
HQ
-
fupd_sep
.
Qed
.
Lemma
fupd_plain'
{
E1
E2
E2'
}
P
Q
`{
!
PlainP
P
}
:
E1
⊆
E2
→
(
Q
=
{
E1
,
E2'
}
=∗
P
)
→
(|
=
{
E1
,
E2
}=>
Q
)
⊢
|
=
{
E1
}=>
((|
=
{
E1
,
E2
}=>
Q
)
∗
P
)
.
Proof
.
iIntros
(
HE
HQP
)
"HQ"
.
iPoseProof
(
HQP
)
as
"HQP"
.
apply
subseteq_disjoint_union_L
in
HE
;
destruct
HE
as
[
E3
[?
HE
]];
subst
.
rewrite
fupd_eq
/
fupd_def
.
iIntros
"H"
.
iMod
(
"HQ"
with
"H"
)
as
"H"
.
iMod
"H"
as
"(Hws & HE2 & HQ)"
.
rewrite
ownE_op
;
trivial
;
iDestruct
"HE2"
as
"[HE1 HE3]"
.
iAssert
(
◇
P
)
%
I
with
"[HQ Hws HE1]"
as
"#HP"
.
{
iApply
bupd_plain
;
eauto
.
by
iMod
(
"HQP"
with
"HQ [$]"
)
as
"[_ [_ HP]]"
.
}
iModIntro
.
iMod
"HP"
.
iModIntro
;
iFrame
;
auto
.
Qed
.
Lemma
fupd_plain
{
E1
E2
}
P
Q
`{
!
PlainP
P
}
:
E1
⊆
E2
→
(
Q
⊢
P
)
→
(|
=
{
E1
,
E2
}=>
Q
)
⊢
|
=
{
E1
}=>
((|
=
{
E1
,
E2
}=>
Q
)
∗
P
)
.
Proof
.
iIntros
(
HE
HQP
)
"HQ"
.
iApply
(
fupd_plain'
with
"HQ"
);
auto
.
by
iIntros
"?"
;
iApply
fupd_intro
;
iApply
HQP
.
Qed
.
Lemma
later_fupd_plain
{
E
}
P
`{
Hpl
:
!
PlainP
P
}
:
(
▷
|
=
{
E
}=>
P
)
⊢
|
=
{
E
}=>
▷
◇
P
.
Proof
.
iIntros
"HP"
.
rewrite
fupd_eq
/
fupd_def
.
iIntros
"[Hs He]"
.
iAssert
(
▷
◇
P
)
%
I
with
"[-]"
as
"#HP'"
.
{
iNext
.
iApply
bupd_plain
;
eauto
.
iMod
(
"HP"
with
"[$]"
)
as
"HP"
.
iModIntro
.
iMod
"HP"
as
"(_&_&HP)"
.
by
iModIntro
.
}
by
iFrame
.
Qed
.
End
fupd
.
(** Proofmode class instances *)
...
...
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