clutch.foxtrot.lib.min
From clutch.foxtrot Require Import foxtrot.
Definition min_prog : val :=
λ: "x" "y",
if: "x" < "y" then "x" else "y".
Section specs.
Context `{!foxtrotGS Σ}.
Lemma wp_min_prog (x y:Z) E :
{{{ True }}}
min_prog #x #y @ E
{{{ (z:Z), RET #z; ⌜(z= x `min` y)%Z⌝}}}.
Proof.
iIntros (Φ) "_ HΦ".
rewrite /min_prog.
wp_pures.
case_bool_decide; wp_pures; iApply "HΦ"; iModIntro; iPureIntro.
- rewrite Z.min_l; lia.
- rewrite Z.min_r; lia.
Qed.
Lemma spec_min_prog E j K (x y : Z) :
j ⤇ fill K (min_prog #x #y) -∗ pupd E E (j ⤇ fill K (# (x `min` y)%Z)).
Proof.
rewrite /min_prog.
iIntros "HK".
tp_pures j.
case_bool_decide; tp_pures j.
- rewrite Z.min_l; [done|lia].
- rewrite Z.min_r; [done|lia].
Qed.
End specs.
Definition min_prog : val :=
λ: "x" "y",
if: "x" < "y" then "x" else "y".
Section specs.
Context `{!foxtrotGS Σ}.
Lemma wp_min_prog (x y:Z) E :
{{{ True }}}
min_prog #x #y @ E
{{{ (z:Z), RET #z; ⌜(z= x `min` y)%Z⌝}}}.
Proof.
iIntros (Φ) "_ HΦ".
rewrite /min_prog.
wp_pures.
case_bool_decide; wp_pures; iApply "HΦ"; iModIntro; iPureIntro.
- rewrite Z.min_l; lia.
- rewrite Z.min_r; lia.
Qed.
Lemma spec_min_prog E j K (x y : Z) :
j ⤇ fill K (min_prog #x #y) -∗ pupd E E (j ⤇ fill K (# (x `min` y)%Z)).
Proof.
rewrite /min_prog.
iIntros "HK".
tp_pures j.
case_bool_decide; tp_pures j.
- rewrite Z.min_l; [done|lia].
- rewrite Z.min_r; [done|lia].
Qed.
End specs.