public static boolean ruleCoversExampleP(Cons reverseRule, TrainingExample example) {
    if (reverseRule == Stella.NIL) {
      return (true);
    }
    { QueryIterator query = null;
      Cons rule = ((Cons)(Stella_Object.copyConsTree(reverseRule))).reverse();
      List vars = ((List)(Logic.getVariablesFromConsPropositions(rule).remove(Logic.SYM_LOGIC_pY)));
      Cons consQuery = Stella.NIL;
      Cons types = Stella.NIL;

      if (example.module != null) {
        example.module.changeModule();
      }
      consQuery = Cons.cons(Logic.SYM_STELLA_AND, ((Cons)(Stella_Object.substituteConsTree(rule, example.name, Logic.SYM_LOGIC_pY))));
      if (!vars.emptyP()) {
        { Symbol var = null;
          Cons iter000 = vars.theConsList;

          for (;!(iter000 == Stella.NIL); iter000 = iter000.rest) {
            var = ((Symbol)(iter000.value));
            if (Logic.$ENABLE_USER_THING$ &&
                ((var.symbolName).charAt(1) == 'X')) {
              types = Cons.cons(Cons.cons(var, Cons.cons(Logic.SYM_LOGIC_USER_THING, Stella.NIL)), types);
            }
            else {
              types = Cons.cons(var, types);
            }
          }
        }
        consQuery = Cons.list$(Cons.cons(Logic.SYM_STELLA_EXISTS, Cons.cons(types, Cons.cons(Cons.cons(consQuery, Stella.NIL), Stella.NIL))));
      }
      if (Logic.$OPTIMIZE_INDUCED_QUERIES$) {
        query = Logic.makeQuery(Stella.NIL, consQuery, Stella.NIL, Cons.list$(Cons.cons(Logic.KWD_TIMEOUT, Cons.cons(IntegerWrapper.wrapInteger(300), Cons.cons(Stella.NIL, Stella.NIL)))));
      }
      else {
        query = Logic.makeQuery(Stella.NIL, consQuery, Stella.NIL, Cons.list$(Cons.cons(Logic.KWD_TIMEOUT, Cons.cons(IntegerWrapper.wrapInteger(300), Cons.cons(Logic.KWD_DONT_OPTIMIZEp, Cons.cons(Logic.SYM_STELLA_TRUE, Cons.cons(Stella.NIL, Stella.NIL)))))));
      }
      return (TruthValue.trueTruthValueP(Logic.callAsk(query)));
    }
  }