code: def induce(self, mode, pos, neg, b, filestem='default', printOutput=False):
          
          # Write the inputs to appropriate files.
          self.__prepare(filestem, pos, neg, b)
  
          # Make a script to run aleph (with appropriate settings).
          self.__script(mode, filestem)
  
          logger.info("Running aleph...")
  
          dumpFile = None
          if not printOutput:
              dumpFile = tempfile.TemporaryFile()
  
          # Run the aleph script.
          p = SafePopen(['yap', '-s50000', '-h200000', '-L', Aleph.SCRIPT],
                        cwd=self.tmpdir,
                        stdout=dumpFile,
                        stderr=dumpFile
                        ).safe_run()
          stdout_str, stderr_str = p.communicate()
  
          logger.info("Done.")
  
          result = None
          if mode != 'induce_features':
              # Return the rules written in the output file.
              rules_fn = filestem + Aleph.RULES_SUFFIX
              result = open('%s/%s' % (self.tmpdir, rules_fn)).read()
              features = None
          else:
              features_fn = filestem + Aleph.FEATURES_SUFFIX
              features = open('%s/%s' % (self.tmpdir, features_fn)).read()
              dataset_fn = filestem + Aleph.PROP_DATASET_SUFFIX
              pl_dataset = open('%s/%s' % (self.tmpdir, dataset_fn)).read()
              result = self.__to_arff(features, pl_dataset, filestem)
  
          # Cleanup.
          self.__cleanup()
          return (result, features)
docs: Induce a theory or features in 'mode'.
  
              :param filestem: The base name of this experiment.
              :param mode: In which mode to induce rules/features.
              :param pos: String of positive examples.
              :param neg: String of negative examples.
              :param b: String of background knowledge.
  
              :return: The theory as a string or an arff dataset in induce_features mode.
              :rtype: str