tests.v 4.02 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.
7
8
  Definition add := (Lit 21 + Lit 21)%L.
  Goal  σ, prim_step add σ (Lit 42) σ None.
9
  Proof. intros; do_step done. Qed.
10
  Definition rec_app : expr := (rec:: #0 #1) (Lit 0).
Ralf Jung's avatar
Ralf Jung committed
11
  Goal  σ, prim_step rec_app σ rec_app σ None.
12
  Proof. intros; do_step done. Qed.
13
14
  Definition lam : expr := λ: #0 + Lit 21.
  Goal  σ, prim_step (lam (Lit 21)) σ add σ None.
15
  Proof. rewrite /lam /Lam. intros; do_step done. Qed.
Ralf Jung's avatar
Ralf Jung committed
16
17
End LangTests.

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

23
24
  Definition e  : expr := let: ref (Lit 1) in #0 <- !#0 + Lit 1; !#0.
  Goal  σ E, (ownP σ : iProp heap_lang Σ)  (wp E e (λ v, (v = LitV 2))).
25
26
  Proof.
    move=> σ E. rewrite /e.
27
    rewrite -wp_let. rewrite -wp_alloc_pst; last done.
28
29
30
    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=>_.
31
    rewrite -later_intro. asimpl.
32
    rewrite -(wp_bindi (SeqCtx (Load (Loc _)))).
33
    (* FIXME: doing simpl here kills the Seq, turns it all the way into Rec *)
34
    rewrite -(wp_bindi (StoreRCtx (LocV _))).
35
    rewrite -(wp_bindi (BinOpLCtx PlusOp _)).
36
    rewrite -wp_load_pst; first (apply sep_intro_True_r; first done); last first.
37
    { by rewrite lookup_insert. } (* RJ FIXME: figure out why apply and eapply fail. *)
38
    rewrite -later_intro. apply wand_intro_l. rewrite right_id.
39
    rewrite -wp_bin_op // -later_intro.
40
    rewrite -wp_store_pst; first (apply sep_intro_True_r; first done); last first.
41
42
    { by rewrite lookup_insert. }
    { done. }
43
    rewrite -later_intro. apply wand_intro_l. rewrite right_id.
44
    rewrite -wp_seq -wp_value -later_intro.
45
    rewrite -wp_load_pst; first (apply sep_intro_True_r; first done); last first.
46
    { by rewrite lookup_insert. }
47
    rewrite -later_intro. apply wand_intro_l. rewrite right_id.
48
49
    by apply const_intro.
  Qed.
50

51
  Definition FindPred (n2 : expr) : expr :=
52
    rec:: let: #1 + Lit 1 in if #0 < n2.[ren(+3)] then #1 #0 else #2.
53
  Definition Pred : expr :=
54
    λ: if #0  Lit 0 then Lit 0 else FindPred #0 (Lit 0).
Ralf Jung's avatar
Ralf Jung committed
55

56
  Lemma FindPred_spec n1 n2 E Q :
57
    ( (n1 < n2)  Q (LitV $ pred n2))  wp E (FindPred (Lit n2) (Lit n1)) Q.
58
59
60
61
62
63
64
  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.
65
    (* Go on *)
66
    rewrite -wp_let.
67
68
    rewrite -wp_bin_op //. asimpl.
    rewrite -(wp_bindi (IfCtx _ _)).
69
    rewrite -!later_intro /=.
70
    apply wp_lt; intros Hn12.
71
    * rewrite -wp_if_true.
72
      rewrite -!later_intro. asimpl.
73
      rewrite (forall_elim (S n1)).
74
75
76
      eapply impl_elim; first by eapply and_elim_l. apply and_intro.
      + apply const_intro; omega.
      + by rewrite !and_elim_r.
77
    * rewrite -wp_if_false.
78
      rewrite -!later_intro -wp_value' //.
79
      rewrite and_elim_r. apply const_elim_l=>Hle.
Ralf Jung's avatar
Ralf Jung committed
80
      by replace n1 with (pred n2) by omega.
81
82
83
  Qed.

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

97
  Goal  E,
98
    True  wp (Σ:=Σ) E (let: Pred $ Lit 42 in Pred #0) (λ v, (v = LitV 40)).
Ralf Jung's avatar
Ralf Jung committed
99
100
101
102
103
  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.
104
End LiftingTests.