public static void bottomUpRuleInduction(List examples, boolean simplifyRuleP) {
    { List positive = List.newList();
      List negative = List.newList();
      List allPositive = null;
      List allNegative = null;
      List rules = List.newList();
      Symbol concept = ((TrainingExample)(examples.first())).concept;
      Cons rule = Stella.NIL;

      { TrainingExample example = null;
        Cons iter000 = examples.theConsList;

        for (;!(iter000 == Stella.NIL); iter000 = iter000.rest) {
          example = ((TrainingExample)(iter000.value));
          if (BooleanWrapper.coerceWrappedBooleanToBoolean(((BooleanWrapper)(example.output)))) {
            positive.push(example);
          }
          else {
            negative.push(example);
          }
        }
      }
      allPositive = positive.copy();
      allNegative = negative.copy();
      Logic.collectFactsInExamples(positive);
      { TrainingExample example = null;
        Cons iter001 = positive.theConsList;

        for (;!(iter001 == Stella.NIL); iter001 = iter001.rest) {
          example = ((TrainingExample)(iter001.value));
          example.facts = ((Cons)(Stella_Object.substituteConsTree(example.facts, Logic.SYM_LOGIC_pY, example.name)));
        }
      }
      System.out.println("Starting rule induction with " + positive.length() + " positive and " + negative.length() + " negative examples");
      loop002 : while (!positive.emptyP()) {
        rule = Logic.learnOneRuleBottomUp(positive, negative);
        if (rule == Stella.NIL) {
          System.out.println("Quiting with " + positive.length() + " examples uncovered");
          break loop002;
        }
        else if (simplifyRuleP &&
            allNegative.nonEmptyP()) {
          rule = Logic.simplifyAntecedent(rule, Stella.getQuotedTree("((?Y) \"/LOGIC\")", "/LOGIC"), allPositive, allNegative);
        }
        else {
        }
        rules.push(Cons.list$(Cons.cons(Logic.SYM_STELLA_eg, Cons.cons(Cons.cons(Logic.SYM_STELLA_AND, ((Cons)(Stella_Object.copyConsTree(rule))).concatenate(Stella.NIL, Stella.NIL)), Cons.cons(Cons.cons(concept, Cons.cons(Logic.SYM_LOGIC_pY, Stella.NIL)), Cons.cons(Stella.NIL, Stella.NIL))))));
      }
      {
        System.out.println();
        System.out.println("PowerLoom has induced the following rules");
        System.out.println();
      }
;
      if (rules != null) {
        { Cons rule000 = null;
          Cons iter002 = rules.theConsList;

          for (;!(iter002 == Stella.NIL); iter002 = iter002.rest) {
            rule000 = ((Cons)(iter002.value));
            System.out.println(rule000);
          }
        }
        Logic.$INDUCED_DECISION_RULES$ = rules;
      }
    }
  }