Commit 5cb8bc17 authored by Ralf Jung's avatar Ralf Jung
Browse files

Merge branch 'robbert/twp_vals_compare_safe' into 'master'

Also use `solve_vals_compare_safe` in TWP case of `wp_pure`.

See merge request !444
parents a5eb66d3 91cc6ffc
Pipeline #28268 passed with stage
in 21 minutes and 52 seconds
......@@ -121,6 +121,23 @@ Section tests.
WP let: "x" := Pred #42 in Pred "x" @ E [{ v, v = #40 }].
Proof. iIntros "". wp_apply Pred_spec. by wp_apply Pred_spec. Qed.
Definition Id : val :=
rec: "go" "x" :=
if: "x" = #0 then #() else "go" ("x" - #1).
(** These tests specially test the handling of the [vals_compare_safe]
side-condition of the [=] operator. *)
Lemma Id_wp (n : nat) : WP Id #n {{ v, v = #() }}.
Proof.
iInduction n as [|n] "IH"; wp_rec; wp_pures; first done.
by replace (S n - 1) with (n:Z) by lia.
Qed.
Lemma Id_twp (n : nat) : WP Id #n [{ v, v = #() }].
Proof.
iInduction n as [|n] "IH"; wp_rec; wp_pures; first done.
by replace (S n - 1) with (n:Z) by lia.
Qed.
Lemma wp_apply_evar e P :
P - ( Q Φ, Q - WP e {{ Φ }}) - WP e {{ _, True }}.
Proof. iIntros "HP HW". wp_apply "HW". iExact "HP". Qed.
......
......@@ -97,7 +97,7 @@ Tactic Notation "wp_pure" open_constr(efoc) :=
unify e' efoc;
eapply (tac_twp_pure _ _ _ (fill K e'));
[iSolveTC (* PureExec *)
|try fast_done (* The pure condition for PureExec *)
|try solve_vals_compare_safe (* The pure condition for PureExec *)
|wp_finish (* new goal *)
])
|| fail "wp_pure: cannot find" efoc "in" e "or" efoc "is not a redex"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment