/** * TODO: generalize */ default Optional<TermType> getOptionalTermType() throws IncompatibleTermException { try { OperationPredicate predicate = getFunctionSymbol(); return predicate.getTermTypeInferenceRule().inferType( getTerms(), predicate.getArgumentTypes()); } catch (IncompatibleTermException e) { throw new IncompatibleTermException(this, e); } }