private void checkStatementMap() throws DataException {
		for (final Map.Entry<Statement, Statement> statementEntry: statementMap.entrySet()) {
			final Statement parameterStatement = statementEntry.getKey();
			final Statement statement = statementEntry.getValue();
			final Matcher matcher = expressionFactory.createMatcher();
			// check hypotheses
			final List<Expression> parameterHypotheses = parameterStatement.getHypotheses();
			final List<Expression> hypotheses = statement.getHypotheses();
			final int size = hypotheses.size();
			if (parameterHypotheses.size() != size) {
				logger.error("Statement " + statement + " has wrong number of hypotheses");
				logger.debug("Expected number of hypotheses: " + parameterHypotheses.size());
				logger.debug("Actual number of hypotheses:   " + size);
				throw new DataException("Statement has wrong number of hypotheses");
			}
			try {
				for (int i = 0; i != size; ++i)
					if (!matcher.checkVEquality(translator.translate(parameterHypotheses.get(i)),
							hypotheses.get(i))) {
					logger.error("Hypothesis in " + statement + " does not match");
					logger.debug("Expected hypothesis:    "
						+ translator.translate(parameterHypotheses.get(i)));
					logger.debug("Actual hypothesis:      " + hypotheses.get(i));
					logger.debug("Current assignment map: " + matcher.getAssignmentMap());
					throw new DataException("Hypothesis does not match");
				}
			// check consequent
				if (!matcher.checkVEquality(translator.translate(parameterStatement.getConsequent()),
						statement.getConsequent())) {
					logger.error("Consequent of " + statement + " does not match");
					logger.debug("Expected consequent:    "
						+ translator.translate(parameterStatement.getConsequent()));
					logger.debug("Actual consequent:      " + statement.getConsequent());
					logger.debug("Current assignment map: " + matcher.getAssignmentMap());
					throw new DataException("Consequent does not match");
				}
			// check DV constraints
				final Map<Variable, Variable> assignmentMap = matcher.getAssignmentMap();
				final DVConstraints dvConstraints = dataFactory.createDVConstraints();
				for (final Variable[] constraint: parameterStatement.getDVConstraints()) {
					assert (constraint.length == 2): "Invalid constraint length";
					dvConstraints.add(assignmentMap.get(translator.translate(constraint[0])),
						assignmentMap.get(translator.translate(constraint[1])));
				}
				if (!dvConstraints.contains(statement.getDVConstraints())) {
					logger.error("Statement " + statement + " has more DV constraints than "
						+ parameterStatement);
					throw new DataException("Statement has too many DV constraints");
				}
			} catch (ExpressionException e) {
				logger.error("Unable to translate statement " + parameterStatement, e);
				throw new DataException("Unable to translate statement", e);
			} catch (NullPointerException e) {
				throw new AssertionError("Unrestricted DV constraints");
			}
		}
	}