private static CharProperty intersection(CharProperty lhs,
                                          CharProperty rhs) {
     return new CharProperty((int ch)=>
         {
             return lhs.isSatisfiedBy(ch) && rhs.isSatisfiedBy(ch);
         });
 }
 private static CharProperty setDifference(CharProperty lhs,
                                           CharProperty rhs) {
     return new CharProperty((int ch)=>
         {
             return ! rhs.isSatisfiedBy(ch) && lhs.isSatisfiedBy(ch);
         });
 }
 private static CharProperty union(CharProperty lhs,
                                   CharProperty rhs) {
     return new CharProperty((int ch)=>
         {
             return lhs.isSatisfiedBy(ch) || rhs.isSatisfiedBy(ch);
         });
 }