code: @Override
      Collection<Proposition> traverse(Proposition proposition,
              Map<Proposition, Set<Proposition>> forwardDerivations,
              Map<Proposition, Set<Proposition>> backwardDerivations,
              Map<UniqueId, Proposition> references,
              KnowledgeSourceCache ksCache, Set<Proposition> cache) {
          List<Proposition> props = new ArrayList<>();
          String[] refNames =
                  this.referenceNames.length > 0
                  ? this.referenceNames
                  : proposition.getReferenceNames();
          for (String referenceName : refNames) {
              List<UniqueId> uids = proposition.getReferences(
                      referenceName);
              for (UniqueId uid : uids) {
                  Proposition prop = references.get(uid);
                  if (prop != null && cache.add(prop) && isMatch(prop)) {
                      props.add(prop);
                  }
              }
          }
  
          return createResults(props);
      }
docs: Traverses a reference.
  
  @param proposition a {@link Proposition} at which to start the traversal.
  Cannot be <code>null</code>.
  @param forwardDerivations a {@link Map<Proposition,List<Proposition>>} of
  derived propositions.
  @param backwardDerivations a {@link Map<Proposition,List<Proposition>>}
  of derived propositions.
  @param references a {@link Map<Proposition,Proposition>} of unique
  identifiers to {@link Proposition}s, used to resolve references.
  @param knowledgeSource the {@link KnowledgeSource}.
  @param cache a {@link Set<Proposition>} for convenience in checking if
  duplicate propositions are traversed to. It is cleared in between calls
  to this method.
  @return the {@link Collection<Proposition>} at the end of the traversal
  step.