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
Tej Chajed
iris
Commits
700de5ad
Commit
700de5ad
authored
Jul 15, 2016
by
Robbert Krebbers
Browse files
Misc clean up.
parent
30f13e2d
Changes
3
Hide whitespace changes
Inline
Side-by-side
heap_lang/lang.v
View file @
700de5ad
...
...
@@ -98,11 +98,7 @@ Fixpoint is_closed (X : list string) (e : expr) : bool :=
is_closed
X
e0
&&
is_closed
X
e1
&&
is_closed
X
e2
end
.
Section
closed
.
Set
Typeclasses
Unique
Instances
.
Class
Closed
(
X
:
list
string
)
(
e
:
expr
)
:
=
closed
:
is_closed
X
e
.
End
closed
.
Class
Closed
(
X
:
list
string
)
(
e
:
expr
)
:
=
closed
:
is_closed
X
e
.
Instance
closed_proof_irrel
env
e
:
ProofIrrel
(
Closed
env
e
).
Proof
.
rewrite
/
Closed
.
apply
_
.
Qed
.
Instance
closed_decision
env
e
:
Decision
(
Closed
env
e
).
...
...
@@ -297,26 +293,6 @@ Definition atomic (e: expr) : bool :=
|
_
=>
false
end
.
(** Substitution *)
Lemma
is_closed_weaken
X
Y
e
:
is_closed
X
e
→
X
`
included
`
Y
→
is_closed
Y
e
.
Proof
.
revert
X
Y
;
induction
e
;
naive_solver
(
eauto
;
set_solver
).
Qed
.
Instance
of_val_closed
X
v
:
Closed
X
(
of_val
v
).
Proof
.
apply
is_closed_weaken
with
[]
;
last
set_solver
.
induction
v
;
simpl
;
auto
.
Qed
.
Lemma
closed_subst
X
e
x
es
:
Closed
X
e
→
x
∉
X
→
subst
x
es
e
=
e
.
Proof
.
rewrite
/
Closed
.
revert
X
.
induction
e
;
intros
;
simpl
;
try
case_decide
;
f_equal
/=
;
try
naive_solver
.
naive_solver
(
eauto
;
set_solver
).
Qed
.
Lemma
closed_nil_subst
e
x
es
:
Closed
[]
e
→
subst
x
es
e
=
e
.
Proof
.
intros
.
apply
closed_subst
with
[]
;
set_solver
.
Qed
.
(** Basic properties about the language *)
Lemma
to_of_val
v
:
to_val
(
of_val
v
)
=
Some
v
.
Proof
.
...
...
@@ -377,75 +353,95 @@ Lemma alloc_fresh e v σ :
Proof
.
by
intros
;
apply
AllocS
,
(
not_elem_of_dom
(
D
:
=
gset
_
)),
is_fresh
.
Qed
.
(** Value type class *)
Class
Value
(
e
:
expr
)
(
v
:
val
)
:
=
i
s
_value
:
to_val
e
=
Some
v
.
Instance
of_val
_val
ue
v
:
Value
(
of_val
v
)
v
.
Proof
.
by
rewrite
/
Value
to_of_val
.
Qed
.
Instance
rec
_value
f
x
e
`
{!
Closed
(
f
:
b
:
x
:
b
:
[])
e
}
:
Value
(
Rec
f
x
e
)
(
RecV
f
x
e
).
Class
Into
Value
(
e
:
expr
)
(
v
:
val
)
:
=
i
nto
_value
:
to_val
e
=
Some
v
.
Instance
into_value_of
_val
v
:
Into
Value
(
of_val
v
)
v
.
Proof
.
by
rewrite
/
Into
Value
to_of_val
.
Qed
.
Instance
into
_value
_rec
f
x
e
`
{!
Closed
(
f
:
b
:
x
:
b
:
[])
e
}
:
Into
Value
(
Rec
f
x
e
)
(
RecV
f
x
e
).
Proof
.
rewrite
/
Value
/=
;
case_decide
;
last
done
.
rewrite
/
Into
Value
/=
;
case_decide
;
last
done
.
do
2
f_equal
.
by
apply
(
proof_irrel
).
Qed
.
Instance
lit
_value
l
:
Value
(
Lit
l
)
(
LitV
l
).
Instance
into
_value
_lit
l
:
Into
Value
(
Lit
l
)
(
LitV
l
).
Proof
.
done
.
Qed
.
Instance
pair_value
e1
e2
v1
v2
:
Value
e1
v1
→
Value
e2
v2
→
Value
(
Pair
e1
e2
)
(
PairV
v1
v2
).
Proof
.
by
rewrite
/
Value
/=
=>
->
/=
->.
Qed
.
Instance
injl_value
e
v
:
Value
e
v
→
Value
(
InjL
e
)
(
InjLV
v
).
Proof
.
by
rewrite
/
Value
/=
=>
->.
Qed
.
Instance
injr_value
e
v
:
Value
e
v
→
Value
(
InjR
e
)
(
InjRV
v
).
Proof
.
by
rewrite
/
Value
/=
=>
->.
Qed
.
Instance
into_value_pair
e1
e2
v1
v2
:
IntoValue
e1
v1
→
IntoValue
e2
v2
→
IntoValue
(
Pair
e1
e2
)
(
PairV
v1
v2
).
Proof
.
by
rewrite
/
IntoValue
/=
=>
->
/=
->.
Qed
.
Instance
into_value_injl
e
v
:
IntoValue
e
v
→
IntoValue
(
InjL
e
)
(
InjLV
v
).
Proof
.
by
rewrite
/
IntoValue
/=
=>
->.
Qed
.
Instance
into_value_injr
e
v
:
IntoValue
e
v
→
IntoValue
(
InjR
e
)
(
InjRV
v
).
Proof
.
by
rewrite
/
IntoValue
/=
=>
->.
Qed
.
(** Closed expressions *)
Lemma
is_closed_weaken
X
Y
e
:
is_closed
X
e
→
X
`
included
`
Y
→
is_closed
Y
e
.
Proof
.
revert
X
Y
;
induction
e
;
naive_solver
(
eauto
;
set_solver
).
Qed
.
Instance
of_val_closed
X
v
:
Closed
X
(
of_val
v
).
Proof
.
apply
is_closed_weaken
with
[]
;
last
set_solver
.
induction
v
;
simpl
;
auto
.
Qed
.
Lemma
closed_subst
X
e
x
es
:
Closed
X
e
→
x
∉
X
→
subst
x
es
e
=
e
.
Proof
.
rewrite
/
Closed
.
revert
X
.
induction
e
=>
X
/=
;
rewrite
?bool_decide_spec
?andb_True
=>
??
;
repeat
case_decide
;
simplify_eq
/=
;
f_equal
;
intuition
eauto
with
set_solver
.
Qed
.
Section
closed_
slow
.
Notation
C
:
=
Clos
ed
.
Lemma
closed_
nil_subst
e
x
es
:
Closed
[]
e
→
subst
x
es
e
=
e
.
Proof
.
intros
.
apply
closed_subst
with
[]
;
set_solver
.
Q
ed
.
Global
Instance
closed_of_val
X
v
:
C
X
(
of_val
v
).
Proof
.
apply
of_val_closed
.
Qed
.
Lemma
closed_nil_closed
X
e
:
Closed
[]
e
→
Closed
X
e
.
Proof
.
intros
.
by
apply
is_closed_weaken
with
[],
included_nil
.
Qed
.
Hint
Immediate
closed_nil_closed
:
typeclass_instances
.
Lemma
closed_var
X
x
:
bool_decide
(
x
∈
X
)
→
C
X
(
Var
x
).
Proof
.
done
.
Qed
.
Global
Instance
closed_lit
X
l
:
C
X
(
Lit
l
).
Proof
.
done
.
Qed
.
Global
Instance
closed_rec
X
f
x
e
:
C
(
f
:
b
:
x
:
b
:
X
)
e
→
C
X
(
Rec
f
x
e
).
Instance
closed_of_val
X
v
:
Closed
X
(
of_val
v
).
Proof
.
apply
of_val_closed
.
Qed
.
Instance
closed_rec
X
f
x
e
:
Closed
(
f
:
b
:
x
:
b
:
X
)
e
→
Closed
X
(
Rec
f
x
e
).
Proof
.
done
.
Qed
.
Lemma
closed_var
X
x
:
bool_decide
(
x
∈
X
)
→
Closed
X
(
Var
x
).
Proof
.
done
.
Qed
.
Hint
Extern
1000
(
Closed
_
(
Var
_
))
=>
apply
closed_var
;
vm_compute
;
exact
I
:
typeclass_instances
.
Section
closed
.
Context
(
X
:
list
string
).
Notation
C
:
=
(
Closed
X
).
Global
Instance
closed_lit
l
:
C
(
Lit
l
).
Proof
.
done
.
Qed
.
Global
Instance
closed_unop
X
op
e
:
C
X
e
→
C
X
(
UnOp
op
e
).
Global
Instance
closed_unop
op
e
:
C
e
→
C
(
UnOp
op
e
).
Proof
.
done
.
Qed
.
Global
Instance
closed_fst
X
e
:
C
X
e
→
C
X
(
Fst
e
).
Global
Instance
closed_fst
e
:
C
e
→
C
(
Fst
e
).
Proof
.
done
.
Qed
.
Global
Instance
closed_snd
X
e
:
C
X
e
→
C
X
(
Snd
e
).
Global
Instance
closed_snd
e
:
C
e
→
C
(
Snd
e
).
Proof
.
done
.
Qed
.
Global
Instance
closed_injl
X
e
:
C
X
e
→
C
X
(
InjL
e
).
Global
Instance
closed_injl
e
:
C
e
→
C
(
InjL
e
).
Proof
.
done
.
Qed
.
Global
Instance
closed_injr
X
e
:
C
X
e
→
C
X
(
InjR
e
).
Global
Instance
closed_injr
e
:
C
e
→
C
(
InjR
e
).
Proof
.
done
.
Qed
.
Global
Instance
closed_fork
X
e
:
C
X
e
→
C
X
(
Fork
e
).
Global
Instance
closed_fork
e
:
C
e
→
C
(
Fork
e
).
Proof
.
done
.
Qed
.
Global
Instance
closed_load
X
e
:
C
X
e
→
C
X
(
Load
e
).
Global
Instance
closed_load
e
:
C
e
→
C
(
Load
e
).
Proof
.
done
.
Qed
.
Global
Instance
closed_alloc
X
e
:
C
X
e
→
C
X
(
Alloc
e
).
Global
Instance
closed_alloc
e
:
C
e
→
C
(
Alloc
e
).
Proof
.
done
.
Qed
.
Global
Instance
closed_app
X
e1
e2
:
C
X
e1
→
C
X
e2
→
C
X
(
App
e1
e2
).
Proof
.
intros
.
by
apply
andb_True
.
Qed
.
Global
Instance
closed_binop
X
op
e1
e2
:
C
X
e1
→
C
X
e2
→
C
X
(
BinOp
op
e1
e2
).
Proof
.
intros
.
by
apply
andb_True
.
Qed
.
Global
Instance
closed_pair
X
e1
e2
:
C
X
e1
→
C
X
e2
→
C
X
(
Pair
e1
e2
).
Proof
.
intros
.
by
apply
andb_True
.
Qed
.
Global
Instance
closed_store
X
e1
e2
:
C
X
e1
→
C
X
e2
→
C
X
(
Store
e1
e2
).
Proof
.
intros
.
by
apply
andb_True
.
Qed
.
Global
Instance
closed_if
X
e0
e1
e2
:
C
X
e0
→
C
X
e1
→
C
X
e2
→
C
X
(
If
e0
e1
e2
).
Proof
.
intros
.
by
rewrite
/
C
/=
!
andb_True
.
Qed
.
Global
Instance
closed_case
X
e0
e1
e2
:
C
X
e0
→
C
X
e1
→
C
X
e2
→
C
X
(
Case
e0
e1
e2
).
Proof
.
intros
.
by
rewrite
/
C
/=
!
andb_True
.
Qed
.
Global
Instance
closed_cas
X
e0
e1
e2
:
C
X
e0
→
C
X
e1
→
C
X
e2
→
C
X
(
CAS
e0
e1
e2
).
Proof
.
intros
.
by
rewrite
/
C
/=
!
andb_True
.
Qed
.
End
closed_slow
.
Lemma
closed_nil_closed
X
e
:
Closed
[]
e
→
Closed
X
e
.
Proof
.
intros
.
apply
is_closed_weaken
with
[].
done
.
set_solver
.
Qed
.
Hint
Immediate
closed_nil_closed
:
typeclass_instances
.
Hint
Extern
1000
(
Closed
_
(
Var
_
))
=>
apply
closed_var
;
vm_compute
;
exact
I
:
typeclass_instances
.
Global
Instance
closed_app
e1
e2
:
C
e1
→
C
e2
→
C
(
App
e1
e2
).
Proof
.
intros
.
by
rewrite
/
Closed
/=
!
andb_True
.
Qed
.
Global
Instance
closed_binop
op
e1
e2
:
C
e1
→
C
e2
→
C
(
BinOp
op
e1
e2
).
Proof
.
intros
.
by
rewrite
/
Closed
/=
!
andb_True
.
Qed
.
Global
Instance
closed_pair
e1
e2
:
C
e1
→
C
e2
→
C
(
Pair
e1
e2
).
Proof
.
intros
.
by
rewrite
/
Closed
/=
!
andb_True
.
Qed
.
Global
Instance
closed_store
e1
e2
:
C
e1
→
C
e2
→
C
(
Store
e1
e2
).
Proof
.
intros
.
by
rewrite
/
Closed
/=
!
andb_True
.
Qed
.
Global
Instance
closed_if
e0
e1
e2
:
C
e0
→
C
e1
→
C
e2
→
C
(
If
e0
e1
e2
).
Proof
.
intros
.
by
rewrite
/
Closed
/=
!
andb_True
.
Qed
.
Global
Instance
closed_case
e0
e1
e2
:
C
e0
→
C
e1
→
C
e2
→
C
(
Case
e0
e1
e2
).
Proof
.
intros
.
by
rewrite
/
Closed
/=
!
andb_True
.
Qed
.
Global
Instance
closed_cas
e0
e1
e2
:
C
e0
→
C
e1
→
C
e2
→
C
(
CAS
e0
e1
e2
).
Proof
.
intros
.
by
rewrite
/
Closed
/=
!
andb_True
.
Qed
.
End
closed
.
(** Equality and other typeclass stuff *)
Instance
base_lit_dec_eq
(
l1
l2
:
base_lit
)
:
Decision
(
l1
=
l2
).
...
...
heap_lang/lib/par.v
View file @
700de5ad
...
...
@@ -32,14 +32,14 @@ Proof.
iSpecialize
(
"HΦ"
with
"* [-]"
)
;
first
by
iSplitL
"H1"
.
by
wp_let
.
Qed
.
Lemma
wp_par
(
Ψ
1
Ψ
2
:
val
→
iProp
)
(
e1
e2
:
expr
)
`
{!
Closed
[]
e1
,
Closed
[]
e2
}
(
Φ
:
val
→
iProp
)
:
Lemma
wp_par
(
Ψ
1
Ψ
2
:
val
→
iProp
)
(
e1
e2
:
expr
)
`
{!
Closed
[]
e1
,
Closed
[]
e2
}
(
Φ
:
val
→
iProp
)
:
heapN
⊥
N
→
(
heap_ctx
heapN
★
WP
e1
{{
Ψ
1
}}
★
WP
e2
{{
Ψ
2
}}
★
∀
v1
v2
,
Ψ
1
v1
★
Ψ
2
v2
-
★
▷
Φ
(
v1
,
v2
)%
V
)
⊢
WP
e1
||
e2
{{
Φ
}}.
Proof
.
iIntros
(?)
"(#Hh&H1&H2&H)"
.
iApply
(
par_spec
Ψ
1
Ψ
2
)
;
auto
.
apply
i
s
_value
.
iIntros
(?)
"(#Hh&H1&H2&H)"
.
iApply
(
par_spec
Ψ
1
Ψ
2
)
;
[
done
|
apply
i
nto
_value
|]
.
iFrame
"Hh H"
.
iSplitL
"H1"
;
by
wp_let
.
Qed
.
End
proof
.
heap_lang/wp_tactics.v
View file @
700de5ad
...
...
@@ -10,7 +10,8 @@ Ltac wp_bind K :=
end
.
(* TODO: Do something better here *)
Ltac
wp_done
:
=
fast_done
||
apply
is_value
||
apply
_
||
(
rewrite
/=
?to_of_val
;
fast_done
).
Ltac
wp_done
:
=
fast_done
||
apply
into_value
||
apply
_
||
(
rewrite
/=
?to_of_val
;
fast_done
).
(* sometimes, we will have to do a final view shift, so only apply
pvs_intro if we obtain a consecutive wp *)
...
...
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