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
Matthieu Sozeau
Iris
Commits
e486d0dd
Commit
e486d0dd
authored
9 years ago
by
Ralf Jung
Browse files
Options
Downloads
Patches
Plain Diff
start showing that we can implement the predecessor function
parent
6326a24c
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
barrier/heap_lang.v
+7
-7
7 additions, 7 deletions
barrier/heap_lang.v
barrier/lifting.v
+21
-12
21 additions, 12 deletions
barrier/lifting.v
barrier/tests.v
+42
-4
42 additions, 4 deletions
barrier/tests.v
with
70 additions
and
23 deletions
barrier/heap_lang.v
+
7
−
7
View file @
e486d0dd
...
...
@@ -38,10 +38,10 @@ Instance Rename_expr : Rename expr. derive. Defined.
Instance
Subst_expr
:
Subst
expr
.
derive
.
Defined
.
Instance
SubstLemmas_expr
:
SubstLemmas
expr
.
derive
.
Qed
.
Definition
Lam
(
e
:
{
bind
expr
})
:=
Rec
(
e
.[
ren
(
+
1
)]
)
.
Definition
Lam
(
e
:
{
bind
expr
})
:=
Rec
e
.[
ren
(
+
1
)]
.
Definition
Let
(
e1
:
expr
)
(
e2
:
{
bind
expr
})
:=
App
(
Lam
e2
)
e1
.
Definition
Seq
(
e1
e2
:
expr
)
:=
Let
e1
(
e2
.[
ren
(
+
1
)]
)
.
Definition
If
(
e0
e1
e2
:
expr
)
:=
Case
e0
(
e1
.[
ren
(
+
1
)]
)
(
e2
.[
ren
(
+
1
)]
)
.
Definition
Seq
(
e1
e2
:
expr
)
:=
Let
e1
e2
.[
ren
(
+
1
)]
.
Definition
If
(
e0
e1
e2
:
expr
)
:=
Case
e0
e1
.[
ren
(
+
1
)]
e2
.[
ren
(
+
1
)]
.
Inductive
value
:=
|
RecV
(
e
:
{
bind
2
of
expr
})
...
...
@@ -53,7 +53,7 @@ Inductive value :=
|
LocV
(
l
:
loc
)
.
Definition
LamV
(
e
:
{
bind
expr
})
:=
RecV
(
e
.[
ren
(
+
1
)]
)
.
Definition
LamV
(
e
:
{
bind
expr
})
:=
RecV
e
.[
ren
(
+
1
)]
.
Definition
LitTrue
:=
InjL
LitUnit
.
Definition
LitTrueV
:=
InjLV
LitUnitV
.
...
...
@@ -245,7 +245,7 @@ Qed.
(** The stepping relation *)
Inductive
prim_step
:
expr
->
state
->
expr
->
state
->
option
expr
->
Prop
:=
|
BetaS
e1
e2
v2
σ
(
Hv2
:
e2v
e2
=
Some
v2
):
prim_step
(
App
(
Rec
e1
)
e2
)
σ
(
e1
.[(
Rec
e1
),
e2
/
]
)
σ
None
prim_step
(
App
(
Rec
e1
)
e2
)
σ
e1
.[(
Rec
e1
),
e2
/
]
σ
None
|
PlusS
n1
n2
σ
:
prim_step
(
Plus
(
LitNat
n1
)
(
LitNat
n2
))
σ
(
LitNat
(
n1
+
n2
))
σ
None
|
LeTrueS
n1
n2
σ
(
Hle
:
n1
≤
n2
):
...
...
@@ -257,9 +257,9 @@ Inductive prim_step : expr -> state -> expr -> state -> option expr -> Prop :=
|
SndS
e1
v1
e2
v2
σ
(
Hv1
:
e2v
e1
=
Some
v1
)
(
Hv2
:
e2v
e2
=
Some
v2
):
prim_step
(
Snd
(
Pair
e1
e2
))
σ
e2
σ
None
|
CaseLS
e0
v0
e1
e2
σ
(
Hv0
:
e2v
e0
=
Some
v0
):
prim_step
(
Case
(
InjL
e0
)
e1
e2
)
σ
(
e1
.[
e0
/
]
)
σ
None
prim_step
(
Case
(
InjL
e0
)
e1
e2
)
σ
e1
.[
e0
/
]
σ
None
|
CaseRS
e0
v0
e1
e2
σ
(
Hv0
:
e2v
e0
=
Some
v0
):
prim_step
(
Case
(
InjR
e0
)
e1
e2
)
σ
(
e2
.[
e0
/
]
)
σ
None
prim_step
(
Case
(
InjR
e0
)
e1
e2
)
σ
e2
.[
e0
/
]
σ
None
|
ForkS
e
σ
:
prim_step
(
Fork
e
)
σ
LitUnit
σ
(
Some
e
)
|
AllocS
e
v
σ
l
(
Hv
:
e2v
e
=
Some
v
)
(
Hfresh
:
σ
!!
l
=
None
):
...
...
This diff is collapsed.
Click to expand it.
barrier/lifting.v
+
21
−
12
View file @
e486d0dd
...
...
@@ -11,9 +11,7 @@ Proof.
by
apply
(
wp_bind
(
Σ
:=
Σ
)
(
K
:=
fill
K
)),
fill_is_ctx
.
Qed
.
(** Base axioms for core primitives of the language: Stateful reductions.
These are the lemmas basd on the physical state; we will derive versions
based on a ghost "mapsto"-predicate later. *)
(** Base axioms for core primitives of the language: Stateful reductions. *)
Lemma
wp_lift_step
E1
E2
(
φ
:
expr
→
state
→
Prop
)
Q
e1
σ1
:
E1
⊆
E2
→
to_val
e1
=
None
→
...
...
@@ -209,22 +207,24 @@ Proof.
rewrite
right_id
.
done
.
Qed
.
Lemma
wp_rec
E
e
v
Q
:
▷
wp
(
Σ
:=
Σ
)
E
(
e
.[
Rec
e
,
v2e
v
/
])
Q
⊑
wp
(
Σ
:=
Σ
)
E
(
App
(
Rec
e
)
(
v2e
v
))
Q
.
Lemma
wp_rec
E
ef
e
v
Q
:
e2v
e
=
Some
v
→
▷
wp
(
Σ
:=
Σ
)
E
ef
.[
Rec
ef
,
e
/
]
Q
⊑
wp
(
Σ
:=
Σ
)
E
(
App
(
Rec
ef
)
e
)
Q
.
Proof
.
etransitivity
;
last
eapply
wp_lift_pure_step
with
(
φ
:=
λ
e'
,
e'
=
e
.[
Rec
e
,
v2e
v
/
]);
last
first
.
(
φ
:=
λ
e'
,
e'
=
e
f
.[
Rec
e
f
,
e
/
]);
last
first
.
-
intros
?
?
?
?
Hstep
.
inversion_clear
Hstep
.
done
.
-
intros
?
.
do
3
eexists
.
eapply
BetaS
.
by
rewrite
v2v
.
-
intros
?
.
do
3
eexists
.
eapply
BetaS
;
eassumption
.
-
reflexivity
.
-
apply
later_mono
,
forall_intro
=>
e2
.
apply
impl_intro_l
.
apply
const_elim_l
=>
->
.
done
.
Qed
.
Lemma
wp_lam
E
e
v
Q
:
▷
wp
(
Σ
:=
Σ
)
E
(
e
.[
v2e
v
/
])
Q
⊑
wp
(
Σ
:=
Σ
)
E
(
App
(
Lam
e
)
(
v2e
v
))
Q
.
Lemma
wp_lam
E
ef
e
v
Q
:
e2v
e
=
Some
v
→
▷
wp
(
Σ
:=
Σ
)
E
ef
.[
e
/
]
Q
⊑
wp
(
Σ
:=
Σ
)
E
(
App
(
Lam
ef
)
e
)
Q
.
Proof
.
rewrite
-
wp_rec
.
intros
Hv
.
rewrite
-
wp_rec
;
last
eassumption
.
(* RJ: This pulls in functional extensionality. If that bothers us, we have
to talk to the Autosubst guys. *)
by
asimpl
.
...
...
@@ -303,7 +303,7 @@ Qed.
Lemma
wp_case_inl
e0
v0
e1
e2
E
Q
:
e2v
e0
=
Some
v0
→
▷
wp
(
Σ
:=
Σ
)
E
(
e1
.[
e0
/
]
)
Q
⊑
wp
(
Σ
:=
Σ
)
E
(
Case
(
InjL
e0
)
e1
e2
)
Q
.
▷
wp
(
Σ
:=
Σ
)
E
e1
.[
e0
/
]
Q
⊑
wp
(
Σ
:=
Σ
)
E
(
Case
(
InjL
e0
)
e1
e2
)
Q
.
Proof
.
intros
Hv0
.
etransitivity
;
last
eapply
wp_lift_pure_step
with
(
φ
:=
λ
e'
,
e'
=
e1
.[
e0
/
]);
last
first
.
...
...
@@ -316,7 +316,7 @@ Qed.
Lemma
wp_case_inr
e0
v0
e1
e2
E
Q
:
e2v
e0
=
Some
v0
→
▷
wp
(
Σ
:=
Σ
)
E
(
e2
.[
e0
/
]
)
Q
⊑
wp
(
Σ
:=
Σ
)
E
(
Case
(
InjR
e0
)
e1
e2
)
Q
.
▷
wp
(
Σ
:=
Σ
)
E
e2
.[
e0
/
]
Q
⊑
wp
(
Σ
:=
Σ
)
E
(
Case
(
InjR
e0
)
e1
e2
)
Q
.
Proof
.
intros
Hv0
.
etransitivity
;
last
eapply
wp_lift_pure_step
with
(
φ
:=
λ
e'
,
e'
=
e2
.[
e0
/
]);
last
first
.
...
...
@@ -326,3 +326,12 @@ Proof.
-
apply
later_mono
,
forall_intro
=>
e2'
.
apply
impl_intro_l
.
by
apply
const_elim_l
=>
->
.
Qed
.
(** Some stateless axioms that incorporate bind *)
Lemma
wp_let
e1
e2
E
Q
:
wp
(
Σ
:=
Σ
)
E
e1
(
λ
v
,
▷
wp
(
Σ
:=
Σ
)
E
(
e2
.[
v2e
v
/
])
Q
)
⊑
wp
(
Σ
:=
Σ
)
E
(
Let
e1
e2
)
Q
.
Proof
.
rewrite
-
(
wp_bind
_
_
(
LetCtx
EmptyCtx
e2
))
.
apply
wp_mono
=>
v
.
rewrite
-
wp_lam
//.
by
rewrite
v2v
.
Qed
.
This diff is collapsed.
Click to expand it.
barrier/tests.v
+
42
−
4
View file @
e486d0dd
...
...
@@ -32,16 +32,16 @@ End ParamTests.
Module
LiftingTests
.
(* TODO RJ: Some syntactic sugar for language expressions would be nice. *)
Definition
e3
:=
Load
(
Var
0
)
.
Definition
e2
:=
Seq
(
Store
(
Var
0
)
(
Plus
(
Load
(
Var
0
)
)
(
LitNat
1
)))
e3
.
Definition
e2
:=
Seq
(
Store
(
Var
0
)
(
Plus
(
Load
$
Var
0
)
(
LitNat
1
)))
e3
.
Definition
e
:=
Let
(
Alloc
(
LitNat
1
))
e2
.
Goal
∀
σ
E
,
(
ownP
(
Σ
:=
Σ
)
σ
)
⊑
(
wp
(
Σ
:=
Σ
)
E
e
(
λ
v
,
■
(
v
=
LitNatV
2
)))
.
Proof
.
move
=>
σ
E
.
rewrite
/
e
.
rewrite
-
(
wp_
bind
_
_
(
LetCtx
EmptyCtx
e2
))
.
rewrite
-
wp_alloc_pst
;
last
done
.
rewrite
-
wp_
let
.
rewrite
-
wp_alloc_pst
;
last
done
.
apply
sep_intro_True_r
;
first
done
.
rewrite
-
later_intro
.
apply
forall_intro
=>
l
.
apply
wand_intro_l
.
rewrite
right_id
.
apply
const_elim_l
;
move
=>_
.
rewrite
-
wp_lam
-
later_intro
.
asimpl
.
rewrite
-
later_intro
.
asimpl
.
rewrite
-
(
wp_bind
_
_
(
SeqCtx
(
StoreRCtx
(
LocV
_)
(
PlusLCtx
EmptyCtx
_))
(
Load
(
Loc
_))))
.
rewrite
-
wp_load_pst
;
first
(
apply
sep_intro_True_r
;
first
done
);
last
first
.
...
...
@@ -54,10 +54,48 @@ Module LiftingTests.
{
apply
:
lookup_insert
.
}
{
reflexivity
.
}
rewrite
-
later_intro
.
apply
wand_intro_l
.
rewrite
right_id
.
rewrite
-
wp_lam
-
later_intro
.
asimpl
.
rewrite
-
wp_lam
//
-
later_intro
.
asimpl
.
rewrite
-
wp_load_pst
;
first
(
apply
sep_intro_True_r
;
first
done
);
last
first
.
{
apply
:
lookup_insert
.
}
rewrite
-
later_intro
.
apply
wand_intro_l
.
rewrite
right_id
.
by
apply
const_intro
.
Qed
.
Import
Nat
.
Definition
Lt
e1
e2
:=
Le
(
Plus
e1
$
LitNat
1
)
e2
.
Definition
FindPred'
n1
Sn1
n2
f
:=
If
(
Lt
Sn1
n2
)
(
App
f
Sn1
)
n1
.
Definition
FindPred
n2
:=
Rec
(
Let
(
Plus
(
Var
1
)
(
LitNat
1
))
(
FindPred'
(
Var
2
)
(
Var
0
)
n2
.[
ren
(
+
3
)]
(
Var
1
)))
.
Lemma
FindPred_spec
n1
n2
E
Q
:
(
■
(
n1
<
n2
)
∧
Q
(
LitNatV
$
pred
n2
))
⊑
wp
(
Σ
:=
Σ
)
E
(
App
(
FindPred
(
LitNat
n2
))
(
LitNat
n1
))
Q
.
Proof
.
revert
n1
.
apply
löb_all_1
=>
n1
.
rewrite
-
wp_rec
//.
asimpl
.
(* Get rid of the ▷ in the premise. *)
etransitivity
;
first
(
etransitivity
;
last
eapply
equiv_spec
,
later_and
)
.
{
apply
and_mono
;
first
done
.
by
rewrite
-
later_intro
.
}
apply
later_mono
.
(* Go on. *)
rewrite
-
(
wp_let
_
(
FindPred'
(
LitNat
n1
)
(
Var
0
)
(
LitNat
n2
)
(
FindPred
$
LitNat
n2
)))
.
rewrite
-
wp_plus
.
asimpl
.
rewrite
-
(
wp_bind
_
_
(
CaseCtx
EmptyCtx
_
_))
.
rewrite
-
(
wp_bind
_
_
(
LeLCtx
EmptyCtx
_))
.
rewrite
-
wp_plus
-!
later_intro
.
simpl
.
assert
(
Decision
(
S
n1
+
1
≤
n2
))
as
Hn12
by
apply
_
.
destruct
Hn12
as
[
Hle
|
Hgt
]
.
-
rewrite
-
wp_le_true
/=
//.
rewrite
-
wp_case_inl
//.
rewrite
-!
later_intro
.
asimpl
.
rewrite
(
forall_elim
_
(
S
n1
))
.
eapply
impl_elim
;
first
by
eapply
and_elim_l
.
apply
and_intro
.
+
apply
const_intro
;
omega
.
+
by
rewrite
!
and_elim_r
.
-
rewrite
-
wp_le_false
;
last
by
omega
.
rewrite
-
wp_case_inr
//
-!
later_intro
-
wp_value'
//.
rewrite
and_elim_r
.
apply
const_elim_l
=>
Hle
.
assert
(
Heq
:
n1
=
pred
n2
)
by
omega
.
by
subst
n1
=>{
Hle
Hgt
}
.
Qed
.
End
LiftingTests
.
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