tests.v 4.03 KB
Newer Older
Ralf Jung's avatar
Ralf Jung committed
1
(** This file is essentially a bunch of testcases. *)
2
Require Import program_logic.ownership.
Ralf Jung's avatar
Ralf Jung committed
3
Require Import heap_lang.lifting heap_lang.sugar.
4
Import heap_lang uPred notations.
Ralf Jung's avatar
Ralf Jung committed
5 6

Module LangTests.
Robbert Krebbers's avatar
Robbert Krebbers committed
7 8
  Definition add := ('21 + '21)%L.
  Goal  σ, prim_step add σ ('42) σ None.
9
  Proof. intros; do_step done. Qed.
Robbert Krebbers's avatar
Robbert Krebbers committed
10
  Definition rec_app : expr := ((rec: "f" "x" := "f" "x") '0)%L.
Ralf Jung's avatar
Ralf Jung committed
11
  Goal  σ, prim_step rec_app σ rec_app σ None.
12 13 14 15
  Proof.
    intros. rewrite /rec_app. (* FIXME: do_step does not work here *)
    by eapply (Ectx_step  _ _ _ _ _ []), (BetaS _ _ _ _ (LitV (LitNat 0))).
  Qed.
Robbert Krebbers's avatar
Robbert Krebbers committed
16 17
  Definition lam : expr := λ: "x", "x" + '21.
  Goal  σ, prim_step (lam '21)%L σ add σ None.
18 19
  Proof.
    intros. rewrite /lam. (* FIXME: do_step does not work here *)
Robbert Krebbers's avatar
Robbert Krebbers committed
20
    by eapply (Ectx_step  _ _ _ _ _ []), (BetaS "" "x" ("x" + '21) _ (LitV 21)).
21
  Qed.
Ralf Jung's avatar
Ralf Jung committed
22 23
End LangTests.

24
Module LiftingTests.
25 26
  Context {Σ : iFunctor}.
  Implicit Types P : iProp heap_lang Σ.
27
  Implicit Types Q : val  iProp heap_lang Σ.
28

29
  Definition e  : expr :=
Robbert Krebbers's avatar
Robbert Krebbers committed
30
    let: "x" := ref '1 in "x" <- !"x" + '1; !"x".
31
  Goal  σ E, ownP (Σ:=Σ) σ  wp E e (λ v, v = LitV 2).
32 33
  Proof.
    move=> σ E. rewrite /e.
34
    rewrite -(wp_bindi (LetCtx _ _)) -wp_alloc_pst //=.
35
    apply sep_intro_True_r; first done.
36 37
    rewrite -later_intro; apply forall_intro=>l; apply wand_intro_l.
    rewrite right_id; apply const_elim_l=> _.
38 39
    rewrite -wp_let //= -later_intro.
    rewrite -(wp_bindi (SeqCtx (Load (Loc _)))) /=. 
40 41
    rewrite -(wp_bindi (StoreRCtx (LocV _))) /=.
    rewrite -(wp_bindi (BinOpLCtx PlusOp _)) /=.
42
    rewrite -wp_load_pst; first (apply sep_intro_True_r; first done); last first.
43
    { by rewrite lookup_insert. } (* RJ FIXME: figure out why apply and eapply fail. *)
44
    rewrite -later_intro; apply wand_intro_l; rewrite right_id.
45
    rewrite -wp_bin_op // -later_intro.
46
    rewrite -wp_store_pst; first (apply sep_intro_True_r; first done); last first.
47 48
    { by rewrite lookup_insert. }
    { done. }
49
    rewrite -later_intro. apply wand_intro_l. rewrite right_id.
50
    rewrite -wp_seq -wp_value -later_intro.
51
    rewrite -wp_load_pst; first (apply sep_intro_True_r; first done); last first.
52
    { by rewrite lookup_insert. }
53
    rewrite -later_intro. apply wand_intro_l. rewrite right_id.
54 55
    by apply const_intro.
  Qed.
56

57
  Definition FindPred (n2 : expr) : expr :=
58
    rec: "pred" "y" :=
Robbert Krebbers's avatar
Robbert Krebbers committed
59
      let: "yp" := "y" + '1 in
60
      if "yp" < n2 then "pred" "yp" else "y".
61
  Definition Pred : expr :=
Robbert Krebbers's avatar
Robbert Krebbers committed
62
    λ: "x", if "x"  '0 then '0 else FindPred "x" '0.
Ralf Jung's avatar
Ralf Jung committed
63

64
  Lemma FindPred_spec n1 n2 E Q :
65
    ( (n1 < n2)  Q (LitV (n2 - 1)))  wp E (FindPred 'n2 'n1)%L Q.
66 67
  Proof.
    revert n1. apply löb_all_1=>n1.
68
    rewrite (commutative uPred_and ( _)%I) associative; apply const_elim_r=>?.
69
    rewrite -wp_rec' // =>-/=.
70 71 72
    (* FIXME: ssr rewrite fails with "Error: _pattern_value_ is used in conclusion." *)
    rewrite ->(later_intro (Q _)).
    rewrite -!later_and; apply later_mono.
73
    (* Go on *)
74 75
    rewrite -(wp_bindi (LetCtx _ _)) -wp_bin_op //= -wp_let //=.
    rewrite -(wp_bindi (IfCtx _ _)) /= -!later_intro.
76 77 78 79
    apply wp_lt=> ?.
    - rewrite -wp_if_true.
      rewrite -!later_intro (forall_elim (n1 + 1)) const_equiv; last omega.
      by rewrite left_id impl_elim_l.
80
    - assert (n1 = n2 - 1) as -> by omega.
81 82
      rewrite -wp_if_false.
      by rewrite -!later_intro -wp_value' // and_elim_r.
83 84
  Qed.

85
  Lemma Pred_spec n E Q :  Q (LitV (n - 1))  wp E (Pred 'n)%L Q.
86
  Proof.
87
    rewrite -wp_lam //=.
88
    rewrite -(wp_bindi (IfCtx _ _)) /=.
89
    apply later_mono, wp_le=> Hn.
90
    - rewrite -wp_if_true.
91 92
      rewrite -!later_intro -wp_value' //=.
      auto with f_equal omega.
93
    - rewrite -wp_if_false.
94
      rewrite -!later_intro -FindPred_spec.
Ralf Jung's avatar
Ralf Jung committed
95
      auto using and_intro, const_intro with omega.
96
  Qed.
Ralf Jung's avatar
Ralf Jung committed
97

98
  Goal  E,
Robbert Krebbers's avatar
Robbert Krebbers committed
99
    True  wp (Σ:=Σ) E (let: "x" := Pred '42 in Pred "x")
100
                       (λ v, v = LitV 40).
Ralf Jung's avatar
Ralf Jung committed
101
  Proof.
102 103 104
    intros E.
    rewrite -(wp_bindi (LetCtx _ _)) -Pred_spec //= -wp_let //=.
    rewrite -Pred_spec -!later_intro /=. by apply const_intro.
Ralf Jung's avatar
Ralf Jung committed
105
  Qed.
106
End LiftingTests.