tests.v 4.53 KB
Newer Older
Ralf Jung's avatar
Ralf Jung committed
1
(** This file is essentially a bunch of testcases. *)
Ralf Jung's avatar
Ralf Jung committed
2
Require Import program_logic.upred 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.
7 8
  Definition add := (21 + 21)%L.
  Goal  σ, prim_step add σ 42 σ None.
9
  Proof. intros; do_step done. Qed.
10
  Definition rec : expr := rec:: #0 #1. (* fix f x => f x *)
Ralf Jung's avatar
Ralf Jung committed
11
  Definition rec_app : expr := rec 0.
Ralf Jung's avatar
Ralf Jung committed
12
  Goal  σ, prim_step rec_app σ rec_app σ None.
13
  Proof. Set Printing All. intros; do_step done. Qed.
14
  Definition lam : expr := λ: #0 + 21.
15
  Goal  σ, prim_step (App lam (LitNat 21)) σ add σ None.
16
  Proof. intros; do_step done. Qed.
Ralf Jung's avatar
Ralf Jung committed
17 18
End LangTests.

19
Module LiftingTests.
20 21
  Context {Σ : iFunctor}.
  Implicit Types P : iProp heap_lang Σ.
22
  Implicit Types Q : val  iProp heap_lang Σ.
23

24
  (* FIXME: Fix levels so that we do not need the parenthesis here. *)
25
  Definition e  : expr := let: ref 1 in #0 <- !#0 + 1; !#0.
Ralf Jung's avatar
Ralf Jung committed
26
  Goal  σ E, (ownP σ : iProp heap_lang Σ)  (wp E e (λ v, (v = 2))).
27 28
  Proof.
    move=> σ E. rewrite /e.
29
    rewrite -wp_let. rewrite -wp_alloc_pst; last done.
30 31 32
    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=>_.
33
    rewrite -later_intro. asimpl.
34 35
    (* TODO RJ: If you go here, you can see how the sugar does not print
       all so nicely. *)
36 37 38
    rewrite -(wp_bindi (SeqCtx (Load (Loc _)))).
    rewrite -(wp_bindi (StoreRCtx (LocV _))).
    rewrite -(wp_bindi (PlusLCtx _)).
39
    rewrite -wp_load_pst; first (apply sep_intro_True_r; first done); last first.
40
    { by rewrite lookup_insert. } (* RJ FIXME: figure out why apply and eapply fail. *)
41
    rewrite -later_intro. apply wand_intro_l. rewrite right_id.
Ralf Jung's avatar
Ralf Jung committed
42
    rewrite -wp_plus -later_intro.
43
    rewrite -wp_store_pst; first (apply sep_intro_True_r; first done); last first.
44 45
    { by rewrite lookup_insert. }
    { done. }
46
    rewrite -later_intro. apply wand_intro_l. rewrite right_id.
47
    rewrite -wp_lam // -later_intro. asimpl.
48
    rewrite -wp_load_pst; first (apply sep_intro_True_r; first done); last first.
49
    { by rewrite lookup_insert. }
50
    rewrite -later_intro. apply wand_intro_l. rewrite right_id.
51 52
    by apply const_intro.
  Qed.
53

Ralf Jung's avatar
Ralf Jung committed
54 55 56
  (* TODO: once asimpl preserves notation, we don't need
     FindPred' anymore. *)
  (* FIXME: fix notation so that we do not need parenthesis or %L *)
57 58 59 60 61 62
  Definition FindPred' n1 Sn1 n2 f : expr :=
    if Sn1 < n2 then f Sn1 else n1.
  Definition FindPred n2 : expr :=
    rec:: (let: #1 + 1 in FindPred' #2 #0 n2.[ren(+3)] #1)%L.
  Definition Pred : expr :=
    λ: (if #0  0 then 0 else FindPred #0 0)%L.
Ralf Jung's avatar
Ralf Jung committed
63

64
  Lemma FindPred_spec n1 n2 E Q :
Ralf Jung's avatar
Ralf Jung committed
65 66
    ((n1 < n2)  Q (pred n2)) 
       wp E (FindPred n2 n1) Q.
67 68 69 70 71 72 73 74
  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. *)
Ralf Jung's avatar
Ralf Jung committed
75
    rewrite -(wp_let _ _ (FindPred' n1 #0 n2 (FindPred n2))).
76
    rewrite -wp_plus. asimpl.
77
    rewrite -(wp_bindi (CaseCtx _ _)).
78
    rewrite -!later_intro /=.
79
    apply wp_lt; intros Hn12.
80
    * (* TODO RJ: It would be better if we could use wp_if_true here
81 82 83
         (and below). But we cannot, because the substitutions in there
         got already unfolded. *)
      rewrite -wp_case_inl //.
84
      rewrite -!later_intro. asimpl.
85
      rewrite (forall_elim (S n1)).
86 87 88
      eapply impl_elim; first by eapply and_elim_l. apply and_intro.
      + apply const_intro; omega.
      + by rewrite !and_elim_r.
89
    * rewrite -wp_case_inr //.
90
      rewrite -!later_intro -wp_value' //.
91
      rewrite and_elim_r. apply const_elim_l=>Hle.
Ralf Jung's avatar
Ralf Jung committed
92
      by replace n1 with (pred n2) by omega.
93 94 95
  Qed.

  Lemma Pred_spec n E Q :
Ralf Jung's avatar
Ralf Jung committed
96
    Q (pred n)  wp E (Pred n) Q.
97 98
  Proof.
    rewrite -wp_lam //. asimpl.
99
    rewrite -(wp_bindi (CaseCtx _ _)).
100
    apply later_mono, wp_le=> Hn.
Ralf Jung's avatar
Ralf Jung committed
101 102
    - rewrite -wp_case_inl //.
      rewrite -!later_intro -wp_value' //.
Ralf Jung's avatar
Ralf Jung committed
103
      by replace n with 0 by omega.
Ralf Jung's avatar
Ralf Jung committed
104
    - rewrite -wp_case_inr //.
105
      rewrite -!later_intro -FindPred_spec.
Ralf Jung's avatar
Ralf Jung committed
106
      auto using and_intro, const_intro with omega.
107
  Qed.
Ralf Jung's avatar
Ralf Jung committed
108

109
  Goal  E,
110
    True  wp (Σ:=Σ) E (let: Pred 42 in Pred #0) (λ v, (v = 40)).
Ralf Jung's avatar
Ralf Jung committed
111 112 113 114 115
  Proof.
    intros E. rewrite -wp_let. rewrite -Pred_spec -!later_intro.
    asimpl. (* TODO RJ: Can we somehow make it so that Pred gets folded again? *)
    rewrite -Pred_spec -later_intro. by apply const_intro.
  Qed.
116
End LiftingTests.