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
Jonas Kastberg
iris
Commits
d609ac7e
Commit
d609ac7e
authored
Jul 11, 2016
by
Jacques-Henri Jourdan
Browse files
Merge branch 'master' of gitlab.mpi-sws.org:FP/iris-coq
parents
06cbdda6
20de7e7c
Changes
7
Hide whitespace changes
Inline
Side-by-side
ProofMode.md
View file @
d609ac7e
...
...
@@ -114,7 +114,7 @@ introduction patterns:
- `
# ipat
` : move the hypothesis to the persistent context.
- `
%
` : move the hypothesis to the pure Coq context (anonymously).
- `
[ipat ipat]
` : (separating) conjunction elimination.
- `
|
ipat|ipat]
` : disjunction elimination.
- `
[
ipat|ipat]
` : disjunction elimination.
- `
[]
` : false elimination.
Apart from this, there are the following introduction patterns that can only
...
...
@@ -186,7 +186,7 @@ Many of the proof mode tactics (such as `iDestruct`, `iApply`, `iRewrite`) can
take both hypotheses and lemmas, and allow one to instantiate universal
quantifiers and implications/wands of these hypotheses/lemmas on the fly.
The syntax for the arguments, called _proof mode terms_ of these tactics is:
The syntax for the arguments, called _proof mode terms_
,
of these tactics is:
(H $! t1 ... tn with "spat1 .. spatn")
...
...
algebra/gmap.v
View file @
d609ac7e
...
...
@@ -205,15 +205,12 @@ Qed.
Lemma
singleton_valid
i
x
:
✓
({[
i
:
=
x
]}
:
gmap
K
A
)
↔
✓
x
.
Proof
.
rewrite
!
cmra_valid_validN
.
by
setoid_rewrite
singleton_validN
.
Qed
.
Lemma
insert_singleton_opN
n
m
i
x
:
m
!!
i
=
None
→
<[
i
:
=
x
]>
m
≡
{
n
}
≡
{[
i
:
=
x
]}
⋅
m
.
Lemma
insert_singleton_op
m
i
x
:
m
!!
i
=
None
→
<[
i
:
=
x
]>
m
=
{[
i
:
=
x
]}
⋅
m
.
Proof
.
intros
Hi
j
;
destruct
(
decide
(
i
=
j
))
as
[->|].
-
by
rewrite
lookup_op
lookup_insert
lookup_singleton
Hi
right_id
.
-
by
rewrite
lookup_op
lookup_insert_ne
//
lookup_singleton_ne
//
left_id
.
intros
Hi
;
apply
map_eq
=>
j
;
destruct
(
decide
(
i
=
j
))
as
[->|].
-
by
rewrite
lookup_op
lookup_insert
lookup_singleton
Hi
right_id
_L
.
-
by
rewrite
lookup_op
lookup_insert_ne
//
lookup_singleton_ne
//
left_id
_L
.
Qed
.
Lemma
insert_singleton_op
m
i
x
:
m
!!
i
=
None
→
<[
i
:
=
x
]>
m
≡
{[
i
:
=
x
]}
⋅
m
.
Proof
.
rewrite
!
equiv_dist
;
naive_solver
eauto
using
insert_singleton_opN
.
Qed
.
Lemma
core_singleton
(
i
:
K
)
(
x
:
A
)
cx
:
pcore
x
=
Some
cx
→
core
({[
i
:
=
x
]}
:
gmap
K
A
)
=
{[
i
:
=
cx
]}.
...
...
@@ -252,9 +249,9 @@ Proof.
*
by
rewrite
Hi
lookup_op
lookup_singleton
lookup_delete
.
*
by
rewrite
lookup_op
lookup_singleton_ne
//
lookup_delete_ne
//
left_id
.
Qed
.
Lemma
dom_op
m1
m2
:
dom
(
gset
K
)
(
m1
⋅
m2
)
≡
dom
_
m1
∪
dom
_
m2
.
Lemma
dom_op
m1
m2
:
dom
(
gset
K
)
(
m1
⋅
m2
)
=
dom
_
m1
∪
dom
_
m2
.
Proof
.
apply
elem_of_equiv
;
intros
i
;
rewrite
elem_of_union
!
elem_of_dom
.
apply
elem_of_equiv
_L
=>
i
;
rewrite
elem_of_union
!
elem_of_dom
.
unfold
is_Some
;
setoid_rewrite
lookup_op
.
destruct
(
m1
!!
i
),
(
m2
!!
i
)
;
naive_solver
.
Qed
.
...
...
@@ -303,8 +300,8 @@ Section freshness.
{
rewrite
-
not_elem_of_union
-
dom_op
-
not_elem_of_union
;
apply
is_fresh
.
}
exists
(<[
i
:
=
x
]>
m
)
;
split
.
{
by
apply
HQ
;
last
done
;
apply
not_elem_of_dom
.
}
rewrite
insert_singleton_op
N
;
last
by
apply
not_elem_of_dom
.
rewrite
-
assoc
-
insert_singleton_op
N
;
rewrite
insert_singleton_op
;
last
by
apply
not_elem_of_dom
.
rewrite
-
assoc
-
insert_singleton_op
;
last
by
apply
not_elem_of_dom
;
rewrite
dom_op
not_elem_of_union
.
by
apply
insert_validN
;
[
apply
cmra_valid_validN
|].
Qed
.
...
...
heap_lang/lib/spawn.v
View file @
d609ac7e
...
...
@@ -56,23 +56,23 @@ Lemma spawn_spec (Ψ : val → iProp) e (f : val) (Φ : val → iProp) :
heap_ctx
heapN
★
WP
f
#()
{{
Ψ
}}
★
(
∀
l
,
join_handle
l
Ψ
-
★
Φ
#
l
)
⊢
WP
spawn
e
{{
Φ
}}.
Proof
.
iIntros
{<-%
of_to_val
?}
"(#Hh
&Hf&
HΦ)"
.
rewrite
/
spawn
.
iIntros
{<-%
of_to_val
?}
"(#Hh
& Hf &
HΦ)"
.
rewrite
/
spawn
.
wp_let
.
wp_alloc
l
as
"Hl"
.
wp_let
.
iPvs
(
own_alloc
(
Excl
()))
as
{
γ
}
"Hγ"
;
first
done
.
iPvs
(
inv_alloc
N
_
(
spawn_inv
γ
l
Ψ
)
with
"[Hl]"
)
as
"#?"
;
first
done
.
{
iNext
.
iExists
(
InjLV
#
0
).
iFrame
;
eauto
.
}
wp_apply
wp_fork
.
iSplitR
"Hf"
.
-
iPvsIntro
.
wp_seq
.
iPvsIntro
.
iApply
"HΦ"
;
rewrite
/
join_handle
.
eauto
.
-
wp_focus
(
f
_
).
iApply
wp_wand_l
;
iFrame
"Hf"
;
iIntros
{
v
}
"Hv"
.
-
iPvsIntro
.
wp_seq
.
iPvsIntro
.
iApply
"HΦ"
.
rewrite
/
join_handle
.
eauto
.
-
wp_focus
(
f
_
).
iApply
wp_wand_l
.
iFrame
"Hf"
;
iIntros
{
v
}
"Hv"
.
iInv
N
as
{
v'
}
"[Hl _]"
;
first
wp_done
.
wp_store
.
iPvsIntro
;
iSplit
;
[
iNext
|
done
].
iExists
(
InjRV
v
)
;
iFrame
;
eauto
.
wp_store
.
iPvsIntro
.
iSplit
;
[
iNext
|
done
].
iExists
(
InjRV
v
)
.
iFrame
.
eauto
.
Qed
.
Lemma
join_spec
(
Ψ
:
val
→
iProp
)
l
(
Φ
:
val
→
iProp
)
:
join_handle
l
Ψ
★
(
∀
v
,
Ψ
v
-
★
Φ
v
)
⊢
WP
join
#
l
{{
Φ
}}.
Proof
.
rewrite
/
join_handle
;
iIntros
"[[% H] Hv]"
;
iDestruct
"H"
as
{
γ
}
"(#?&Hγ&#?)"
.
rewrite
/
join_handle
;
iIntros
"[[% H] Hv]"
.
iDestruct
"H"
as
{
γ
}
"(#?&Hγ&#?)"
.
iL
ö
b
as
"IH"
.
wp_rec
.
wp_focus
(!
_
)%
E
.
iInv
N
as
{
v
}
"[Hl Hinv]"
.
wp_load
.
iDestruct
"Hinv"
as
"[%|Hinv]"
;
subst
.
-
iPvsIntro
;
iSplitL
"Hl"
;
[
iNext
;
iExists
_;
iFrame
;
eauto
|].
...
...
prelude/base.v
View file @
d609ac7e
...
...
@@ -393,6 +393,8 @@ Proof. now intros -> ?. Qed.
Instance
unit_equiv
:
Equiv
unit
:
=
λ
_
_
,
True
.
Instance
unit_equivalence
:
Equivalence
(@
equiv
unit
_
).
Proof
.
repeat
split
.
Qed
.
Instance
unit_leibniz
:
LeibnizEquiv
unit
.
Proof
.
intros
[]
[]
;
reflexivity
.
Qed
.
Instance
unit_inhabited
:
Inhabited
unit
:
=
populate
().
(** ** Products *)
...
...
@@ -908,13 +910,6 @@ Class Collection A C `{ElemOf A C, Empty C, Singleton A C,
elem_of_intersection
X
Y
(
x
:
A
)
:
x
∈
X
∩
Y
↔
x
∈
X
∧
x
∈
Y
;
elem_of_difference
X
Y
(
x
:
A
)
:
x
∈
X
∖
Y
↔
x
∈
X
∧
x
∉
Y
}.
Class
CollectionOps
A
C
`
{
ElemOf
A
C
,
Empty
C
,
Singleton
A
C
,
Union
C
,
Intersection
C
,
Difference
C
,
IntersectionWith
A
C
,
Filter
A
C
}
:
Prop
:
=
{
collection_ops
:
>>
Collection
A
C
;
elem_of_intersection_with
(
f
:
A
→
A
→
option
A
)
X
Y
(
x
:
A
)
:
x
∈
intersection_with
f
X
Y
↔
∃
x1
x2
,
x1
∈
X
∧
x2
∈
Y
∧
f
x1
x2
=
Some
x
;
elem_of_filter
X
P
`
{
∀
x
,
Decision
(
P
x
)}
x
:
x
∈
filter
P
X
↔
P
x
∧
x
∈
X
}.
(** We axiomative a finite collection as a collection whose elements can be
enumerated as a list. These elements, given by the [elements] function, may be
...
...
prelude/collections.v
View file @
d609ac7e
...
...
@@ -467,35 +467,6 @@ Section collection.
End
dec
.
End
collection
.
Section
collection_ops
.
Context
`
{
CollectionOps
A
C
}.
Lemma
elem_of_intersection_with_list
(
f
:
A
→
A
→
option
A
)
Xs
Y
x
:
x
∈
intersection_with_list
f
Y
Xs
↔
∃
xs
y
,
Forall2
(
∈
)
xs
Xs
∧
y
∈
Y
∧
foldr
(
λ
x
,
(
≫
=
f
x
))
(
Some
y
)
xs
=
Some
x
.
Proof
.
split
.
-
revert
x
.
induction
Xs
;
simpl
;
intros
x
HXs
;
[
eexists
[],
x
;
intuition
|].
rewrite
elem_of_intersection_with
in
HXs
;
destruct
HXs
as
(
x1
&
x2
&?&?&?).
destruct
(
IHXs
x2
)
as
(
xs
&
y
&
hy
&
?
&
?)
;
trivial
.
eexists
(
x1
::
xs
),
y
.
intuition
(
simplify_option_eq
;
auto
).
-
intros
(
xs
&
y
&
Hxs
&
?
&
Hx
).
revert
x
Hx
.
induction
Hxs
;
intros
;
simplify_option_eq
;
[
done
|].
rewrite
elem_of_intersection_with
.
naive_solver
.
Qed
.
Lemma
intersection_with_list_ind
(
P
Q
:
A
→
Prop
)
f
Xs
Y
:
(
∀
y
,
y
∈
Y
→
P
y
)
→
Forall
(
λ
X
,
∀
x
,
x
∈
X
→
Q
x
)
Xs
→
(
∀
x
y
z
,
Q
x
→
P
y
→
f
x
y
=
Some
z
→
P
z
)
→
∀
x
,
x
∈
intersection_with_list
f
Y
Xs
→
P
x
.
Proof
.
intros
HY
HXs
Hf
.
induction
Xs
;
simplify_option_eq
;
[
done
|].
intros
x
Hx
.
rewrite
elem_of_intersection_with
in
Hx
.
decompose_Forall
.
destruct
Hx
as
(?
&
?
&
?
&
?
&
?).
eauto
.
Qed
.
End
collection_ops
.
(** * Sets without duplicates up to an equivalence *)
Section
NoDup
.
Context
`
{
SimpleCollection
A
B
}
(
R
:
relation
A
)
`
{!
Equivalence
R
}.
...
...
prelude/listset.v
View file @
d609ac7e
...
...
@@ -42,10 +42,6 @@ Instance listset_intersection: Intersection (listset A) := λ l k,
let
(
l'
)
:
=
l
in
let
(
k'
)
:
=
k
in
Listset
(
list_intersection
l'
k'
).
Instance
listset_difference
:
Difference
(
listset
A
)
:
=
λ
l
k
,
let
(
l'
)
:
=
l
in
let
(
k'
)
:
=
k
in
Listset
(
list_difference
l'
k'
).
Instance
listset_intersection_with
:
IntersectionWith
A
(
listset
A
)
:
=
λ
f
l
k
,
let
(
l'
)
:
=
l
in
let
(
k'
)
:
=
k
in
Listset
(
list_intersection_with
f
l'
k'
).
Instance
listset_filter
:
Filter
A
(
listset
A
)
:
=
λ
P
_
l
,
let
(
l'
)
:
=
l
in
Listset
(
filter
P
l'
).
Instance
:
Collection
A
(
listset
A
).
Proof
.
...
...
@@ -62,13 +58,6 @@ Proof.
-
intros
.
apply
elem_of_remove_dups
.
-
intros
.
apply
NoDup_remove_dups
.
Qed
.
Global
Instance
:
CollectionOps
A
(
listset
A
).
Proof
.
split
.
-
apply
_
.
-
intros
?
[?]
[?].
apply
elem_of_list_intersection_with
.
-
intros
[?]
??.
apply
elem_of_list_filter
.
Qed
.
End
listset
.
(** These instances are declared using [Hint Extern] to avoid too
...
...
@@ -83,14 +72,10 @@ Hint Extern 1 (Union (listset _)) =>
eapply
@
listset_union
:
typeclass_instances
.
Hint
Extern
1
(
Intersection
(
listset
_
))
=>
eapply
@
listset_intersection
:
typeclass_instances
.
Hint
Extern
1
(
IntersectionWith
_
(
listset
_
))
=>
eapply
@
listset_intersection_with
:
typeclass_instances
.
Hint
Extern
1
(
Difference
(
listset
_
))
=>
eapply
@
listset_difference
:
typeclass_instances
.
Hint
Extern
1
(
Elements
_
(
listset
_
))
=>
eapply
@
listset_elems
:
typeclass_instances
.
Hint
Extern
1
(
Filter
_
(
listset
_
))
=>
eapply
@
listset_filter
:
typeclass_instances
.
Instance
listset_ret
:
MRet
listset
:
=
λ
A
x
,
{[
x
]}.
Instance
listset_fmap
:
FMap
listset
:
=
λ
A
B
f
l
,
...
...
prelude/listset_nodup.v
View file @
d609ac7e
...
...
@@ -29,12 +29,6 @@ Instance listset_nodup_intersection: Intersection C := λ l k,
Instance
listset_nodup_difference
:
Difference
C
:
=
λ
l
k
,
let
(
l'
,
Hl
)
:
=
l
in
let
(
k'
,
Hk
)
:
=
k
in
ListsetNoDup
_
(
NoDup_list_difference
_
k'
Hl
).
Instance
listset_nodup_intersection_with
:
IntersectionWith
A
C
:
=
λ
f
l
k
,
let
(
l'
,
Hl
)
:
=
l
in
let
(
k'
,
Hk
)
:
=
k
in
ListsetNoDup
(
remove_dups
(
list_intersection_with
f
l'
k'
))
(
NoDup_remove_dups
_
).
Instance
listset_nodup_filter
:
Filter
A
C
:
=
λ
P
_
l
,
let
(
l'
,
Hl
)
:
=
l
in
ListsetNoDup
_
(
NoDup_filter
P
_
Hl
).
Instance
:
Collection
A
C
.
Proof
.
...
...
@@ -49,15 +43,6 @@ Qed.
Global
Instance
listset_nodup_elems
:
Elements
A
C
:
=
listset_nodup_car
.
Global
Instance
:
FinCollection
A
C
.
Proof
.
split
.
apply
_
.
done
.
by
intros
[??].
Qed
.
Global
Instance
:
CollectionOps
A
C
.
Proof
.
split
.
-
apply
_
.
-
intros
?
[??]
[??]
?.
unfold
intersection_with
,
elem_of
,
listset_nodup_intersection_with
,
listset_nodup_elem_of
;
simpl
.
rewrite
elem_of_remove_dups
.
by
apply
elem_of_list_intersection_with
.
-
intros
[??]
???.
apply
elem_of_list_filter
.
Qed
.
End
list_collection
.
Hint
Extern
1
(
ElemOf
_
(
listset_nodup
_
))
=>
...
...
@@ -74,5 +59,3 @@ Hint Extern 1 (Difference (listset_nodup _)) =>
eapply
@
listset_nodup_difference
:
typeclass_instances
.
Hint
Extern
1
(
Elements
_
(
listset_nodup
_
))
=>
eapply
@
listset_nodup_elems
:
typeclass_instances
.
Hint
Extern
1
(
Filter
_
(
listset_nodup
_
))
=>
eapply
@
listset_nodup_filter
:
typeclass_instances
.
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