Source : ISO 13584-20
SCHEMA iso13584_generic_expressions_schema;
ENTITY binary_generic_expression
           ABSTRACT SUPERTYPE
         
           SUBTYPE OF (generic_expression);
           operands : LIST[2:2] OF generic_expression;
         
         END_ENTITY;
ENTITY environment;
           syntactic_representation : generic_variable;
           semantics : variable_semantics;
         
         END_ENTITY;
ENTITY generic_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (simple_generic_expression,
                                unary_generic_expression,
                                binary_generic_expression,
                                multiple_arity_generic_expression));
WHERE
           WR1: is_acyclic(SELF);
         
         END_ENTITY;
ENTITY generic_literal
           ABSTRACT SUPERTYPE
         
           SUBTYPE OF (simple_generic_expression);
         
         END_ENTITY;
ENTITY generic_variable
           ABSTRACT SUPERTYPE
         
           SUBTYPE OF (simple_generic_expression);
INVERSE
           interpretation : environment FOR syntactic_representation;
         
         END_ENTITY;
ENTITY multiple_arity_generic_expression
           ABSTRACT SUPERTYPE
         
           SUBTYPE OF (generic_expression);
           operands : LIST[2:?] OF generic_expression;
         
         END_ENTITY;
ENTITY simple_generic_expression
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (generic_literal,
                                generic_variable))
           SUBTYPE OF (generic_expression);
         
         END_ENTITY;
ENTITY unary_generic_expression
           ABSTRACT SUPERTYPE
         
           SUBTYPE OF (generic_expression);
           operand : generic_expression;
         
         END_ENTITY;
ENTITY variable_semantics
           ABSTRACT SUPERTYPE
         ;
         
         END_ENTITY;
FUNCTION acyclic
 (arg1 : generic_expression; arg2 : SET[0:?] OF generic_expression) : BOOLEAN;
         LOCAL
	result: BOOLEAN := TRUE;
END_LOCAL;
IF ('ISO13584_GENERIC_EXPRESSIONS_SCHEMA.SIMPLE_GENERIC_EXPRESSION'
	IN TYPEOF (arg1)) 
THEN
	RETURN (TRUE);
END_IF;
IF arg1 IN arg2 
THEN 
	RETURN (FALSE);
END_IF;
IF 'ISO13584_GENERIC_EXPRESSIONS_SCHEMA.UNARY_GENERIC_EXPRESSION' 
	IN TYPEOF (arg1) 
THEN 
	RETURN 
	(acyclic(arg1\unary_generic_expression.operand,arg2+[arg1]));
END_IF;
IF 'ISO13584_GENERIC_EXPRESSIONS_SCHEMA.BINARY_GENERIC_EXPRESSION' 
	IN TYPEOF (arg1) 
THEN 
	RETURN 
	(acyclic(arg1\binary_generic_expression.operands[1],arg2+[arg1])
	AND
	acyclic(arg1\binary_generic_expression.operands[2],arg2+[arg1]));
END_IF;
IF 
'ISO13584_GENERIC_EXPRESSIONS_SCHEMA.MULTIPLE_ARITY_GENERIC_EXPRESSION' 
	IN TYPEOF (arg1) 
THEN 
	result := TRUE;
	REPEAT i := 1 TO 
			SIZEOF (arg1\multiple_arity_generic_expression.operands);
		result := result AND
		acyclic(arg1\multiple_arity_generic_expression.operands[i], arg2+[arg1]);
	END_REPEAT;
	RETURN (result);
END_IF;
	RETURN (result);
         END_FUNCTION;
         
FUNCTION is_acyclic
 (arg : generic_expression) : BOOLEAN;
         RETURN (acyclic (arg, []));
         END_FUNCTION;
         
FUNCTION used_variables
 (arg : generic_expression) : SET[0:?] OF generic_variable;
         LOCAL result : SET OF generic_variable := []; END_LOCAL; IF 'ISO13584_GENERIC_EXPRESSIONS_SCHEMA.GENERIC_VARIABLE' IN TYPEOF (arg) THEN RETURN ([arg]); END_IF; IF 'ISO13584_GENERIC_EXPRESSIONS_SCHEMA.UNARY_GENERIC_EXPRESSION' IN TYPEOF (arg) THEN RETURN (used_variables (arg\unary_generic_expression.operand)); END_IF; IF 'ISO13584_GENERIC_EXPRESSIONS_SCHEMA.BINARY_GENERIC_EXPRESSION' IN TYPEOF (arg) THEN RETURN(used_variables(arg\binary_generic_expression.operands[1]) + used_variables (arg\binary_generic_expression.operands[2])); END_IF; IF 'ISO13584_GENERIC_EXPRESSIONS_SCHEMA.MULTIPLE_ARITY_GENERIC_EXPRESSION' IN TYPEOF (arg) THEN REPEAT i := 1 TO SIZEOF(arg\multiple_arity_generic_expression.operands); result := result + used_variables( arg\multiple_arity_generic_expression.operands[i]); END_REPEAT; RETURN (result); END_IF; RETURN ([ ]);
         END_FUNCTION;
         
         END_SCHEMA;  -- iso13584_generic_expressions_schema