sugar.v 2.36 KB
Newer Older
1
2
Require Export barrier.heap_lang barrier.lifting.
Import uPred.
3
Import heap_lang.
4
5
6
7
8
9
10
11
12
13
14
15
16

(** Define some syntactic sugar. LitTrue and LitFalse are defined in heap_lang.v. *)
Definition Lam (e : {bind expr}) := Rec e.[ren(+1)].
Definition Let (e1 : expr) (e2: {bind expr}) := App (Lam e2) e1.
Definition Seq (e1 e2 : expr) := Let e1 e2.[ren(+1)].
Definition If (e0 e1 e2 : expr) := Case e0 e1.[ren(+1)] e2.[ren(+1)].
Definition Lt e1 e2 := Le (Plus e1 $ LitNat 1) e2.
Definition Eq e1 e2 :=
  Let e1 (Let e2.[ren(+1)]
         (If (Le (Var 0) (Var 1)) (Le (Var 1) (Var 0)) LitFalse)).

Definition LamV (e : {bind expr}) := RecV e.[ren(+1)].

17
18
Definition LetCtx (e2 : {bind expr}) := AppRCtx (LamV e2).
Definition SeqCtx (e2 : expr) := LetCtx (e2.[ren(+1)]).
19

20
Section suger.
21
22
Context {Σ : iFunctor}.
Implicit Types P : iProp heap_lang Σ.
23
Implicit Types Q : val  iProp heap_lang Σ.
24

25
26
(** Proof rules for the sugar *)
Lemma wp_lam E ef e v Q :
27
  to_val e = Some v   wp E ef.[e/] Q  wp E (App (Lam ef) e) Q.
28
29
30
31
32
33
34
Proof.
  intros Hv. rewrite -wp_rec; last eassumption.
  (* RJ: This pulls in functional extensionality. If that bothers us, we have
     to talk to the Autosubst guys. *)
  by asimpl.
Qed.
Lemma wp_let e1 e2 E Q :
35
  wp E e1 (λ v, wp E (e2.[of_val v/]) Q)  wp E (Let e1 e2) Q.
36
Proof.
37
38
  rewrite -(wp_bind [LetCtx e2]). apply wp_mono=>v.
  by rewrite -wp_lam //= to_of_val.
39
Qed.
40
41
42
43
Lemma wp_if_true e1 e2 E Q :  wp E e1 Q  wp E (If LitTrue e1 e2) Q.
Proof. rewrite -wp_case_inl //. by asimpl. Qed.
Lemma wp_if_false e1 e2 E Q :  wp E e2 Q  wp E (If LitFalse e1 e2) Q.
Proof. rewrite -wp_case_inr //. by asimpl. Qed.
44
Lemma wp_lt n1 n2 E P Q :
45
46
  (n1 < n2  P   Q LitTrueV) 
  (n1  n2  P   Q LitFalseV) 
47
  P  wp E (Lt (LitNat n1) (LitNat n2)) Q.
48
Proof.
49
50
  intros; rewrite -(wp_bind [LeLCtx _]) -wp_plus -later_intro /=.
  auto using wp_le with lia.
51
52
Qed.
Lemma wp_eq n1 n2 E P Q :
53
54
  (n1 = n2  P   Q LitTrueV) 
  (n1  n2  P   Q LitFalseV) 
55
  P  wp E (Eq (LitNat n1) (LitNat n2)) Q.
56
57
Proof.
  intros HPeq HPne.
58
59
60
61
62
63
  rewrite -wp_let -wp_value' // -later_intro; asimpl.
  rewrite -wp_rec //; asimpl.
  rewrite -(wp_bind [CaseCtx _ _]) -later_intro; asimpl.
  apply wp_le; intros; asimpl.
  * rewrite -wp_case_inl // -!later_intro. apply wp_le; auto with lia.
  * rewrite -wp_case_inr // -later_intro -wp_value' //; auto with lia.
64
Qed.
65
End suger.