Skip to content
Snippets Groups Projects
Commit 4e9a1ec7 authored by Ralf Jung's avatar Ralf Jung
Browse files

Merge branch 'lc-heaplang' into 'master'

Basic later credits implementation for HeapLang

See merge request iris/iris!823
parents c069ee33 88dcbd11
No related branches found
No related tags found
No related merge requests found
...@@ -73,9 +73,8 @@ lemma. ...@@ -73,9 +73,8 @@ lemma.
* Make the `inG` instances for `libG` fields local, so they are only used inside * Make the `inG` instances for `libG` fields local, so they are only used inside
the library that defines the `libG`. the library that defines the `libG`.
* Prepare for supporting later credits, by adding a resource `£ n` describing * Add infrastructure for supporting later credits, by adding a resource `£ n`
ownership of `n` credits that can be eliminated at fancy updates. describing ownership of `n` credits that can be eliminated at fancy updates.
Note that HeapLang has not yet been equipped with support for later credits.
+ To retain backwards compatibility with the interaction laws of fancy updates + To retain backwards compatibility with the interaction laws of fancy updates
with the plainly modality (`BiFUpdPlainly`), which are incompatible with with the plainly modality (`BiFUpdPlainly`), which are incompatible with
later credits, the logic has a new parameter of type `has_lc`, which is later credits, the logic has a new parameter of type `has_lc`, which is
...@@ -129,14 +128,18 @@ lemma. ...@@ -129,14 +128,18 @@ lemma.
number of steps taken so far. This number is tied to ghost state in the state number of steps taken so far. This number is tied to ghost state in the state
interpretation, which is exposed, updated, and used with new lemmas interpretation, which is exposed, updated, and used with new lemmas
`wp_lb_init`, `wp_lb_update`, and `wp_step_fupdN_lb`. (by Jonas Kastberg Hinrichsen) `wp_lb_init`, `wp_lb_update`, and `wp_step_fupdN_lb`. (by Jonas Kastberg Hinrichsen)
* In line with the support for later credits (see `base_logic`), `heapGS_gen` * Make pattern argument of `wp_pure` tactic optional (defaults to wildcard
now takes an additional `has_lc` parameter, and `heapGS` is a short-hand for pattern, matching all redexes).
`heapGS_gen HasLc`. The adequacy statements for HeapLang have been changed * In line with the support for later credits (see `base_logic`), the tactic
accordingly: `wp_pure` now takes an optional parameter `credit:"H"` which generates a
hypothesis `H` for a single later credit `£ 1` that can be eliminated using
`lc_fupd_elim_later`.
The typeclass `heapGS_gen` now takes an additional `has_lc` parameter, and
`heapGS` is a short-hand for `heapGS_gen HasLc`. The adequacy statements for
HeapLang have been changed accordingly:
+ `heap_adequacy` provides `heapGS`, thus enabling the use of later credits. + `heap_adequacy` provides `heapGS`, thus enabling the use of later credits.
This precludes usage of the laws in `BiFUpdPlainly` in the HeapLang instance of Iris. This precludes usage of the laws in `BiFUpdPlainly` in the HeapLang instance of Iris.
+ `heap_total` provides `heapGS_gen HasNoLc`. + `heap_total` provides `heapGS_gen HasNoLc`.
Currently, the primitive laws for HeapLang do not yet provide later credits.
The following `sed` script helps adjust your code to the renaming (on macOS, The following `sed` script helps adjust your code to the renaming (on macOS,
replace `sed` by `gsed`, installed via e.g. `brew install gnu-sed`). replace `sed` by `gsed`, installed via e.g. `brew install gnu-sed`).
......
...@@ -55,9 +55,12 @@ that the current goal is of the shape `WP e @ E {{ Q }}`. ...@@ -55,9 +55,12 @@ that the current goal is of the shape `WP e @ E {{ Q }}`.
Tactics to take one or more pure program steps: Tactics to take one or more pure program steps:
- `wp_pure`: Perform one pure reduction step. Pure steps are defined by the - `wp_pure pat credit:"H"`: Perform one pure reduction step. `pat` optionally
`PureExec` typeclass and include beta reduction, projections, constructors, as defines the pattern that the redex has to match; it defaults to `_` (any
well as unary and binary arithmetic operators. redex). The `credit:` argument is optional, too; when present, a later credit
will be generated in a fresh hypothesis named `"H"`.
Pure steps are defined by the `PureExec` typeclass and include beta reduction,
projections, constructors, as well as unary and binary arithmetic operators.
- `wp_pures`: Perform as many pure reduction steps as possible. This - `wp_pures`: Perform as many pure reduction steps as possible. This
tactic will **not** reduce lambdas/recs that are hidden behind a definition. tactic will **not** reduce lambdas/recs that are hidden behind a definition.
If the computation reaches a value, the `WP` will be entirely removed and the If the computation reaches a value, the `WP` will be entirely removed and the
......
...@@ -53,6 +53,26 @@ Proof. ...@@ -53,6 +53,26 @@ Proof.
rewrite -total_lifting.twp_pure_step //. rewrite -total_lifting.twp_pure_step //.
Qed. Qed.
Lemma tac_wp_pure_credit `{!heapGS_gen hlc Σ} Δ Δ' s E j K e1 e2 ϕ Φ :
PureExec ϕ 1 e1 e2
ϕ
MaybeIntoLaterNEnvs 1 Δ Δ'
match envs_app false (Esnoc Enil j (£ 1)) Δ' with
| Some Δ'' =>
envs_entails Δ'' (WP fill K e2 @ s; E {{ Φ }})
| None => False
end
envs_entails Δ (WP (fill K e1) @ s; E {{ Φ }}).
Proof.
rewrite envs_entails_unseal=> ??? .
pose proof @pure_exec_fill.
rewrite -lifting.wp_pure_step_later; last done.
rewrite into_laterN_env_sound /=. apply later_mono.
destruct (envs_app _ _ _) as [Δ''|] eqn:HΔ'; [ | contradiction ].
rewrite envs_app_sound //; simpl.
rewrite right_id. apply wand_intro_r. by rewrite wand_elim_l.
Qed.
Lemma tac_wp_value_nofupd `{!heapGS_gen hlc Σ} Δ s E Φ v : Lemma tac_wp_value_nofupd `{!heapGS_gen hlc Σ} Δ s E Φ v :
envs_entails Δ (Φ v) envs_entails Δ (WP (Val v) @ s; E {{ Φ }}). envs_entails Δ (Φ v) envs_entails Δ (WP (Val v) @ s; E {{ Φ }}).
Proof. rewrite envs_entails_unseal=> ->. by apply wp_value. Qed. Proof. rewrite envs_entails_unseal=> ->. by apply wp_value. Qed.
...@@ -133,6 +153,36 @@ Tactic Notation "wp_pure" open_constr(efoc) := ...@@ -133,6 +153,36 @@ Tactic Notation "wp_pure" open_constr(efoc) :=
|| fail "wp_pure: cannot find" efoc "in" e "or" efoc "is not a redex" || fail "wp_pure: cannot find" efoc "in" e "or" efoc "is not a redex"
| _ => fail "wp_pure: not a 'wp'" | _ => fail "wp_pure: not a 'wp'"
end. end.
Tactic Notation "wp_pure" :=
wp_pure _.
Tactic Notation "wp_pure" open_constr(efoc) "credit:" constr(H) :=
iStartProof;
let Htmp := iFresh in
let finish _ :=
pm_reduce;
(iDestructHyp Htmp as H || fail 2 "wp_pure:" H "is not fresh");
wp_finish
in
lazymatch goal with
| |- envs_entails _ (wp ?s ?E ?e ?Q) =>
let e := eval simpl in e in
reshape_expr e ltac:(fun K e' =>
unify e' efoc;
eapply (tac_wp_pure_credit _ _ _ _ Htmp K e');
[iSolveTC (* PureExec *)
|try solve_vals_compare_safe (* The pure condition for PureExec --
handles trivial goals, including [vals_compare_safe] *)
|iSolveTC (* IntoLaters *)
|finish () (* new goal *)
])
|| fail "wp_pure: cannot find" efoc "in" e "or" efoc "is not a redex"
| |- envs_entails _ (twp ?s ?E ?e ?Q) =>
fail "wp_pure: credit generation is not supported for a TWP"
| _ => fail "wp_pure: not a 'wp'"
end.
Tactic Notation "wp_pure" "credit:" constr(H) :=
wp_pure _ credit: H.
(* TODO: do this in one go, without [repeat]. *) (* TODO: do this in one go, without [repeat]. *)
Ltac wp_pures := Ltac wp_pures :=
......
...@@ -179,6 +179,21 @@ Tactic failure: wp_pure: cannot find ?y in (Var "x") or ...@@ -179,6 +179,21 @@ Tactic failure: wp_pure: cannot find ?y in (Var "x") or
(@iris_invGS HasLc heap_lang Σ (@heapGS_irisGS HasLc Σ heapGS0)))) (@iris_invGS HasLc heap_lang Σ (@heapGS_irisGS HasLc Σ heapGS0))))
(@top coPset coPset_top) (@top coPset coPset_top) (@top coPset coPset_top) (@top coPset coPset_top)
(@bi_pure (uPredI (iResUR Σ)) True)) (@bi_pure (uPredI (iResUR Σ)) True))
"test_wp_pure_credit_succeed"
: string
1 goal
Σ : gFunctors
heapGS0 : heapGS Σ
P : iProp Σ
============================
"Hcred" : £ 1
--------------------------------------∗
|={⊤}=> ▷ P ={∅}=∗ P
"test_wp_pure_credit_fail"
: string
The command has indeed failed with message:
Tactic failure: wp_pure: "Hcred" is not fresh.
1 goal 1 goal
Σ : gFunctors Σ : gFunctors
......
...@@ -16,7 +16,7 @@ Section tests. ...@@ -16,7 +16,7 @@ Section tests.
(10 = 4 + 6)%nat -∗ (10 = 4 + 6)%nat -∗
WP let: "x" := ref #1 in "x" <- !"x";; !"x" {{ v, v = #1 }}. WP let: "x" := ref #1 in "x" <- !"x";; !"x" {{ v, v = #1 }}.
Proof. Proof.
iIntros "?". wp_alloc l. repeat (wp_pure _) || wp_load || wp_store. iIntros "?". wp_alloc l. repeat wp_pure || wp_load || wp_store.
match goal with match goal with
| |- context [ (10 = 4 + 6)%nat ] => done | |- context [ (10 = 4 + 6)%nat ] => done
end. end.
...@@ -44,8 +44,8 @@ Section tests. ...@@ -44,8 +44,8 @@ Section tests.
Lemma heap_e2_spec E : WP heap_e2 @ E [{ v, v = #2 }]. Lemma heap_e2_spec E : WP heap_e2 @ E [{ v, v = #2 }].
Proof. Proof.
iIntros "". rewrite /heap_e2. iIntros "". rewrite /heap_e2.
wp_alloc l as "Hl". Show. wp_alloc l'. wp_alloc l as "Hl". Show. wp_alloc l'. do 2 wp_pure.
wp_pures. wp_bind (!_)%E. wp_load. Show. (* No fupd was added *) wp_bind (!_)%E. wp_load. Show. (* No fupd was added *)
wp_store. wp_load. done. wp_store. wp_load. done.
Qed. Qed.
...@@ -336,6 +336,23 @@ Section tests. ...@@ -336,6 +336,23 @@ Section tests.
Show. Show.
Unset Printing All. Unset Printing All.
Abort. Abort.
Check "test_wp_pure_credit_succeed".
Lemma test_wp_pure_credit_succeed P :
WP #42 + #420 {{ v, P ={}=∗ P }}.
Proof.
wp_pure credit:"Hcred". Show.
iIntros "!> HP". iMod (lc_fupd_elim_later with "Hcred HP"). auto.
Qed.
Check "test_wp_pure_credit_fail".
Lemma test_wp_pure_credit_fail :
True -∗ WP #42 + #420 {{ v, True }}.
Proof.
iIntros "Hcred".
Fail wp_pure credit:"Hcred".
Abort.
End tests. End tests.
Section mapsto_tests. Section mapsto_tests.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment