fact: Fixpoint assume_eval (a: aexp) (Res: V.t) (S: ST.t) : ST.t := match a with | CONST n => if V.isIn n Res then S else ST.bot | VAR x => ST.set x (V.meet Res (ST.get x S)) S | PLUS a1 a2 => let N1 := Aeval a1 S in let N2 := Aeval a2 S in let Res1 := V.meet N1 (V.sub Res N2) in let Res2 := V.meet N2 (V.sub Res N1) in assume_eval a1 Res1 (assume_eval a2 Res2 S) | MINUS a1 a2 => let N1 := Aeval a1 S in let N2 := Aeval a2 S in let Res1 := V.meet N1 (V.add Res N2) in let Res2 := V.meet N2 (V.sub N1 Res) in assume_eval a1 Res1 (assume_eval a2 Res2 S) end.
imports: Coq(ZArith Psatz Bool String List FMaps) Coq(FunctionalExtensionality) CDF(Sequences IMP)