Source : ISO 13584-20
SCHEMA iso13584_expressions_schema;
         REFERENCE FROM 
         iso13584_generic_expressions_schema   -- ISO 13584-20
  (generic_expression,
           
         simple_generic_expression,
           
         generic_variable,
           
         generic_literal,
           
         unary_generic_expression,
           
         binary_generic_expression,
           
         multiple_arity_generic_expression);
         
ENTITY abs_function
           SUBTYPE OF (unary_function_call);
         
         END_ENTITY;
ENTITY acos_function
           SUBTYPE OF (unary_function_call);
         
         END_ENTITY;
ENTITY and_expression
           SUBTYPE OF (multiple_arity_boolean_expression);
         
         END_ENTITY;
ENTITY asin_function
           SUBTYPE OF (unary_function_call);
         
         END_ENTITY;
ENTITY atan_function
           SUBTYPE OF (binary_function_call);
         
         END_ENTITY;
ENTITY binary_boolean_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (xor_expression,
                                equals_expression))
           SUBTYPE OF (boolean_expression, binary_generic_expression);
         
         END_ENTITY;
ENTITY binary_function_call
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (atan_function))
           SUBTYPE OF (binary_numeric_expression);
         
         END_ENTITY;
ENTITY binary_numeric_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (minus_expression,
                                div_expression,
                                mod_expression,
                                slash_expression,
                                power_expression,
                                binary_function_call))
           SUBTYPE OF (numeric_expression, binary_generic_expression);
           SELF\binary_generic_expression.operands : LIST[2:2] OF numeric_expression;
         
         END_ENTITY;
ENTITY boolean_defined_function
           ABSTRACT SUPERTYPE
         
           SUBTYPE OF (defined_function, boolean_expression);
         
         END_ENTITY;
ENTITY boolean_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (simple_boolean_expression,
                                unary_boolean_expression,
                                binary_boolean_expression,
                                multiple_arity_boolean_expression,
                                comparison_expression,
                                interval_expression,
                                boolean_defined_function))
           SUBTYPE OF (expression);
         
         END_ENTITY;
ENTITY boolean_literal
           SUBTYPE OF (simple_boolean_expression, generic_literal);
           the_value : BOOLEAN;
         
         END_ENTITY;
ENTITY boolean_variable
           SUBTYPE OF (simple_boolean_expression, variable);
         
         END_ENTITY;
ENTITY comparison_equal
           SUBTYPE OF (comparison_expression);
         
         END_ENTITY;
ENTITY comparison_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (comparison_equal,
                                comparison_greater,
                                comparison_greater_equal,
                                comparison_less,
                                comparison_less_equal,
                                comparison_not_equal,
                                like_expression))
           SUBTYPE OF (boolean_expression, binary_generic_expression);
           SELF\binary_generic_expression.operands : LIST[2:2] OF expression;
WHERE
           WR1: (('ISO13584_EXPRESSIONS_SCHEMA.NUMERIC_EXPRESSION' IN TYPEOF(SELF\binary_generic_expression.operands[1])) AND    ('ISO13584_EXPRESSIONS_SCHEMA.NUMERIC_EXPRESSION'
            IN TYPEOF(SELF\binary_generic_expression.operands[2]))) OR   (('ISO13584_EXPRESSIONS_SCHEMA.BOOLEAN_EXPRESSION' IN TYPEOF(SELF\binary_generic_expression.operands[1]))
            AND    ('ISO13584_EXPRESSIONS_SCHEMA.BOOLEAN_EXPRESSION' IN TYPEOF(SELF\binary_generic_expression.operands[2]))) OR   (('ISO13584_EXPRESSIONS_SCHEMA.STRING_EXPRESSION'
            IN TYPEOF(SELF\binary_generic_expression.operands[1])) AND    ('ISO13584_EXPRESSIONS_SCHEMA.STRING_EXPRESSION' IN TYPEOF(SELF\binary_generic_expression.operands[2])));
         
         END_ENTITY;
ENTITY comparison_greater
           SUBTYPE OF (comparison_expression);
         
         END_ENTITY;
ENTITY comparison_greater_equal
           SUBTYPE OF (comparison_expression);
         
         END_ENTITY;
ENTITY comparison_less
           SUBTYPE OF (comparison_expression);
         
         END_ENTITY;
ENTITY comparison_less_equal
           SUBTYPE OF (comparison_expression);
         
         END_ENTITY;
ENTITY comparison_not_equal
           SUBTYPE OF (comparison_expression);
         
         END_ENTITY;
ENTITY concat_expression
           SUBTYPE OF (string_expression, multiple_arity_generic_expression);
           SELF\multiple_arity_generic_expression.operands : LIST[2:?] OF string_expression;
         
         END_ENTITY;
ENTITY cos_function
           SUBTYPE OF (unary_function_call);
         
         END_ENTITY;
ENTITY defined_function
           ABSTRACT SUPERTYPE
         
         OF ((ONEOF (numeric_defined_function,
                                 string_defined_function,
                                 boolean_defined_function))
                        ANDOR sql_mappable_defined_function);
         
         END_ENTITY;
ENTITY div_expression
           SUBTYPE OF (binary_numeric_expression);
         
         END_ENTITY;
ENTITY equals_expression
           SUBTYPE OF (binary_boolean_expression);
         
         END_ENTITY;
ENTITY exp_function
           SUBTYPE OF (unary_function_call);
         
         END_ENTITY;
ENTITY expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (numeric_expression,
                                boolean_expression,
                                string_expression))
           SUBTYPE OF (generic_expression);
         
         END_ENTITY;
ENTITY format_function
           SUBTYPE OF (string_expression, binary_generic_expression);
DERIVE
           value_to_format : generic_expression := SELF\binary_generic_expression.operands[1];
           format_string : generic_expression := SELF\binary_generic_expression.operands[2];
WHERE
           WR1: (('ISO13584_EXPRESSIONS_SCHEMA.NUMERIC_EXPRESSION') IN TYPEOF(value_to_format)) AND   (('ISO13584_EXPRESSIONS_SCHEMA.STRING_EXPRESSION')
            IN TYPEOF(format_string));
         
         END_ENTITY;
ENTITY index_expression
           SUBTYPE OF (string_expression, binary_generic_expression);
DERIVE
           operand : generic_expression := SELF\binary_generic_expression.operands[1];
           index : generic_expression := SELF\binary_generic_expression.operands[2];
WHERE
           WR1: ('ISO13584_EXPRESSIONS_SCHEMA.STRING_EXPRESSION' IN TYPEOF(operand)) AND   ('ISO13584_EXPRESSIONS_SCHEMA.NUMERIC_EXPRESSION'
            IN TYPEOF(index));
           WR2: is_int_expr(index);
         
         END_ENTITY;
ENTITY int_literal
           SUBTYPE OF (literal_number);
           SELF\literal_number.the_value : INTEGER;
         
         END_ENTITY;
ENTITY int_numeric_variable
           SUBTYPE OF (numeric_variable);
         
         END_ENTITY;
ENTITY int_value_function
           SUBTYPE OF (value_function);
         
         END_ENTITY;
ENTITY integer_defined_function
           ABSTRACT SUPERTYPE
         
           SUBTYPE OF (numeric_defined_function);
         
         END_ENTITY;
ENTITY interval_expression
           SUBTYPE OF (boolean_expression, multiple_arity_generic_expression);
DERIVE
           interval_low : generic_expression := SELF\multiple_arity_generic_expression.operands[1];
           interval_item : generic_expression := SELF\multiple_arity_generic_expression.operands[2];
           interval_high : generic_expression := SELF\multiple_arity_generic_expression.operands[3];
WHERE
           WR1: ('ISO13584_EXPRESSIONS_SCHEMA.EXPRESSION' IN TYPEOF(interval_low)) AND   ('ISO13584_EXPRESSIONS_SCHEMA.EXPRESSION' IN
            TYPEOF(interval_item)) AND   ('ISO13584_EXPRESSIONS_SCHEMA.EXPRESSION' IN TYPEOF(interval_high));
           WR2: (('ISO13584_EXPRESSIONS_SCHEMA.STRING_EXPRESSION' IN TYPEOF(SELF.interval_low)) AND    ('ISO13584_EXPRESSIONS_SCHEMA.STRING_EXPRESSION'
            IN TYPEOF(SELF.interval_high)) AND    ('ISO13584_EXPRESSIONS_SCHEMA.STRING_EXPRESSION' IN TYPEOF(SELF.interval_item))) OR
            (('ISO13584_EXPRESSIONS_SCHEMA.NUMERIC_EXPRESSION' IN TYPEOF(SELF.interval_low)) AND    ('ISO13584_EXPRESSIONS_SCHEMA.NUMERIC_EXPRESSION'
            IN TYPEOF(SELF.interval_item)) AND    ('ISO13584_EXPRESSIONS_SCHEMA.NUMERIC_EXPRESSION' IN TYPEOF(SELF.interval_high)));
         
         END_ENTITY;
ENTITY length_function
           SUBTYPE OF (numeric_expression, unary_generic_expression);
           SELF\unary_generic_expression.operand : string_expression;
         
         END_ENTITY;
ENTITY like_expression
           SUBTYPE OF (comparison_expression);
WHERE
           WR1: ('ISO13584_EXPRESSIONS_SCHEMA.STRING_EXPRESSION' IN TYPEOF(SELF\binary_generic_expression.operands[1])) AND   ('ISO13584_EXPRESSIONS_SCHEMA.STRING_EXPRESSION'
            IN TYPEOF(SELF\binary_generic_expression.operands[2]));
         
         END_ENTITY;
ENTITY literal_number
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (int_literal,
                                real_literal))
           SUBTYPE OF (simple_numeric_expression, generic_literal);
           the_value : NUMBER;
         
         END_ENTITY;
ENTITY log10_function
           SUBTYPE OF (unary_function_call);
         
         END_ENTITY;
ENTITY log2_function
           SUBTYPE OF (unary_function_call);
         
         END_ENTITY;
ENTITY log_function
           SUBTYPE OF (unary_function_call);
         
         END_ENTITY;
ENTITY maximum_function
           SUBTYPE OF (multiple_arity_function_call);
         
         END_ENTITY;
ENTITY minimum_function
           SUBTYPE OF (multiple_arity_function_call);
         
         END_ENTITY;
ENTITY minus_expression
           SUBTYPE OF (binary_numeric_expression);
         
         END_ENTITY;
ENTITY minus_function
           SUBTYPE OF (unary_function_call);
         
         END_ENTITY;
ENTITY mod_expression
           SUBTYPE OF (binary_numeric_expression);
         
         END_ENTITY;
ENTITY mult_expression
           SUBTYPE OF (multiple_arity_numeric_expression);
         
         END_ENTITY;
ENTITY multiple_arity_boolean_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (and_expression,
                                or_expression))
           SUBTYPE OF (boolean_expression, multiple_arity_generic_expression);
           SELF\multiple_arity_generic_expression.operands : LIST[2:?] OF boolean_expression;
         
         END_ENTITY;
ENTITY multiple_arity_function_call
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (maximum_function,
                                minimum_function))
           SUBTYPE OF (multiple_arity_numeric_expression);
         
         END_ENTITY;
ENTITY multiple_arity_numeric_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (plus_expression,
                                mult_expression,
                                multiple_arity_function_call))
           SUBTYPE OF (numeric_expression, multiple_arity_generic_expression);
           SELF\multiple_arity_generic_expression.operands : LIST[2:?] OF numeric_expression;
         
         END_ENTITY;
ENTITY not_expression
           SUBTYPE OF (unary_boolean_expression);
           SELF\unary_generic_expression.operand : boolean_expression;
         
         END_ENTITY;
ENTITY numeric_defined_function
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (integer_defined_function,
                                real_defined_function))
           SUBTYPE OF (numeric_expression, defined_function);
         
         END_ENTITY;
ENTITY numeric_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (simple_numeric_expression,
                                unary_numeric_expression,
                                binary_numeric_expression,
                                multiple_arity_numeric_expression,
                                length_function,
                                value_function,
                                numeric_defined_function))
           SUBTYPE OF (expression);
DERIVE
           is_int : BOOLEAN := is_int_expr(SELF);
           sql_mappable : BOOLEAN := is_sql_mappable(SELF);
         
         END_ENTITY;
ENTITY numeric_variable
           SUPERTYPE OF 
         (ONEOF (int_numeric_variable,
                       real_numeric_variable))
           SUBTYPE OF (simple_numeric_expression, variable);
WHERE
           WR1: ('ISO13584_EXPRESSIONS_SCHEMA.INT_NUMERIC_VARIABLE' IN TYPEOF(SELF)) OR   ('ISO13584_EXPRESSIONS_SCHEMA.REAL_NUMERIC_VARIABLE'
            IN TYPEOF(SELF));
         
         END_ENTITY;
ENTITY odd_function
           SUBTYPE OF (unary_boolean_expression);
           SELF\unary_generic_expression.operand : numeric_expression;
WHERE
           WR1: is_int_expr(operand);
         
         END_ENTITY;
ENTITY or_expression
           SUBTYPE OF (multiple_arity_boolean_expression);
         
         END_ENTITY;
ENTITY plus_expression
           SUBTYPE OF (multiple_arity_numeric_expression);
         
         END_ENTITY;
ENTITY power_expression
           SUBTYPE OF (binary_numeric_expression);
         
         END_ENTITY;
ENTITY real_defined_function
           ABSTRACT SUPERTYPE
         
           SUBTYPE OF (numeric_defined_function);
         
         END_ENTITY;
ENTITY real_literal
           SUBTYPE OF (literal_number);
           SELF\literal_number.the_value : REAL;
         
         END_ENTITY;
ENTITY real_numeric_variable
           SUBTYPE OF (numeric_variable);
         
         END_ENTITY;
ENTITY simple_boolean_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (boolean_literal,
                                boolean_variable))
           SUBTYPE OF (boolean_expression, simple_generic_expression);
         
         END_ENTITY;
ENTITY simple_numeric_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (literal_number,
                                numeric_variable))
           SUBTYPE OF (numeric_expression, simple_generic_expression);
         
         END_ENTITY;
ENTITY simple_string_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (string_literal,
                                string_variable))
           SUBTYPE OF (string_expression, simple_generic_expression);
         
         END_ENTITY;
ENTITY sin_function
           SUBTYPE OF (unary_function_call);
         
         END_ENTITY;
ENTITY slash_expression
           SUBTYPE OF (binary_numeric_expression);
         
         END_ENTITY;
ENTITY sql_mappable_defined_function
           ABSTRACT SUPERTYPE
         
           SUBTYPE OF (defined_function);
         
         END_ENTITY;
ENTITY square_root_function
           SUBTYPE OF (unary_function_call);
         
         END_ENTITY;
ENTITY string_defined_function
           ABSTRACT SUPERTYPE
         
           SUBTYPE OF (defined_function, string_expression);
         
         END_ENTITY;
ENTITY string_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (simple_string_expression,
                                index_expression,
                                substring_expression,
                                concat_expression,
                                format_function,
                                string_defined_function))
           SUBTYPE OF (expression);
         
         END_ENTITY;
ENTITY string_literal
           SUBTYPE OF (simple_string_expression, generic_literal);
           the_value : STRING;
         
         END_ENTITY;
ENTITY string_variable
           SUBTYPE OF (simple_string_expression, variable);
         
         END_ENTITY;
ENTITY substring_expression
           SUBTYPE OF (string_expression, multiple_arity_generic_expression);
DERIVE
           operand : generic_expression := SELF\multiple_arity_generic_expression.operands[1];
           index1 : generic_expression := SELF\multiple_arity_generic_expression.operands[2];
           index2 : generic_expression := SELF\multiple_arity_generic_expression.operands[3];
WHERE
           WR1: ('ISO13584_EXPRESSIONS_SCHEMA.STRING_EXPRESSION' IN TYPEOF(operand)) AND   ('ISO13584_EXPRESSIONS_SCHEMA.NUMERIC_EXPRESSION'
            IN TYPEOF(index1)) AND   ('ISO13584_EXPRESSIONS_SCHEMA.NUMERIC_EXPRESSION' IN TYPEOF(index2));
           WR2: SIZEOF(SELF\multiple_arity_generic_expression.operands) = 3;
           WR3: is_int_expr(index1);
           WR4: is_int_expr(index2);
         
         END_ENTITY;
ENTITY tan_function
           SUBTYPE OF (unary_function_call);
         
         END_ENTITY;
ENTITY unary_boolean_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (not_expression,
                                odd_function))
           SUBTYPE OF (boolean_expression, unary_generic_expression);
         
         END_ENTITY;
ENTITY unary_function_call
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (abs_function,
                                minus_function,
                                sin_function,
                                cos_function,
                                tan_function,
                                asin_function,
                                acos_function,
                                exp_function,
                                log_function,
                                log2_function,
                                log10_function,
                                square_root_function))
           SUBTYPE OF (unary_numeric_expression);
         
         END_ENTITY;
ENTITY unary_numeric_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (unary_function_call))
           SUBTYPE OF (numeric_expression, unary_generic_expression);
           SELF\unary_generic_expression.operand : numeric_expression;
         
         END_ENTITY;
ENTITY value_function
           SUPERTYPE OF 
         (int_value_function)
           SUBTYPE OF (numeric_expression, unary_generic_expression);
           SELF\unary_generic_expression.operand : string_expression;
         
         END_ENTITY;
ENTITY variable
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (numeric_variable,
                                boolean_variable,
                                string_variable))
           SUBTYPE OF (generic_variable);
         
         END_ENTITY;
ENTITY xor_expression
           SUBTYPE OF (binary_boolean_expression);
           SELF\binary_generic_expression.operands : LIST[2:2] OF boolean_expression;
         
         END_ENTITY;
FUNCTION is_int_expr
 (arg : numeric_expression) : BOOLEAN;
             IF 'ISO13584_EXPRESSIONS_SCHEMA.INT_LITERAL' IN TYPEOF(arg)
  THEN
    RETURN(TRUE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.REAL_LITERAL' IN TYPEOF(arg)
  THEN
    RETURN(FALSE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.INT_NUMERIC_VARIABLE' IN TYPEOF(arg)
  THEN
    RETURN(TRUE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.REAL_NUMERIC_VARIABLE' IN TYPEOF(arg)
  THEN
    RETURN(FALSE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.ABS_FUNCTION' IN TYPEOF(arg)
  THEN
    RETURN(is_int_expr(arg\unary_numeric_expression.operand));
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.MINUS_FUNCTION' IN TYPEOF(arg)
  THEN
    RETURN(is_int_expr(arg\unary_numeric_expression.operand));
  END_IF;
      IF ('ISO13584_EXPRESSIONS_SCHEMA.SIN_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.COS_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.TAN_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.ASIN_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.ACOS_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.ATAN_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.EXP_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.LOG_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.LOG2_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.LOG10_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.SQUARE_ROOT_FUNCTION' IN TYPEOF(arg))
  THEN
    RETURN(FALSE);
  END_IF;
      IF ('ISO13584_EXPRESSIONS_SCHEMA.PLUS_EXPRESSION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.MULT_EXPRESSION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.MAXIMUM_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.MINIMUM_FUNCTION' IN TYPEOF(arg))
  THEN
    REPEAT i := 1 TO SIZEOF(arg\multiple_arity_numeric_expression.operands);
      IF NOT is_int_expr(arg\multiple_arity_numeric_expression.operands[i])
      THEN
        RETURN(FALSE);
      END_IF;
    END_REPEAT;
    RETURN(TRUE);
  END_IF;
      IF ('ISO13584_EXPRESSIONS_SCHEMA.MINUS_EXPRESSION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.POWER_EXPRESSION' IN TYPEOF(arg))
  THEN
    RETURN(is_int_expr(arg\binary_numeric_expression.operands[1]) AND
           is_int_expr(arg\binary_numeric_expression.operands[2]));
  END_IF;
      IF ('ISO13584_EXPRESSIONS_SCHEMA.DIV_EXPRESSION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.MOD_EXPRESSION' IN TYPEOF(arg))
  THEN
    RETURN(TRUE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.SLASH_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(FALSE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.LENGTH_FUNCTION' IN TYPEOF(arg)
  THEN
    RETURN(TRUE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.VALUE_FUNCTION' IN TYPEOF(arg)
  THEN
    IF 'ISO13584_EXPRESSIONS_SCHEMA.INT_VALUE_FUNCTION' IN TYPEOF(arg)
    THEN
      RETURN(TRUE);
    ELSE
      RETURN(FALSE);
    END_IF;
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.INTEGER_DEFINED_FUNCTION' IN TYPEOF(arg)
  THEN
    RETURN(TRUE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.REAL_DEFINED_FUNCTION' IN TYPEOF(arg)
  THEN
    RETURN(FALSE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.BOOLEAN_DEFINED_FUNCTION' IN TYPEOF(arg)
  THEN
    RETURN(FALSE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.STRING_DEFINED_FUNCTION' IN TYPEOF(arg)
  THEN
    RETURN(FALSE);
  END_IF;
      RETURN(FALSE);
         END_FUNCTION;
         
FUNCTION is_sql_mappable
 (arg : expression) : BOOLEAN;
             IF 'ISO13584_EXPRESSIONS_SCHEMA.SIMPLE_NUMERIC_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(TRUE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.SQL_MAPPABLE_DEFINED_FUNCTION' IN TYPEOF(arg)
  THEN
    RETURN(TRUE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.MINUS_FUNCTION' IN TYPEOF(arg)
  THEN
    RETURN(is_sql_mappable(arg\unary_numeric_expression.operand));
  END_IF;
      IF ('ISO13584_EXPRESSIONS_SCHEMA.ABS_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.SIN_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.COS_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.TAN_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.ASIN_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.ACOS_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.ATAN_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.EXP_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.LOG_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.LOG2_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.LOG10_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.SQUARE_ROOT_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.VALUE_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.LENGTH_FUNCTION' IN TYPEOF(arg))
  THEN
    RETURN(FALSE);
  END_IF;
      IF ('ISO13584_EXPRESSIONS_SCHEMA.PLUS_EXPRESSION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.MULT_EXPRESSION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.MAXIMUM_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.MINIMUM_FUNCTION' IN TYPEOF(arg))
  THEN
    REPEAT i := 1 TO SIZEOF(arg\multiple_arity_numeric_expression.operands);
      IF NOT is_sql_mappable(arg\multiple_arity_numeric_expression.operands[i])
      THEN
        RETURN(FALSE);
      END_IF;
    END_REPEAT;
    RETURN(TRUE);
  END_IF;
      IF ('ISO13584_EXPRESSIONS_SCHEMA.MINUS_EXPRESSION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.SLASH_EXPRESSION' IN TYPEOF(arg))
  THEN
    RETURN(is_sql_mappable(arg\binary_numeric_expression.operands[1]) AND
           is_sql_mappable(arg\binary_numeric_expression.operands[2]));
  END_IF;
      IF ('ISO13584_EXPRESSIONS_SCHEMA.DIV_EXPRESSION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.MOD_EXPRESSION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.POWER_EXPRESSION' IN TYPEOF(arg))
  THEN
    RETURN(FALSE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.SIMPLE_BOOLEAN_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(TRUE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.NOT_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(is_sql_mappable(arg\unary_generic_expression.operand));
  END_IF;
      IF ('ISO13584_EXPRESSIONS_SCHEMA.ODD_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.XOR_EXPRESSION' IN TYPEOF(arg))
  THEN
    RETURN(FALSE);
  END_IF;
      IF ('ISO13584_EXPRESSIONS_SCHEMA.AND_EXPRESSION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.OR_EXPRESSION' IN TYPEOF(arg))
  THEN
    REPEAT i := 1 TO SIZEOF(arg\multiple_arity_boolean_expression.operands);
      IF NOT is_sql_mappable(arg\multiple_arity_boolean_expression.operands[i])
      THEN
        RETURN(FALSE);
      END_IF;
    END_REPEAT;
    RETURN(TRUE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.EQUALS_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(is_sql_mappable(arg\binary_generic_expression.operands[1]) AND
           is_sql_mappable(arg\binary_generic_expression.operands[2]));
  END_IF;
      IF ('ISO13584_EXPRESSIONS_SCHEMA.COMPARISON_EQUAL' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.COMPARISON_GREATER' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.COMPARISON_GREATER_EQUAL' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.COMPARISON_LESS' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.COMPARISON_LESS_EQUAL' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.COMPARISON_NOT_EQUAL' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.LIKE_EXPRESSION' IN TYPEOF(arg))
  THEN
    RETURN(is_sql_mappable(arg\comparison_expression.operands[1]) AND
           is_sql_mappable(arg\comparison_expression.operands[2]));
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.INTERVAL_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(is_sql_mappable(arg\interval_expression.interval_low) AND
           is_sql_mappable(arg\interval_expression.interval_high) AND
           is_sql_mappable(arg\interval_expression.interval_item));
  END_IF;
      IF ('ISO13584_EXPRESSIONS_SCHEMA.NUMERIC_DEFINED_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.BOOLEAN_DEFINED_FUNCTION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.STRING_DEFINED_FUNCTION' IN TYPEOF(arg))
  THEN
    RETURN(FALSE);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.SIMPLE_STRING_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(TRUE);
  END_IF;
      IF ('ISO13584_EXPRESSIONS_SCHEMA.INDEX_EXPRESSION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.SUBSTRING_EXPRESSION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.CONCAT_EXPRESSION' IN TYPEOF(arg)) OR
         ('ISO13584_EXPRESSIONS_SCHEMA.FORMAT_FUNCTION' IN TYPEOF(arg))
  THEN
    RETURN(FALSE);
  END_IF;
      RETURN(FALSE);
         END_FUNCTION;
         
FUNCTION used_functions
 (arg : expression) : SET OF defined_function;
           LOCAL
  result : SET OF defined_function := [];
    END_LOCAL;
      IF ('ISO13584_EXPRESSIONS_SCHEMA.DEFINED_FUNCTION' IN TYPEOF(arg))
  THEN
    RETURN([arg]);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.UNARY_NUMERIC_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(used_functions(arg\unary_numeric_expression.operand));
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.BINARY_NUMERIC_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(used_functions(arg\binary_numeric_expression.operands[1]) +
           used_functions(arg\binary_numeric_expression.operands[2]));
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.MULTIPLE_ARITY_NUMERIC_EXPRESSION' IN TYPEOF(arg)
  THEN
    REPEAT i := 1 TO SIZEOF(arg\multiple_arity_numeric_expression.operands);
      result := result + used_functions(arg\multiple_arity_numeric_expression.operands[i]);
    END_REPEAT;
    RETURN(result);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.UNARY_GENERIC_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(used_functions(arg\unary_generic_expression.operand));
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.BINARY_BOOLEAN_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(used_functions(arg\binary_generic_expression.operands[1]) +
           used_functions(arg\binary_generic_expression.operands[2]));
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.MULTIPLE_ARITY_BOOLEAN_EXPRESSION' IN TYPEOF(arg)
  THEN
    REPEAT i := 1 TO SIZEOF(arg\multiple_arity_boolean_expression.operands);
      result := result + used_functions(arg\multiple_arity_boolean_expression.operands[i]);
    END_REPEAT;
    RETURN(result);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.COMPARISON_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(used_functions(arg\comparison_expression.operands[1]) +
           used_functions(arg\comparison_expression.operands[2]));
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.INTERVAL_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(used_functions(arg\interval_expression.interval_low) +
           used_functions(arg\interval_expression.interval_high) +
           used_functions(arg\interval_expression.interval_item));
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.INDEX_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(used_functions(arg\index_expression.operand) + used_functions(arg\index_expression.index));
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.SUBSTRING_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(used_functions(arg\substring_expression.operand) + used_functions(arg\substring_expression.index1) +
           used_functions(arg\substring_expression.index2));
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.CONCAT_EXPRESSION' IN TYPEOF(arg)
  THEN
    REPEAT i := 1 TO SIZEOF(arg\concat_expression.operands);
      result := result + used_functions(arg\concat_expression.operands[i]);
    END_REPEAT;
    RETURN(result);
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.FORMAT_FUNCTION' IN TYPEOF(arg)
  THEN
    RETURN(used_functions(arg\format_function.value_to_format) + used_functions(arg\format_function.format_string));
  END_IF;
      IF 'ISO13584_EXPRESSIONS_SCHEMA.LIKE_EXPRESSION' IN TYPEOF(arg)
  THEN
    RETURN(used_functions(arg\comparison_expression.operands[1]) +
           used_functions(arg\comparison_expression.operands[2]));
  END_IF;
      RETURN([]);
         END_FUNCTION;
         
         END_SCHEMA;  -- iso13584_expressions_schema