code: private List<Proposition> filterMatches(Proposition inProposition,
              Collection<Proposition> propositions, Set<Proposition> cache) {
          TemporalProposition inTp = null;
          if (this.relation != null) {
              if (inProposition instanceof TemporalProposition) {
                  inTp = (TemporalProposition) inProposition;
              }
          }
          List<Proposition> result = new ArrayList<>();
          if (propositions != null) {
              for (Proposition proposition : propositions) {
                  if (cache.add(proposition)
                          && isMatch(proposition)
                          && hasAllowedValue(proposition)) {
                      if (inTp != null && proposition instanceof TemporalProposition) {
                          TemporalProposition tp = (TemporalProposition) proposition;
                          if (!this.relation.hasRelation(tp.getInterval(), inTp.getInterval())) {
                              continue;
                          }
                      }
                      result.add(proposition);
                  }
              }
          }
          return result;
      }
docs: Filters <code>propositions</code>. Removes duplicates, propositions not
  in the proposition id list, and parameters that do not meet any value
  constraints set.
  
  @param propositions the {@link Collection<Proposition>} to filter.
  @param cache a {@link Set<Proposition>} that is used to find duplicates.
  
  @return a newly-created {@link List<Proposition>}.