FUNCTION values_space_of
(expr : generic_expression) : maths_space;
LOCAL e_prefix : STRING := 'ISO13584_EXPRESSIONS_SCHEMA.'; typenames : SET OF STRING := TYPEOF (expr); END_LOCAL; IF (schema_prefix + 'MATHS_VARIABLE') IN typenames THEN RETURN (expr\maths_variable.values_space); END_IF; IF (e_prefix + 'EXPRESSION') IN typenames THEN IF (e_prefix + 'NUMERIC_EXPRESSION') IN typenames THEN IF expr\numeric_expression.is_int THEN IF (e_prefix + 'INT_LITERAL') IN typenames THEN RETURN (make_finite_space ([expr\int_literal.the_value])); ELSE RETURN (the_integers); END_IF; ELSE IF (e_prefix + 'REAL_LITERAL') IN typenames THEN RETURN (make_finite_space ([expr\real_literal.the_value])); ELSE RETURN (the_reals); END_IF; END_IF; END_IF; IF (e_prefix + 'BOOLEAN_EXPRESSION') IN typenames THEN IF (e_prefix + 'BOOLEAN_LITERAL') IN typenames THEN RETURN (make_finite_space ([expr\boolean_literal.the_value])); ELSE RETURN (the_booleans); END_IF; END_IF; IF (e_prefix + 'STRING_EXPRESSION') IN typenames THEN IF (e_prefix + 'STRING_LITERAL') IN typenames THEN RETURN (make_finite_space ([expr\string_literal.the_value])); ELSE RETURN (the_strings); END_IF; END_IF; RETURN (?); -- UNKNOWN SUBTYPE OF expression END_IF; IF (schema_prefix + 'MATHS_FUNCTION') IN typenames THEN IF expression_is_constant (expr) THEN RETURN (make_finite_space ([expr])); ELSE RETURN (make_function_space (sc_equal, expr\maths_function.domain, sc_equal, expr\maths_function.range)); END_IF; END_IF; IF (schema_prefix + 'FUNCTION_APPLICATION') IN typenames THEN RETURN (expr\function_application.func.range); END_IF; IF (schema_prefix + 'MATHS_SPACE') IN typenames THEN IF expression_is_constant (expr) THEN RETURN (make_finite_space ([expr])); ELSE -- This CASE cannot occur IN this version OF the schema. -- When it becomes possible, the subtypes should be analysed and -- more finely defined spaces returned. RETURN (make_elementary_space (es_maths_spaces)); END_IF; END_IF; IF (schema_prefix + 'DEPENDENT_VARIABLE_DEFINITION') IN typenames THEN RETURN (values_space_of (expr\unary_generic_expression.operand)); END_IF; IF (schema_prefix + 'COMPLEX_NUMBER_LITERAL') IN typenames THEN RETURN (make_finite_space ([expr])); END_IF; IF (schema_prefix + 'LOGICAL_LITERAL') IN typenames THEN RETURN (make_finite_space ([expr\logical_literal.lit_value])); END_IF; IF (schema_prefix + 'BINARY_LITERAL') IN typenames THEN RETURN (make_finite_space ([expr\binary_literal.lit_value])); END_IF; IF (schema_prefix + 'MATHS_ENUM_LITERAL') IN typenames THEN RETURN (make_finite_space ([expr\maths_enum_literal.lit_value])); END_IF; IF (schema_prefix + 'REAL_TUPLE_LITERAL') IN typenames THEN RETURN (make_finite_space ([expr\real_tuple_literal.lit_value])); END_IF; IF (schema_prefix + 'INTEGER_TUPLE_LITERAL') IN typenames THEN RETURN (make_finite_space ([expr\integer_tuple_literal.lit_value])); END_IF; IF (schema_prefix + 'ATOM_BASED_LITERAL') IN typenames THEN RETURN (make_finite_space ([expr\atom_based_literal.lit_value])); END_IF; IF (schema_prefix + 'MATHS_TUPLE_LITERAL') IN typenames THEN RETURN (make_finite_space ([expr\maths_tuple_literal.lit_value])); END_IF; IF (schema_prefix + 'PARTIAL_DERIVATIVE_EXPRESSION') IN typenames THEN RETURN (drop_numeric_constraints (values_space_of ( expr\partial_derivative_expression.derivand))); END_IF; IF (schema_prefix + 'DEFINITE_INTEGRAL_EXPRESSION') IN typenames THEN RETURN (drop_numeric_constraints (values_space_of ( expr\definite_integral_expression.integrand))); END_IF; RETURN (?); END_FUNCTION; -- values_space_of
|