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.4.<br />
PAGENERATOR.FS (EXCERPT)<br />
B.4 PAGenerator.fs (excerpt)<br />
// Generate PA Fragments for test<strong>in</strong>g Cooper algorithm<br />
module PAGenerator<br />
// Formulate pigeon hole pr<strong>in</strong>ciple <strong>in</strong> propositional logic (N pigeons <strong>and</strong> K holes)<br />
let rec tab n f =<br />
match n with<br />
| xwhenx []<br />
| _ −> fn:: tab (n−1) f<br />
// Pigeon i is <strong>in</strong> hole k<br />
let Xik= A( L ("x(" + str<strong>in</strong>g i + "," + str<strong>in</strong>g k + ")"), true)<br />
let Yik= A( C(Zero, var ("x" + str<strong>in</strong>g i + "_" + str<strong>in</strong>g k + ""), LE), true)<br />
let Zik= A( C(Zero, var ("x" + str<strong>in</strong>g i + "_" + str<strong>in</strong>g k + ""), EQ), true)<br />
let Tik= A( D(2, var ("x" + str<strong>in</strong>g i + "_" + str<strong>in</strong>g k + "")), true)<br />
// If pigeon i is <strong>in</strong> hole k so no one else is <strong>in</strong> hole k<br />
let Fpred(i, k) (N, K) =(pred i k) =>(And (tab N (fun i’ −> if i = i’ then TT else<br />
Not (pred i’ k))))<br />
// Apply F for all i <strong>and</strong> k<br />
let Fall pred (N, K) =And (tab N (fun i −> And (tab K (fun k −> Fpred(i, k) (N, K)))<br />
))<br />
// Pigeon i has assigned a hole<br />
let Gpredi(N, K) =Or (tab K (fun k −> pred i k))<br />
// All pigeons have been assigned holes<br />
let Gall pred (N, K) =And (tab N (fun i −> Gpredi(N, K)))<br />
// A pigeon is only <strong>in</strong> one hole<br />
let Hpred(i, k) (N, K) =(pred i k) =>(And (tab K (fun k’ −> if k = k’ then TT else<br />
Not (pred i k’))))<br />
// Every pigeon has exactly one hole<br />
let Hall pred (N, K) =And (tab N (fun i −> And (tab K (fun k −> Hpred(i, k) (N, K)))<br />
))<br />
let pigeon pred (N, K) =And [Fall pred (N, K) ;Gall pred (N, K) ;Hall pred (N, K)]<br />
let pigeonY = pigeon Y<br />
let pigeonZ = pigeon Z<br />
let pigeonT = pigeon T<br />
let generateFormula pigeonPred (N, K, Q) =<br />
let rec takeLast(ls, q) =<br />
if List.length ls