Presburger Arithmetic and Its Use in Verification
Presburger Arithmetic and Its Use in Verification
Presburger Arithmetic and Its Use in Verification
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
B.5.<br />
COOPER.FS (EXCERPT)<br />
| SAnd(f, vr) −> (f |> cooperParallel, vr) |>SAnd<br />
| SOr(f, vr) −> (f |> cooperParallel, vr) |>SOr<br />
| E(xs, SOr(f, vr))<br />
−> SOr(cooperParallel (E(xs, f)), vr)<br />
| E(xs, Or fs) −> //pr<strong>in</strong>tfn "EOr.xs=%i, fs=%i" xs.Length fs.Length<br />
fs |> parMap (fun f −> cooperParallel (E(xs, f))) |> Or<br />
| E(xs, f) −> List.fold (fun acc x −> (elimQuantifierParallel x acc)) (nnf (<br />
cooperParallel f)) xs<br />
| A(xs, SAnd(f, vr))<br />
−> SAnd(cooperParallel (A(xs, f)), vr)<br />
| A(xs, And fs) −> //pr<strong>in</strong>tfn "AAnd.xs=%i, fs=%i" xs.Length fs.Length<br />
fs |> parMap (fun f −> cooperParallel (A(xs, f))) |> And<br />
| A(xs, f) −> Not (List.fold (fun acc x −> (elimQuantifierParallel x acc)) (<br />
nnf (cooperParallel (Not f))) xs)<br />
| _ −> formula<br />
let elimQuantifiers = cooper >> reduce<br />
let elimQuantifiersParallel = cooperParallel >> reduce<br />
//<br />
// Evaluation part<br />
//<br />
let cartesian lss =<br />
let klls=[for x <strong>in</strong> l do<br />
for xs <strong>in</strong> ls −> x::xs ]<br />
List.foldBack k lss [[]]<br />
let genRangeArray vr =<br />
vr |> List.map (fun (v, r) −> List.<strong>in</strong>it r (fun i −> (v, i))) |> cartesian |><br />
List.toArray<br />
// Substitute a list of variables <strong>and</strong> associated values to a formula<br />
// Suppose the formula is quantifier−free<br />
let rec evalFormula xts formula =<br />
match formula with<br />
| C(t, ct) −> match subst (t, xts) with<br />
| t’ −> if isConstTerm t’ then<br />
let c = getConst t’<br />
match ct, c with<br />
| EQ, 0−> TT<br />
| UEQ, xwhenx 0 −> TT<br />
| GT, xwhenx>0−> TT<br />
| _, _ −> FF<br />
else <strong>in</strong>validArg "evalFormula" (str<strong>in</strong>g xts)<br />
| D(i, t) −> match subst (t, xts) with<br />
| t’ −> if isConstTerm t’ then<br />
let c = getConst t’<br />
if i %| c then TT else FF<br />
83