/**
  * Create negation of compound predicate by using logic rules: 1. not (x || y) is (not x && not y)
  * 2. not (x && y) is (not x || not y)
  */
 @Override
 public Predicate not() {
   toggleOperator();
   for (Expression expr : this.getExpressions()) {
     if (Predicate.class.isInstance(expr)) {
       ((Predicate) expr).not();
     }
   }
   return this;
 }
 @Override
 public Predicate isFalse(Expression<Boolean> expression) {
   if (CompoundPredicate.class.isInstance(expression)) {
     final CompoundPredicate predicate = (CompoundPredicate) expression;
     if (predicate.getExpressions().size() == 0) {
       return new BooleanStaticAssertionPredicate(
           this, predicate.getOperator() == Predicate.BooleanOperator.OR);
     }
     predicate.not();
     return predicate;
   } else if (Predicate.class.isInstance(expression)) {
     final Predicate predicate = (Predicate) expression;
     predicate.not();
     return predicate;
   }
   return new BooleanAssertionPredicate(this, expression, Boolean.FALSE);
 }