Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Dan Frumin
iris-coq
Commits
30a88b10
Commit
30a88b10
authored
Jul 19, 2016
by
Ralf Jung
Browse files
add list_reverse example
parent
b598e0d5
Changes
2
Hide whitespace changes
Inline
Side-by-side
_CoqProject
View file @
30a88b10
...
...
@@ -106,6 +106,7 @@ tests/one_shot.v
tests/joining_existentials.v
tests/proofmode.v
tests/barrier_client.v
tests/list_reverse.v
proofmode/coq_tactics.v
proofmode/pviewshifts.v
proofmode/environments.v
...
...
tests/list_reverse.v
0 → 100644
View file @
30a88b10
(
**
Correctness
of
in
-
place
list
reversal
*
)
From
iris
.
proofmode
Require
Export
tactics
.
From
iris
.
program_logic
Require
Export
hoare
.
From
iris
.
heap_lang
Require
Import
proofmode
notation
.
Section
list_reverse
.
Context
`
{!
heapG
Σ
}
(
heapN
:
namespace
).
Notation
iProp
:=
(
iPropG
heap_lang
Σ
).
Implicit
Types
l
:
loc
.
Fixpoint
is_list
(
hd
:
val
)
(
xs
:
list
val
)
:
iProp
:=
match
xs
with
|
[]
=>
hd
=
NONEV
|
x
::
xs
=>
∃
l
hd
'
,
hd
=
SOMEV
#
l
★
l
↦
(
x
,
hd
'
)
★
is_list
hd
'
xs
end
%
I
.
Definition
rev
:
val
:=
rec:
"rev"
"hd"
"acc"
:=
match:
"hd"
with
NONE
=>
"acc"
|
SOME
"l"
=>
let:
"tmp1"
:=
Fst
!
"l"
in
let:
"tmp2"
:=
Snd
!
"l"
in
"l"
<-
(
"tmp1"
,
"acc"
);;
"rev"
"tmp2"
"hd"
end
.
Global
Opaque
rev
.
Lemma
rev_acc_wp
hd
acc
xs
ys
(
Φ
:
val
→
iProp
)
:
heap_ctx
heapN
★
is_list
hd
xs
★
is_list
acc
ys
★
(
∀
w
,
is_list
w
(
reverse
xs
++
ys
)
-
★
Φ
w
)
⊢
WP
rev
hd
acc
{{
Φ
}}
.
Proof
.
iIntros
"(#Hh & Hxs & Hys & HΦ)"
.
iL
ö
b
(
hd
acc
xs
ys
Φ
)
as
"IH"
.
wp_rec
;
wp_let
.
destruct
xs
as
[
|
x
xs
];
iSimplifyEq
.
-
wp_match
.
by
iApply
"HΦ"
.
-
iDestruct
"Hxs"
as
(
l
hd
'
)
"(% & Hx & Hxs)"
;
iSimplifyEq
.
wp_match
.
wp_load
.
wp_proj
.
wp_let
.
wp_load
.
wp_proj
.
wp_let
.
wp_store
.
iApply
(
"IH"
$
!
hd
'
(
SOMEV
#
l
)
xs
(
x
::
ys
)
with
"Hxs [Hx Hys]"
);
simpl
.
{
iExists
l
,
acc
;
by
iFrame
.
}
iIntros
(
w
).
rewrite
cons_middle
assoc
-
reverse_cons
.
iApply
"HΦ"
.
Qed
.
Lemma
rev_wp
hd
xs
(
Φ
:
val
→
iProp
)
:
heap_ctx
heapN
★
is_list
hd
xs
★
(
∀
w
,
is_list
w
(
reverse
xs
)
-
★
Φ
w
)
⊢
WP
rev
hd
(
InjL
#())
{{
Φ
}}
.
Proof
.
iIntros
"(#Hh & Hxs & HΦ)"
.
iApply
(
rev_acc_wp
hd
NONEV
xs
[]);
iFrame
"Hh Hxs"
.
iSplit
;
first
done
.
iIntros
(
w
).
rewrite
right_id_L
.
iApply
"HΦ"
.
Qed
.
End
list_reverse
.
Write
Preview
Supports
Markdown
0%
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!
Cancel
Please
register
or
sign in
to comment