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; -- acyclic 
 |