code: public Optional<Word<I>> findSeparatingWord(final S s1, final S s2, final Word<I> prefix) {
  
          final FastMealyState<O> n1 = this.nodeToObservationMap.get(s1);
          final FastMealyState<O> n2 = this.nodeToObservationMap.get(s2);
  
          final FastMealyState<O> s1Succ = this.observationTree.getSuccessor(n1, prefix);
          final FastMealyState<O> s2Succ = this.observationTree.getSuccessor(n2, prefix);
  
          if (s1Succ != null && s2Succ != null) {
              final Word<I> sepWord =
                      NearLinearEquivalenceTest.findSeparatingWord(this.observationTree, s1Succ, s2Succ, alphabet, true);
  
              if (sepWord != null) {
                  return Optional.of(sepWord);
              }
          }
  
          return Optional.empty();
      }
docs: Find a separating word for two hypothesis states, after applying given input sequence first.
  
  @param s1
  first state
  @param s2
  second state
  @param prefix
  input sequence
  
  @return A {@link Word} separating the two states reached after applying the prefix to s1 and s2. {@code
  Optional.empty()} if not separating word exists.