private <V> Exp getValidTypeConditionsTo( V value, MTType dst, Map<String, MTType> bindings, RelationshipPathStrategy<V> pathStrategy) throws TypeMismatchException { if (!myRelationships.containsKey(dst)) { throw TypeMismatchException.INSTANCE; } Exp finalConditions = myTypeGraph.getFalseVarExp(); Set<TypeRelationship> relationships = myRelationships.get(dst); boolean foundTrivialPath = false; Iterator<TypeRelationship> relationshipIter = relationships.iterator(); TypeRelationship relationship; Exp relationshipConditions; while (!foundTrivialPath && relationshipIter.hasNext()) { relationship = relationshipIter.next(); try { relationshipConditions = pathStrategy.getValidTypeConditionsAlong(relationship, value, bindings); foundTrivialPath = (relationshipConditions.isLiteralTrue()); finalConditions = myTypeGraph.formDisjunct(relationshipConditions, finalConditions); } catch (NoSolutionException nse) { } } if (foundTrivialPath) { finalConditions = myTypeGraph.getTrueVarExp(); } return finalConditions; }