iboolean geq(iboolean x, iboolean y) // Project the constraint x>=y with respect to x { iboolean r; r=iboolean(iperhaps); if (y.value==empty) r=iboolean(empty); if (y.value==itrue) r=iboolean(itrue); return Inter(x,r); }
iboolean And(iboolean x, iboolean y) { if ((x.value == iempty)||(y.value == iempty)) return iboolean(iempty); if ((x.value == ifalse)||(y.value == ifalse)) return iboolean(ifalse); if ((x.value == iperhaps)||(y.value == iperhaps)) return iboolean(iperhaps); return iboolean(itrue); }
// Project the constraint x>=y with respect to x iboolean geq(iboolean x, iboolean y) { iboolean r; r = iboolean(iperhaps); if (y.value == iempty) r = iboolean(iempty); if (y.value == itrue) r = iboolean(itrue); return Inter(x,r); }
iboolean Union(iboolean x, iboolean y) { if (x.value == iempty) return y.value; if (y.value == iempty) return x.value; if (x.value == y.value) return x.value; return iboolean(iperhaps); }
iboolean Inter(iboolean x, iboolean y) { if (x.value == y.value) return x.value; if (x.value == iperhaps) return y.value; if (y.value == iperhaps) return x.value; return iboolean(iempty); }
iboolean Xor(iboolean x, iboolean y) { if (x.value == empty) return empty; if (y.value == empty) return empty; if (x.value == iperhaps) return iperhaps; if (y.value == iperhaps) return iperhaps; if (x.value == y.value) return ifalse; return iboolean(itrue); }
iboolean leq(iboolean x, iboolean y) // Project the constraint x<=y with respect to x { iboolean r; r=iboolean(iperhaps); if (y.value==empty) r=iboolean(empty); if (y.value==ifalse) r=iboolean(ifalse); return Inter(x,r); /* a && (implique b) 1*0=\empty 1 && 0 1*1=1 1 && [0,1] 1*[0,1]=1 1 && [0,1] 0*0=0 0 && 0 0*1=0 0 && [0,1] 0*[0,1]=0 0 && [0,1] [0,1]*0=0 [0,1] && 0 [0,1]*1=[0,1] [0,1] && [0,1] [0,1]*[0,1]=[0,1] [0,1] && [0,1] */ }
// Project the constraint x<=y with respect to x iboolean leq(iboolean x, iboolean y) { iboolean r; r = iboolean(iperhaps); if (y.value == iempty) r = iboolean(iempty); if (y.value == ifalse) r = iboolean(ifalse); return Inter(x,r); /* a && (implique b) 1*0=\iempty 1 && 0 1*1=1 1 && [0,1] 1*[0,1]=1 1 && [0,1] 0*0=0 0 && 0 0*1=0 0 && [0,1] 0*[0,1]=0 0 && [0,1] [0,1]*0=0 [0,1] && 0 [0,1]*1=[0,1] [0,1] && [0,1] [0,1]*[0,1]=[0,1] [0,1] && [0,1] */ }
iboolean operator! (iboolean& x) { if (x.value == itrue) return iboolean(ifalse); if (x.value == ifalse) return iboolean(itrue); return x; }