public static DecisionTree induceDecisionTree(List examples) {
    { List features = List.newList();
      Symbol feature = null;
      DecisionTree tree = null;
      List props = List.newList();
      HashTable propositionTable = HashTable.newHashTable();

      System.out.println("  Inducing decision tree");
      if (((TrainingExample)(examples.first())).module != null) {
        ((TrainingExample)(examples.first())).module.changeModule();
      }
      props = Logic.getClassificationRelations(((TrainingExample)(examples.first())).query);
      { int i = Stella.NULL_INTEGER;
        int iter000 = 0;
        int upperBound000 = props.length() - 1;
        Cons collect000 = null;

        for (;iter000 <= upperBound000; iter000 = iter000 + 1) {
          i = iter000;
          feature = Symbol.internSymbol("A" + Native.stringify(IntegerWrapper.wrapInteger(i)));
          propositionTable.insertAt(feature, ((Proposition)(props.nth(i))));
          if (collect000 == null) {
            {
              collect000 = Cons.cons(feature, Stella.NIL);
              if (features.theConsList == Stella.NIL) {
                features.theConsList = collect000;
              }
              else {
                Cons.addConsToEndOfConsList(features.theConsList, collect000);
              }
            }
          }
          else {
            {
              collect000.rest = Cons.cons(feature, Stella.NIL);
              collect000 = collect000.rest;
            }
          }
        }
      }
      tree = ((DecisionTree)(Logic.buildDecisionTree(examples, features, Stella.NIL)));
      DecisionTree.addPropositionsToDecisionTree(tree, propositionTable);
      return (tree);
    }
  }