Lvc.Coherence.Coherence
Require Import Util IL RenamedApart LabelsDefined OptionR.
Require Import Annotation Exp SetOperations Liveness.Liveness Restrict.
Set Implicit Arguments.
Lemma plus_minus_eq n m
: n + m - n = m.
Proof.
omega.
Qed.
Ltac inv_get_step_some_minus :=
match goal with
| [ H : get (?f ⊝ (?g1 ⊝ ?A) \\ (?g2 ⊝ ?B) ++ ?C) ?k _,
H' : get ?A ?k _ |- _ ] ⇒
eapply get_app_lt_1 in H; [| eauto 20 with len]
| [ H : get (?f ⊝ (?g1 ⊝ ?A) \\ (?g2 ⊝ ?B) ++ ?C) ?k _,
H' : get ?B ?k _ |- _ ] ⇒
eapply get_app_lt_1 in H; [| eauto 20 with len]
| [ H : get (?f ⊝ (?g1 ⊝ ?A) \\ (?g2 ⊝ ?B) ++ ?C) (❬?B❭ + ?n) _ |- _ ] ⇒
let LENEQ := fresh "LenEq" in
assert (LENEQ:❬f ⊝ (g1 ⊝ A) \\ (g2 ⊝ B)❭ = ❬B❭) by eauto with len;
rewrite get_app_ge in H;
[ rewrite LENEQ in H; rewrite plus_minus_eq in H
| rewrite LENEQ; omega]
| [ H : get (?f ⊝ (?g1 ⊝ ?A) \\ (?g2 ⊝ ?B) ++ ?C) (❬?A❭ + ?n) _ |- _ ] ⇒
let LENEQ := fresh "LenEq" in
assert (LENEQ:❬f ⊝ (g1 ⊝ A) \\ (g2 ⊝ B)❭ = ❬A❭) by eauto with len;
rewrite get_app_ge in H;
[ rewrite LENEQ in H; rewrite plus_minus_eq in H
| rewrite LENEQ; omega]
end.
Smpl Add inv_get_step_some_minus : inv_get.
Require Import Annotation Exp SetOperations Liveness.Liveness Restrict.
Set Implicit Arguments.
Lemma plus_minus_eq n m
: n + m - n = m.
Proof.
omega.
Qed.
Ltac inv_get_step_some_minus :=
match goal with
| [ H : get (?f ⊝ (?g1 ⊝ ?A) \\ (?g2 ⊝ ?B) ++ ?C) ?k _,
H' : get ?A ?k _ |- _ ] ⇒
eapply get_app_lt_1 in H; [| eauto 20 with len]
| [ H : get (?f ⊝ (?g1 ⊝ ?A) \\ (?g2 ⊝ ?B) ++ ?C) ?k _,
H' : get ?B ?k _ |- _ ] ⇒
eapply get_app_lt_1 in H; [| eauto 20 with len]
| [ H : get (?f ⊝ (?g1 ⊝ ?A) \\ (?g2 ⊝ ?B) ++ ?C) (❬?B❭ + ?n) _ |- _ ] ⇒
let LENEQ := fresh "LenEq" in
assert (LENEQ:❬f ⊝ (g1 ⊝ A) \\ (g2 ⊝ B)❭ = ❬B❭) by eauto with len;
rewrite get_app_ge in H;
[ rewrite LENEQ in H; rewrite plus_minus_eq in H
| rewrite LENEQ; omega]
| [ H : get (?f ⊝ (?g1 ⊝ ?A) \\ (?g2 ⊝ ?B) ++ ?C) (❬?A❭ + ?n) _ |- _ ] ⇒
let LENEQ := fresh "LenEq" in
assert (LENEQ:❬f ⊝ (g1 ⊝ A) \\ (g2 ⊝ B)❭ = ❬A❭) by eauto with len;
rewrite get_app_ge in H;
[ rewrite LENEQ in H; rewrite plus_minus_eq in H
| rewrite LENEQ; omega]
end.
Smpl Add inv_get_step_some_minus : inv_get.
Definition of Coherence: srd
Inductive srd : list (option (set var)) → stmt → ann (set var) → Prop :=
| srdExp DL x e s lv al
: srd (restr (getAnn al \ singleton x) ⊝ DL) s al
→ srd DL (stmtLet x e s) (ann1 lv al)
| srdIf DL e s t lv als alt
: srd DL s als
→ srd DL t alt
→ srd DL (stmtIf e s t) (ann2 lv als alt)
| srdRet e DL lv
: srd DL (stmtReturn e) (ann0 lv)
| srdGoto DL lv G' f Y
: get DL (counted f) (Some G')
→ srd DL (stmtApp f Y) (ann0 lv)
| srdLet DL F t lv als alt
: length F = length als
→ (∀ n Zs a, get F n Zs → get als n a →
srd (restr (getAnn a \ of_list (fst Zs)) ⊝
(Some ⊝ (getAnn ⊝ als) \\ (fst ⊝ F) ++ DL)) (snd Zs) a)
→ srd (Some ⊝ (getAnn ⊝ als) \\ (fst ⊝ F) ++ DL) t alt
→ srd DL (stmtFun F t) (annF lv als alt).
Lemma srd_monotone (DL DL' : list (option (set var))) s a
: srd DL s a
→ PIR2 (fstNoneOrR Equal) DL DL'
→ srd DL' s a.
Proof.
intros. general induction H; eauto using srd.
- econstructor.
eapply IHsrd; eauto. eapply restrict_subset; eauto.
- destruct (PIR2_nth H0 H); eauto; dcr. inv H3.
econstructor; eauto.
- econstructor; eauto.
+ intros. eapply H1; eauto.
repeat rewrite List.map_app.
eapply PIR2_app; eauto.
eapply restrict_subset; eauto.
+ eapply IHsrd. eapply PIR2_app; eauto.
Qed.
Lemma srd_monotone2 (DL DL' : list (option (set var))) s a
: srd DL s a
→ PIR2 (fstNoneOrR (flip Subset)) DL DL'
→ srd DL' s a.
Proof.
intros. general induction H; eauto using srd.
- econstructor.
eapply IHsrd; eauto. eapply restrict_subset2; eauto.
- destruct (PIR2_nth H0 H); eauto; dcr. inv H3.
econstructor; eauto.
- econstructor; eauto.
+ intros. eapply H1; eauto.
repeat rewrite List.map_app.
eapply PIR2_app; eauto.
eapply restrict_subset2; eauto.
+ eapply IHsrd. eapply PIR2_app; eauto.
Qed.