Module Main

Require Import
  Utf8
  Coqlib Values Maps
  Memory IntervalDomain AbMem
  CFG CFGAnalysis CFGAnalysis_proof.

Theorem value_analysis_sound : forall
  (p: program)
  (stk: list stackframe) (f: function)
  (sp: val) (pc: node) (e: env) (m: Mem.mem)
  (k: num_dom_kind),
    Reach p (State stk f sp pc e m) →
    match vanalysis k f pc with
      | Bot => False
      | NotBot range =>
        ∀ x v,
          PTree.get x e = Some v
          match v with
            | Vint i
            | Vptr _ i => ints_in_range (range x) i
            | _ => True
          end
    end.
Proof.
  intros p stk f sp pc e m k H.
  unfold vanalysis.
  destruct k;
  eapply value_analysis_correct_if_abmem_preserves_memory; eauto;
  intros e0 m0 m' [|(a,b)] X; intuition.
Qed.