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
Joshua Yanovski
iris-coq
Commits
25db5f36
Commit
25db5f36
authored
Feb 23, 2016
by
Ralf Jung
Browse files
Merge branch 'master' of gitlab.mpi-sws.org:FP/iris-coq
parents
75a2c511
c55e52f9
Changes
6
Hide whitespace changes
Inline
Side-by-side
algebra/upred_tactics.v
View file @
25db5f36
...
...
@@ -66,28 +66,30 @@ Module upred_reflection. Section upred_reflection.
|
None
=>
ESep
e1
<
$
>
cancel_go
n
e2
end
end
.
Definition
cancel
(
n
:
nat
)
(
e
:
expr
)
:
option
expr
:=
prune
<
$
>
cancel_go
n
e
.
Definition
cancel
(
ns
:
list
nat
)
(
e
:
expr
)
:
option
expr
:=
prune
<
$
>
fold_right
(
mbind
∘
cancel_go
)
(
Some
e
)
ns
.
Lemma
flatten_cancel_go
e
e
'
n
:
cancel_go
n
e
=
Some
e
'
→
flatten
e
≡ₚ
n
::
flatten
e
'
.
Proof
.
revert
e
'
;
induction
e
as
[
|
|
e1
IH1
e2
IH2
];
intros
;
repeat
(
simplify_option_eq
||
case_match
);
auto
.
*
by
rewrite
IH1
//.
*
by
rewrite
IH2
// Permutation_middle.
-
by
rewrite
IH1
//.
-
by
rewrite
IH2
// Permutation_middle.
Qed
.
Lemma
flatten_cancel
e
e
'
n
:
cancel
n
e
=
Some
e
'
→
flatten
e
≡ₚ
n
::
flatten
e
'
.
Lemma
flatten_cancel
e
e
'
n
s
:
cancel
n
s
e
=
Some
e
'
→
flatten
e
≡ₚ
n
s
++
flatten
e
'
.
Proof
.
rewrite
/
cancel
fmap_Some
=>
-
[
e
''
[
?
->
]].
by
rewrite
flatten_prune
-
flatten_cancel_go
.
rewrite
/
cancel
fmap_Some
=>
-
[
{
e
'
}
e
'
[
He
->
]];
rewrite
flatten_prune
.
revert
e
'
He
;
induction
ns
as
[
|
n
ns
IH
]
=>
e
'
He
;
simplify_option_eq
;
auto
.
rewrite
Permutation_middle
-
flatten_cancel_go
//; eauto.
Qed
.
Lemma
cancel_entails
Σ
e1
e2
e1
'
e2
'
n
:
cancel
n
e1
=
Some
e1
'
→
cancel
n
e2
=
Some
e2
'
→
Lemma
cancel_entails
Σ
e1
e2
e1
'
e2
'
n
s
:
cancel
n
s
e1
=
Some
e1
'
→
cancel
n
s
e2
=
Some
e2
'
→
eval
Σ
e1
'
⊑
eval
Σ
e2
'
→
eval
Σ
e1
⊑
eval
Σ
e2
.
Proof
.
intros
??
.
rewrite
!
eval_flatten
.
rewrite
(
flatten_cancel
e1
e1
'
n
)
// (flatten_cancel e2 e2' n) //; csimpl.
apply
uPred
.
sep_mono_r
.
rewrite
(
flatten_cancel
e1
e1
'
n
s
)
// (flatten_cancel e2 e2' n
s
) //; csimpl.
rewrite
!
fmap_app
!
big_sep_app
.
apply
uPred
.
sep_mono_r
.
Qed
.
Class
Quote
(
Σ
1
Σ
2
:
list
(
uPred
M
))
(
P
:
uPred
M
)
(
e
:
expr
)
:=
{}
.
...
...
@@ -96,6 +98,13 @@ Module upred_reflection. Section upred_reflection.
rlist
.
QuoteLookup
Σ
1
Σ
2
P
i
→
Quote
Σ
1
Σ
2
P
(
EVar
i
)
|
1000.
Global
Instance
quote_sep
Σ
1
Σ
2
Σ
3
P1
P2
e1
e2
:
Quote
Σ
1
Σ
2
P1
e1
→
Quote
Σ
2
Σ
3
P2
e2
→
Quote
Σ
1
Σ
3
(
P1
★
P2
)
(
ESep
e1
e2
).
Class
QuoteArgs
(
Σ
:
list
(
uPred
M
))
(
Ps
:
list
(
uPred
M
))
(
ns
:
list
nat
)
:=
{}
.
Global
Instance
quote_args_nil
Σ
:
QuoteArgs
Σ
nil
nil
.
Global
Instance
quote_args_cons
Σ
Ps
P
ns
n
:
rlist
.
QuoteLookup
Σ
Σ
P
n
→
QuoteArgs
Σ
Ps
ns
→
QuoteArgs
Σ
(
P
::
Ps
)
(
n
::
ns
).
End
upred_reflection
.
Ltac
quote
:=
...
...
@@ -108,16 +117,13 @@ Module upred_reflection. Section upred_reflection.
end
.
End
upred_reflection
.
Tactic
Notation
"cancel"
constr
(
P
)
:=
let
rec
lookup
Σ
n
:=
match
Σ
with
|
P
::
_
=>
n
|
_
::
?
Σ
=>
lookup
Σ
(
S
n
)
end
in
Tactic
Notation
"cancel"
constr
(
Ps
)
:=
upred_reflection
.
quote
;
match
goal
with
|
|-
upred_reflection
.
eval
?
Σ
_
⊑
upred_reflection
.
eval
_
_
=>
let
n
'
:=
lookup
Σ
0
%
nat
in
eapply
upred_reflection
.
cancel_entails
with
(
n
:=
n
'
);
[
cbv
;
reflexivity
|
cbv
;
reflexivity
|
simpl
]
lazymatch
type
of
(
_
:
upred_reflection
.
QuoteArgs
Σ
Ps
_
)
with
upred_reflection
.
QuoteArgs
_
_
?
ns
'
=>
eapply
upred_reflection
.
cancel_entails
with
(
ns
:=
ns
'
);
[
cbv
;
reflexivity
|
cbv
;
reflexivity
|
simpl
]
end
end
.
barrier/barrier.v
View file @
25db5f36
...
...
@@ -268,9 +268,9 @@ Section proof.
rewrite
pvs_frame_l
.
apply
pvs_strip_pvs
.
rewrite
sep_exist_l
.
apply
exist_elim
=>
i
.
trans
(
pvs
⊤
⊤
(
heap_ctx
heapN
★
▷
(
barrier_inv
l
P
(
State
Low
{
[
i
]
}
))
★
saved_prop_own
i
P
)).
-
rewrite
-
pvs_intro
.
cancel
(
heap_ctx
heapN
)
.
rewrite
{
1
}
[
saved_prop_own
_
_
]
always_sep_dup
.
cancel
(
saved_prop_own
i
P
)
.
rewrite
/
barrier_inv
/
waiting
-
later_intro
.
cancel
(
l
↦
'0
)
%
I
.
-
rewrite
-
pvs_intro
.
cancel
[
heap_ctx
heapN
]
.
rewrite
{
1
}
[
saved_prop_own
_
_
]
always_sep_dup
.
cancel
[
saved_prop_own
i
P
]
.
rewrite
/
barrier_inv
/
waiting
-
later_intro
.
cancel
[
l
↦
'0
]
%
I
.
rewrite
-
(
exist_intro
(
const
P
))
/=
.
rewrite
-
[
saved_prop_own
_
_
](
left_id
True
%
I
(
★
)
%
I
).
apply
sep_mono
.
+
rewrite
-
later_intro
.
apply
wand_intro_l
.
rewrite
right_id
.
...
...
@@ -316,7 +316,7 @@ Section proof.
apply
const_elim_sep_l
=>
Hs
.
destruct
p
;
last
done
.
rewrite
{
1
}/
barrier_inv
=>/={
Hs
}
.
rewrite
later_sep
.
eapply
wp_store
with
(
v
'
:=
'0
);
eauto
with
I
ndisj
.
u_strip_later
.
cancel
(
l
↦
'0
)
%
I
.
u_strip_later
.
cancel
[
l
↦
'0
]
%
I
.
apply
wand_intro_l
.
rewrite
-
(
exist_intro
(
State
High
I
)).
rewrite
-
(
exist_intro
∅
).
rewrite
const_equiv
/=
;
last
by
eauto
with
sts
.
rewrite
left_id
-
later_intro
{
2
}/
barrier_inv
-!
assoc
.
apply
sep_mono_r
.
...
...
@@ -418,12 +418,8 @@ Section proof.
rewrite
-
(
waiting_split
_
_
_
Q
R1
R2
);
[
|
done
..].
rewrite
{
1
}
[
saved_prop_own
i1
_
]
always_sep_dup
.
rewrite
{
1
}
[
saved_prop_own
i2
_
]
always_sep_dup
.
cancel
(
saved_prop_own
i1
R1
).
cancel
(
saved_prop_own
i2
R2
).
cancel
(
l
↦
'0
)
%
I
.
cancel
(
waiting
P
I
).
cancel
(
Q
-
★
R1
★
R2
)
%
I
.
cancel
(
saved_prop_own
i
Q
).
cancel
[
saved_prop_own
i1
R1
;
saved_prop_own
i2
R2
;
l
↦
'0
;
waiting
P
I
;
Q
-
★
R1
★
R2
;
saved_prop_own
i
Q
]
%
I
.
apply
wand_intro_l
.
rewrite
!
assoc
.
eapply
pvs_wand_r
.
rewrite
/
recv
.
rewrite
-
(
exist_intro
γ
)
-
(
exist_intro
P
)
-
(
exist_intro
R1
)
-
(
exist_intro
i1
).
rewrite
-
(
exist_intro
γ
)
-
(
exist_intro
P
)
-
(
exist_intro
R2
)
-
(
exist_intro
i2
).
...
...
@@ -433,8 +429,9 @@ Section proof.
*
rewrite
-
sts_ownS_op
;
by
eauto
using
sts_own_weaken
with
sts
.
*
rewrite
const_equiv
// !left_id.
rewrite
{
1
}
[
heap_ctx
_
]
always_sep_dup
{
1
}
[
sts_ctx
_
_
_
]
always_sep_dup
.
do
2
cancel
(
heap_ctx
heapN
).
do
2
cancel
(
sts_ctx
γ
N
(
barrier_inv
l
P
)).
cancel
(
saved_prop_own
i1
R1
).
cancel
(
saved_prop_own
i2
R2
).
cancel
[
heap_ctx
heapN
;
heap_ctx
heapN
;
sts_ctx
γ
N
(
barrier_inv
l
P
);
sts_ctx
γ
N
(
barrier_inv
l
P
);
saved_prop_own
i1
R1
;
saved_prop_own
i2
R2
].
apply
sep_intro_True_l
.
{
rewrite
-
later_intro
.
apply
wand_intro_l
.
by
rewrite
right_id
.
}
rewrite
-
later_intro
.
apply
wand_intro_l
.
by
rewrite
right_id
.
...
...
@@ -449,12 +446,8 @@ Section proof.
rewrite
-
(
ress_split
_
_
_
Q
R1
R2
);
[
|
done
..].
rewrite
{
1
}
[
saved_prop_own
i1
_
]
always_sep_dup
.
rewrite
{
1
}
[
saved_prop_own
i2
_
]
always_sep_dup
.
cancel
(
saved_prop_own
i1
R1
).
cancel
(
saved_prop_own
i2
R2
).
cancel
(
l
↦
'1
)
%
I
.
cancel
(
Q
-
★
R1
★
R2
)
%
I
.
cancel
(
saved_prop_own
i
Q
).
cancel
(
ress
I
).
cancel
[
saved_prop_own
i1
R1
;
saved_prop_own
i2
R2
;
l
↦
'1
;
Q
-
★
R1
★
R2
;
saved_prop_own
i
Q
;
ress
I
]
%
I
.
apply
wand_intro_l
.
rewrite
!
assoc
.
eapply
pvs_wand_r
.
rewrite
/
recv
.
rewrite
-
(
exist_intro
γ
)
-
(
exist_intro
P
)
-
(
exist_intro
R1
)
-
(
exist_intro
i1
).
rewrite
-
(
exist_intro
γ
)
-
(
exist_intro
P
)
-
(
exist_intro
R2
)
-
(
exist_intro
i2
).
...
...
@@ -464,8 +457,9 @@ Section proof.
*
rewrite
-
sts_ownS_op
;
by
eauto
using
sts_own_weaken
with
sts
.
*
rewrite
const_equiv
// !left_id.
rewrite
{
1
}
[
heap_ctx
_
]
always_sep_dup
{
1
}
[
sts_ctx
_
_
_
]
always_sep_dup
.
do
2
cancel
(
heap_ctx
heapN
).
do
2
cancel
(
sts_ctx
γ
N
(
barrier_inv
l
P
)).
cancel
(
saved_prop_own
i1
R1
).
cancel
(
saved_prop_own
i2
R2
).
cancel
[
heap_ctx
heapN
;
heap_ctx
heapN
;
sts_ctx
γ
N
(
barrier_inv
l
P
);
sts_ctx
γ
N
(
barrier_inv
l
P
);
saved_prop_own
i1
R1
;
saved_prop_own
i2
R2
]
%
I
.
apply
sep_intro_True_l
.
{
rewrite
-
later_intro
.
apply
wand_intro_l
.
by
rewrite
right_id
.
}
rewrite
-
later_intro
.
apply
wand_intro_l
.
by
rewrite
right_id
.
...
...
@@ -493,7 +487,7 @@ Section spec.
Lemma
barrier_spec
(
heapN
N
:
namespace
)
:
heapN
⊥
N
→
∃
(
recv
send
:
loc
->
iProp
-
n
>
iProp
),
(
∀
P
,
heap_ctx
heapN
⊑
(
{{
True
}}
newchan
'
()
{{
λ
v
,
∃
l
,
v
=
LocV
l
★
recv
l
P
★
send
l
P
}}
)
)
∧
(
∀
P
,
heap_ctx
heapN
⊑
{{
True
}}
newchan
'
()
{{
λ
v
,
∃
l
,
v
=
LocV
l
★
recv
l
P
★
send
l
P
}}
)
∧
(
∀
l
P
,
{{
send
l
P
★
P
}}
signal
(
LocV
l
)
{{
λ
_
,
True
}}
)
∧
(
∀
l
P
,
{{
recv
l
P
}}
wait
(
LocV
l
)
{{
λ
_
,
P
}}
)
∧
(
∀
l
P
Q
,
{{
recv
l
(
P
★
Q
)
}}
Skip
{{
λ
_
,
recv
l
P
★
recv
l
Q
}}
)
∧
...
...
heap_lang/heap.v
View file @
25db5f36
...
...
@@ -117,8 +117,7 @@ Section heap.
rewrite
-
(
exist_intro
(
op
{
[
l
:=
Excl
v
]
}
)).
repeat
erewrite
<-
exist_intro
by
apply
_
;
simpl
.
rewrite
-
of_heap_insert
left_id
right_id
.
(
*
FIXME
:
cancel
(
auth_own
heap_name
{
[
l
:=
Excl
v
]
}
-
★
Φ
(
LocV
l
))
%
I
.
*
)
rewrite
!
assoc
.
apply
sep_mono_l
.
cancel
[
auth_own
heap_name
{
[
l
:=
Excl
v
]
}
-
★
Φ
(
LocV
l
)]
%
I
.
rewrite
-
(
map_insert_singleton_op
h
);
last
by
apply
of_heap_None
.
rewrite
const_equiv
?
left_id
;
last
by
apply
(
map_insert_valid
h
).
apply
later_intro
.
...
...
program_logic/auth.v
View file @
25db5f36
...
...
@@ -56,8 +56,8 @@ Section auth.
rewrite
sep_exist_l
.
apply
exist_elim
=>
γ
.
rewrite
-
(
exist_intro
γ
).
trans
(
▷
auth_inv
γ
φ
★
auth_own
γ
a
)
%
I
.
{
rewrite
/
auth_inv
-
(
exist_intro
a
)
later_sep
.
rewrite
const_equiv
// left_id. cancel
(
▷ φ a
)
%I.
rewrite
-
later_intro
/
auth_own
-
own_op
auth_both_op
.
done
.
}
rewrite
const_equiv
// left_id. cancel
[
▷ φ a
]
%I.
by
rewrite
-
later_intro
/
auth_own
-
own_op
auth_both_op
.
}
rewrite
(
inv_alloc
N
)
/
auth_ctx
pvs_frame_r
.
apply
pvs_mono
.
by
rewrite
always_and_sep_l
.
Qed
.
...
...
program_logic/model.v
View file @
25db5f36
...
...
@@ -31,11 +31,11 @@ End iProp.
(
*
Solution
*
)
Definition
iPreProp
(
Λ
:
language
)
(
Σ
:
iFunctor
)
:
cofeT
:=
iProp
.
result
Λ
Σ
.
Nota
tion
iRes
Λ
Σ
:=
(
res
Λ
Σ
(
laterC
(
iPreProp
Λ
Σ
))
)
.
Nota
tion
iResRA
Λ
Σ
:=
(
resRA
Λ
Σ
(
laterC
(
iPreProp
Λ
Σ
))
)
.
Nota
tion
iWld
Λ
Σ
:=
(
mapRA
positive
(
agreeRA
(
laterC
(
iPreProp
Λ
Σ
)))
)
.
Nota
tion
iPst
Λ
:=
(
exclRA
(
istateC
Λ
)
)
.
Nota
tion
iGst
Λ
Σ
:=
(
ifunctor_car
Σ
(
laterC
(
iPreProp
Λ
Σ
))
)
.
Defini
tion
iRes
Λ
Σ
:=
res
Λ
Σ
(
laterC
(
iPreProp
Λ
Σ
)).
Defini
tion
iResRA
Λ
Σ
:=
resRA
Λ
Σ
(
laterC
(
iPreProp
Λ
Σ
)).
Defini
tion
iWld
Λ
Σ
:=
mapRA
positive
(
agreeRA
(
laterC
(
iPreProp
Λ
Σ
))).
Defini
tion
iPst
Λ
:=
exclRA
(
istateC
Λ
).
Defini
tion
iGst
Λ
Σ
:=
ifunctor_car
Σ
(
laterC
(
iPreProp
Λ
Σ
)).
Definition
iProp
(
Λ
:
language
)
(
Σ
:
iFunctor
)
:
cofeT
:=
uPredC
(
iResRA
Λ
Σ
).
Definition
iProp_unfold
{
Λ
Σ
}
:
iProp
Λ
Σ
-
n
>
iPreProp
Λ
Σ
:=
solution_fold
_.
Definition
iProp_fold
{
Λ
Σ
}
:
iPreProp
Λ
Σ
-
n
>
iProp
Λ
Σ
:=
solution_unfold
_.
...
...
program_logic/sts.v
View file @
25db5f36
...
...
@@ -85,7 +85,7 @@ Section sts.
rewrite
sep_exist_l
.
apply
exist_elim
=>
γ
.
rewrite
-
(
exist_intro
γ
).
trans
(
▷
sts_inv
γ
φ
★
sts_own
γ
s
(
⊤
∖
sts
.
tok
s
))
%
I
.
{
rewrite
/
sts_inv
-
(
exist_intro
s
)
later_sep
.
cancel
(
▷
φ
s
)
%
I
.
cancel
[
▷
φ
s
]
%
I
.
by
rewrite
-
later_intro
-
own_op
sts_op_auth_frag_up
;
last
set_solver
.
}
rewrite
(
inv_alloc
N
)
/
sts_ctx
pvs_frame_r
.
by
rewrite
always_and_sep_l
.
...
...
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