@Override
 public ESat isEntailed() {
   if (set.getEnvelopeSize() == 0) {
     if (notEmpty) {
       return ESat.FALSE;
     } else {
       return ESat.TRUE;
     }
   }
   int lb = min.getLB();
   int ub = min.getUB();
   for (int j = set.getKernelFirst(); j != SetVar.END; j = set.getKernelNext()) {
     if (get(j) < lb) {
       return ESat.FALSE;
     }
   }
   int minVal = Integer.MAX_VALUE;
   for (int j = set.getEnvelopeFirst(); j != SetVar.END; j = set.getEnvelopeNext()) {
     if (minVal > get(j)) {
       minVal = get(j);
     }
   }
   if (minVal > ub && (notEmpty || set.getKernelSize() > 0)) {
     return ESat.FALSE;
   }
   if (isCompletelyInstantiated()) {
     return ESat.TRUE;
   }
   return ESat.UNDEFINED;
 }
 @Override
 public void propagate(int evtmask) throws ContradictionException {
   for (int j = set.getKernelFirst(); j != SetVar.END; j = set.getKernelNext()) {
     min.updateUpperBound(get(j), this);
   }
   int minVal = Integer.MAX_VALUE;
   int lb = min.getLB();
   for (int j = set.getEnvelopeFirst(); j != SetVar.END; j = set.getEnvelopeNext()) {
     int k = get(j);
     if (k < lb) {
       set.removeFromEnvelope(j, this);
     } else {
       if (minVal > k) {
         minVal = k;
       }
     }
   }
   if (notEmpty || set.getKernelSize() > 0) {
     min.updateLowerBound(minVal, this);
   }
 }