code: public MealyMachine<?, String, ?, String> runExperiment2() {
          MySystemStateHandler ssh = new MySystemStateHandler();
  
          // This time we use the reuse filter to avoid some resets and
          // save execution of symbols
          ReuseOracle<BoundedStringQueue, String, String> reuseOracle =
                  new ReuseOracleBuilder<>(sigma, ReuseCapableImpl::new).withSystemStateHandler(ssh).build();
  
          // construct L* instance (almost classic Mealy version)
          // almost: we use words (Word<String>) in cells of the table
          // instead of single outputs.
  
          MealyLearner<String, String> lstar;
          lstar = new ExtensibleLStarMealyBuilder<String, String>().withAlphabet(sigma)
                                                                   .withInitialSuffixes(initialSuffixes)
                                                                   .withOracle(reuseOracle)
                                                                   .create();
  
          lstar.startLearning();
  
          // get learned model
          MealyMachine<?, String, ?, String> result = lstar.getHypothesisModel();
  
          // now invalidate all system states and count the number of disposed
          // queues (equals number of resets)
          reuseOracle.getReuseTree().disposeSystemstates();
          ReuseCapableImpl reuseCapableOracle = (ReuseCapableImpl) reuseOracle.getReuseCapableOracle();
          System.out.println("Resets:   " + reuseCapableOracle.fullQueries);
          System.out.println("Reused:   " + reuseCapableOracle.reused);
          System.out.println("Symbols:  " + reuseCapableOracle.symbols);
          // disposed = resets
          System.out.println("Disposed: " + ssh.disposed);
  
          return result;
      }
docs: /*
  Scenario with reuse filter technique.