(* This file was generated by exppp (an EXPRESS Pretty Printer) written at the National Institute of Standards and Technology by Don Libes, February 19, 1993. WARNING: If you modify this file and want to save the changes, delete this comment block or else the file will be rewritten the next time exppp processes this schema. *) SCHEMA dictionary_schema; CONSTANT property_code_len : INTEGER := 14; syn_name_len : INTEGER := pref_name_len; supplier_code_len : INTEGER := 18; value_format_len : INTEGER := 80; pref_name_len : INTEGER := 30; det_classification_len : INTEGER := 3; sep_cv : STRING := '-'; data_type_code_len : INTEGER := 14; value_code_len : INTEGER := 18; class_code_len : INTEGER := 14; revision_len : INTEGER := 3; source_doc_len : INTEGER := 80; sep_id : STRING := '.'; version_len : INTEGER := 3; short_name_len : INTEGER := 15; END_CONSTANT; TYPE amount_of_substance_measure = REAL; END_TYPE; -- amount_of_substance_measure TYPE area_measure = REAL; END_TYPE; -- area_measure TYPE class_code_type = code_type; WHERE wr1: (LENGTH(SELF) <= class_code_len); END_TYPE; -- class_code_type TYPE code_type = identifier; WHERE wr1: (NOT (SELF LIKE '*.*')); wr2: (NOT (SELF LIKE '*-*')); wr3: (NOT (SELF LIKE '* *')); END_TYPE; -- code_type TYPE context_dependent_measure = REAL; END_TYPE; -- context_dependent_measure TYPE count_measure = NUMBER; END_TYPE; -- count_measure TYPE currency_code = identifier; WHERE wr1: (LENGTH(SELF) = 3); END_TYPE; -- currency_code TYPE data_type_code_type = code_type; WHERE wr1: (LENGTH(SELF) = data_type_code_len); END_TYPE; -- data_type_code_type TYPE date_type = STRING (10) FIXED; END_TYPE; -- date_type TYPE definition_type = translatable_text; END_TYPE; -- definition_type TYPE descriptive_measure = STRING; END_TYPE; -- descriptive_measure TYPE det_classification_type = identifier; WHERE wr1: (LENGTH(SELF) = det_classification_len); END_TYPE; -- det_classification_type TYPE electric_current_measure = REAL; END_TYPE; -- electric_current_measure TYPE identifier = STRING; END_TYPE; -- identifier TYPE integer_type = INTEGER; END_TYPE; -- integer_type TYPE label = STRING; END_TYPE; -- label TYPE language_code = identifier; END_TYPE; -- language_code TYPE length_measure = REAL; END_TYPE; -- length_measure TYPE level = ENUMERATION OF (min, nom, typ, max); END_TYPE; -- level TYPE luminous_intensity_measure = REAL; END_TYPE; -- luminous_intensity_measure TYPE mass_measure = REAL; END_TYPE; -- mass_measure TYPE measure_value = SELECT (length_measure, mass_measure, time_measure, electric_current_measure, thermodynamic_temperature_measure, amount_of_substance_measure, luminous_intensity_measure, plane_angle_measure, solid_angle_measure, area_measure, volume_measure, ratio_measure, parameter_value, numeric_measure, context_dependent_measure, descriptive_measure, positive_length_measure, positive_plane_angle_measure, positive_ratio_measure, count_measure); END_TYPE; -- measure_value TYPE note_type = translatable_text; END_TYPE; -- note_type TYPE numeric_measure = NUMBER; END_TYPE; -- numeric_measure TYPE parameter_value = REAL; END_TYPE; -- parameter_value TYPE person_organization_select = SELECT (organization); END_TYPE; -- person_organization_select TYPE plane_angle_measure = REAL; END_TYPE; -- plane_angle_measure TYPE positive_length_measure = length_measure; WHERE wr1: (SELF > 0); END_TYPE; -- positive_length_measure TYPE positive_plane_angle_measure = plane_angle_measure; WHERE wr1: (SELF > 0); END_TYPE; -- positive_plane_angle_measure TYPE positive_ratio_measure = ratio_measure; WHERE wr1: (SELF > 0); END_TYPE; -- positive_ratio_measure TYPE pref_name_type = translatable_label; WHERE wr1: check_label_length(SELF,pref_name_len); END_TYPE; -- pref_name_type TYPE property_code_type = code_type; WHERE wr1: (LENGTH(SELF) <= property_code_len); END_TYPE; -- property_code_type TYPE ratio_measure = REAL; END_TYPE; -- ratio_measure TYPE remark_type = translatable_text; END_TYPE; -- remark_type TYPE revision_type = code_type; WHERE wr1: (LENGTH(SELF) <= revision_len); END_TYPE; -- revision_type TYPE short_name_type = translatable_label; WHERE wr1: check_label_length(SELF,short_name_len); END_TYPE; -- short_name_type TYPE si_prefix = ENUMERATION OF (exa, peta, tera, giga, mega, kilo, hecto, deca, deci, centi, milli, micro, nano, pico, femto, atto); END_TYPE; -- si_prefix TYPE si_unit_name = ENUMERATION OF (metre, gram, second, ampere, kelvin, mole, candela, radian, steradian, hertz, newton, pascal, joule, watt, coulomb, volt, farad, ohm, siemens, weber, tesla, henry, degree_celsius, lumen, lux, becquerel, gray, sievert); END_TYPE; -- si_unit_name TYPE solid_angle_measure = REAL; END_TYPE; -- solid_angle_measure TYPE source_doc_type = identifier; WHERE wr1: (LENGTH(SELF) <= source_doc_len); END_TYPE; -- source_doc_type TYPE supplier_code_type = code_type; WHERE wr1: (LENGTH(SELF) <= supplier_code_len); END_TYPE; -- supplier_code_type TYPE syn_name_type = SELECT (label_with_language, label); WHERE wr1: check_syn_length(SELF,syn_name_len); END_TYPE; -- syn_name_type TYPE text = STRING; END_TYPE; -- text TYPE thermodynamic_temperature_measure = REAL; END_TYPE; -- thermodynamic_temperature_measure TYPE time_measure = REAL; END_TYPE; -- time_measure TYPE translatable_label = SELECT (label, translated_label); END_TYPE; -- translatable_label TYPE translatable_text = SELECT (text, translated_text); END_TYPE; -- translatable_text TYPE unit = SELECT (named_unit, derived_unit); END_TYPE; -- unit TYPE value_code_type = identifier; WHERE wr1: (LENGTH(SELF) <= value_code_len); END_TYPE; -- value_code_type TYPE value_format_type = identifier; WHERE wr1: (LENGTH(SELF) <= value_format_len); END_TYPE; -- value_format_type TYPE value_type = SELECT (value_code_type, integer_type); END_TYPE; -- value_type TYPE version_type = code_type; WHERE wr1: (LENGTH(SELF) = version_len); wr2: (SELF LIKE '###'); END_TYPE; -- version_type TYPE volume_measure = REAL; END_TYPE; -- volume_measure ENTITY address; internal_location : OPTIONAL label; street_number : OPTIONAL label; street : OPTIONAL label; postal_box : OPTIONAL label; town : OPTIONAL label; region : OPTIONAL label; postal_code : OPTIONAL label; country : OPTIONAL label; facsimile_number : OPTIONAL label; telephone_number : OPTIONAL label; electronic_mail_address : OPTIONAL label; telex_number : OPTIONAL label; WHERE wr1: (EXISTS(internal_location) OR EXISTS(street_number) OR EXISTS( street) OR EXISTS(postal_box) OR EXISTS(town) OR EXISTS( region) OR EXISTS(postal_code) OR EXISTS(country) OR EXISTS( facsimile_number) OR EXISTS(telephone_number) OR EXISTS( electronic_mail_address) OR EXISTS(telex_number)); END_ENTITY; -- address ENTITY amount_of_substance_measure_with_unit SUBTYPE OF (measure_with_unit); WHERE wr1: ('ISO13584_IEC61360_DICTIONARY_SCHEMA.AMOUNT_OF_SUBSTANCE_UNIT' IN TYPEOF(SELF\measure_with_unit.unit_component)); END_ENTITY; -- amount_of_substance_measure_with_unit ENTITY amount_of_substance_unit SUBTYPE OF (named_unit); WHERE wr1: ((SELF\named_unit.dimensions.length_exponent = 0) AND (SELF\ named_unit.dimensions.mass_exponent = 0) AND (SELF\ named_unit.dimensions.time_exponent = 0) AND (SELF\ named_unit.dimensions.electric_current_exponent = 0) AND ( SELF\named_unit.dimensions. thermodynamic_temperature_exponent = 0) AND (SELF\named_unit .dimensions.amount_of_substance_exponent = 1) AND (SELF\ named_unit.dimensions.luminous_intensity_exponent = 0)); END_ENTITY; -- amount_of_substance_unit ENTITY area_measure_with_unit SUBTYPE OF (measure_with_unit); WHERE wr1: ('ISO13584_IEC61360_DICTIONARY_SCHEMA.AREA_UNIT' IN TYPEOF(SELF \measure_with_unit.unit_component)); END_ENTITY; -- area_measure_with_unit ENTITY area_unit SUBTYPE OF (named_unit); WHERE wr1: ((SELF\named_unit.dimensions.length_exponent = 2) AND (SELF\ named_unit.dimensions.mass_exponent = 0) AND (SELF\ named_unit.dimensions.time_exponent = 0) AND (SELF\ named_unit.dimensions.electric_current_exponent = 0) AND ( SELF\named_unit.dimensions. thermodynamic_temperature_exponent = 0) AND (SELF\named_unit .dimensions.amount_of_substance_exponent = 0) AND (SELF\ named_unit.dimensions.luminous_intensity_exponent = 0)); END_ENTITY; -- area_unit ENTITY axis1_placement_type SUBTYPE OF (placement_type); WHERE wr1: ('GEOMETRY_SCHEMA.AXIS1_PLACEMENT' IN SELF\entity_instance_type .type_name); END_ENTITY; -- axis1_placement_type ENTITY axis2_placement_2d_type SUBTYPE OF (placement_type); WHERE wr1: ('GEOMETRY_SCHEMA.AXIS2_PLACEMENT_2D' IN SELF\ entity_instance_type.type_name); END_ENTITY; -- axis2_placement_2d_type ENTITY axis2_placement_3d_type SUBTYPE OF (placement_type); WHERE wr1: ('GEOMETRY_SCHEMA.AXIS2_PLACEMENT_3D' IN SELF\ entity_instance_type.type_name); END_ENTITY; -- axis2_placement_3d_type ENTITY basic_semantic_unit ABSTRACT SUPERTYPE OF (ONEOF (supplier_bsu,class_bsu,property_bsu, data_type_bsu,supplier_related_bsu,class_related_bsu)); code : code_type; version : version_type; DERIVE dic_identifier : identifier := code + sep_cv + version; INVERSE definition : SET [0:1] OF dictionary_element FOR identified_by; referenced_by : SET [0:1] OF content_item FOR dictionary_definition; END_ENTITY; -- basic_semantic_unit ENTITY boolean_type SUBTYPE OF (simple_type); END_ENTITY; -- boolean_type ENTITY class ABSTRACT SUPERTYPE OF (item_class) SUBTYPE OF (class_and_property_elements); SELF\dictionary_element.identified_by : class_bsu; its_superclass : OPTIONAL class_bsu; described_by : LIST [0:?] OF UNIQUE property_bsu; defined_types : SET [0:?] OF data_type_bsu; DERIVE subclasses : SET [0:?] OF class := identified_by. subclasses; known_applicable_properties : SET [0:?] OF property_bsu := compute_known_applicable_properties( SELF\dictionary_element. identified_by); known_applicable_data_types : SET [0:?] OF data_type_bsu := compute_known_applicable_data_types( SELF\dictionary_element. identified_by); INVERSE associated_items : SET [0:?] OF class_bsu_relationship FOR relating_class; WHERE wr1: acyclic_superclass_relationship(SELF.identified_by,[]); wr2: ((NOT all_class_descriptions_reachable(SELF\dictionary_element. identified_by)) OR (list_to_set(SELF.described_by) <= SELF\ dictionary_element.identified_by\class_bsu. known_visible_properties)); wr3: ((NOT all_class_descriptions_reachable(SELF\dictionary_element. identified_by)) OR (SELF.defined_types <= SELF\ dictionary_element.identified_by\class_bsu. known_visible_data_types)); wr4: ((list_to_set(SELF.described_by) * NVL(SELF.its_superclass. definition[1]\class.known_applicable_properties,[])) = []); wr5: ((SELF.defined_types * NVL(SELF.its_superclass.definition[1]\ class.known_applicable_data_types,[])) = []); END_ENTITY; -- class ENTITY class_and_property_elements ABSTRACT SUPERTYPE OF (ONEOF (property_det,class)) SUBTYPE OF (dictionary_element); names : item_names; definition : definition_type; source_doc_of_definition : OPTIONAL document; note : OPTIONAL note_type; remark : OPTIONAL remark_type; END_ENTITY; -- class_and_property_elements ENTITY class_bsu SUBTYPE OF (basic_semantic_unit); SELF\basic_semantic_unit.code : class_code_type; defined_by : supplier_bsu; DERIVE absolute_id : identifier := defined_by.absolute_id + sep_id + dic_identifier; known_visible_properties : SET [0:?] OF property_bsu := compute_known_visible_properties(SELF); known_visible_data_types : SET [0:?] OF data_type_bsu := compute_known_visible_data_types(SELF); INVERSE subclasses : SET [0:?] OF class FOR its_superclass; added_visible_properties : SET [0:?] OF property_bsu FOR name_scope; added_visible_data_types : SET [0:?] OF data_type_bsu FOR name_scope; UNIQUE ur1 : absolute_id; END_ENTITY; -- class_bsu ENTITY class_bsu_relationship ABSTRACT SUPERTYPE; relating_class : class; related_tokens : SET [1:?] OF class_related_bsu; END_ENTITY; -- class_bsu_relationship ENTITY class_instance_type SUBTYPE OF (complex_type); domain : class_bsu; END_ENTITY; -- class_instance_type ENTITY class_related_bsu ABSTRACT SUPERTYPE SUBTYPE OF (basic_semantic_unit); END_ENTITY; -- class_related_bsu ENTITY class_value_assignment; super_class_defined_property : property_bsu; assigned_value : value_code_type; WHERE wr1: definition_available_implies(super_class_defined_property,( 'ISO13584_IEC61360_DICTIONARY_SCHEMA' + '.NON_QUANTITATIVE_CODE_TYPE') IN TYPEOF( super_class_defined_property.definition[1]\property_det. domain)); wr2: definition_available_implies(super_class_defined_property, SIZEOF(QUERY ( v <* super_class_defined_property.definition[ 1]\property_det.domain\non_quantitative_code_type.domain. its_values | (assigned_value = v.value_code) )) = 1); END_ENTITY; -- class_value_assignment ENTITY complex_type ABSTRACT SUPERTYPE OF (ONEOF (level_type,class_instance_type, entity_instance_type)) SUBTYPE OF (data_type); END_ENTITY; -- complex_type ENTITY component_class SUBTYPE OF (item_class); END_ENTITY; -- component_class ENTITY condition_det SUBTYPE OF (property_det); END_ENTITY; -- condition_det ENTITY content_item ABSTRACT SUPERTYPE; dictionary_definition : basic_semantic_unit; END_ENTITY; -- content_item ENTITY context_dependent_unit SUBTYPE OF (named_unit); name : label; END_ENTITY; -- context_dependent_unit ENTITY conversion_based_unit SUBTYPE OF (named_unit); name : label; conversion_factor : measure_with_unit; END_ENTITY; -- conversion_based_unit ENTITY data_type ABSTRACT SUPERTYPE OF (ONEOF (simple_type,complex_type,named_type)); END_ENTITY; -- data_type ENTITY data_type_bsu SUBTYPE OF (basic_semantic_unit); SELF\basic_semantic_unit.code : data_type_code_type; name_scope : class_bsu; DERIVE absolute_id : identifier := name_scope.defined_by.absolute_id + sep_id + name_scope.dic_identifier + sep_id + dic_identifier; INVERSE defining_class : SET [0:1] OF class FOR defined_types; UNIQUE absolute_id; WHERE wr1: is_subclass(defining_class[1],name_scope.definition[1]); END_ENTITY; -- data_type_bsu ENTITY data_type_element SUBTYPE OF (dictionary_element); SELF\dictionary_element.identified_by : data_type_bsu; names : item_names; type_definition : data_type; END_ENTITY; -- data_type_element ENTITY dates; date_of_original_definition : date_type; date_of_current_version : date_type; date_of_current_revision : OPTIONAL date_type; END_ENTITY; -- dates ENTITY dependent_p_det SUBTYPE OF (property_det); depends_on : SET [1:?] OF property_bsu; WHERE wr1: (QUERY ( p <* depends_on | (NOT definition_available_implies(p, 'ISO13584_IEC61360_DICTIONARY_SCHEMA.CONDITION_DET' IN TYPEOF(p.definition))) ) = []); END_ENTITY; -- dependent_p_det ENTITY derived_unit; elements : SET [1:?] OF derived_unit_element; WHERE wr1: ((SIZEOF(elements) > 1) OR ((SIZEOF(elements) = 1) AND ( elements[1].exponent <> 1))); END_ENTITY; -- derived_unit ENTITY derived_unit_element; unit : named_unit; exponent : REAL; END_ENTITY; -- derived_unit_element ENTITY dic_unit; structured_representation : unit; string_representation : OPTIONAL mathematical_string; END_ENTITY; -- dic_unit ENTITY dic_value; value_code : value_type; meaning : item_names; source_doc_of_value : OPTIONAL document; END_ENTITY; -- dic_value ENTITY dictionary_element ABSTRACT SUPERTYPE OF (ONEOF (supplier_element, class_and_property_elements,data_type_element)); identified_by : basic_semantic_unit; time_stamps : OPTIONAL dates; revision : revision_type; END_ENTITY; -- dictionary_element ENTITY dimensional_exponents; length_exponent : REAL; mass_exponent : REAL; time_exponent : REAL; electric_current_exponent : REAL; thermodynamic_temperature_exponent : REAL; amount_of_substance_exponent : REAL; luminous_intensity_exponent : REAL; END_ENTITY; -- dimensional_exponents ENTITY document ABSTRACT SUPERTYPE; END_ENTITY; -- document ENTITY electric_current_measure_with_unit SUBTYPE OF (measure_with_unit); WHERE wr1: ('ISO13584_IEC61360_DICTIONARY_SCHEMA.ELECTRIC_CURRENT_UNIT' IN TYPEOF(SELF\measure_with_unit.unit_component)); END_ENTITY; -- electric_current_measure_with_unit ENTITY electric_current_unit SUBTYPE OF (named_unit); WHERE wr1: ((SELF\named_unit.dimensions.length_exponent = 0) AND (SELF\ named_unit.dimensions.mass_exponent = 0) AND (SELF\ named_unit.dimensions.time_exponent = 0) AND (SELF\ named_unit.dimensions.electric_current_exponent = 1) AND ( SELF\named_unit.dimensions. thermodynamic_temperature_exponent = 0) AND (SELF\named_unit .dimensions.amount_of_substance_exponent = 0) AND (SELF\ named_unit.dimensions.luminous_intensity_exponent = 0)); END_ENTITY; -- electric_current_unit ENTITY entity_instance_type ABSTRACT SUPERTYPE SUBTYPE OF (complex_type); type_name : SET OF STRING; END_ENTITY; -- entity_instance_type ENTITY global_language_assignment; language : language_code; END_ENTITY; -- global_language_assignment ENTITY global_unit_assigned_context SUBTYPE OF (representation_context); units : SET [1:?] OF unit; END_ENTITY; -- global_unit_assigned_context ENTITY graphics ABSTRACT SUPERTYPE; END_ENTITY; -- graphics ENTITY identified_document SUBTYPE OF (document); document_identifier : source_doc_type; END_ENTITY; -- identified_document ENTITY int_currency_type SUBTYPE OF (int_type); currency : OPTIONAL currency_code; END_ENTITY; -- int_currency_type ENTITY int_measure_type SUBTYPE OF (int_type); unit : dic_unit; END_ENTITY; -- int_measure_type ENTITY int_type SUPERTYPE OF (ONEOF (int_measure_type,int_currency_type, non_quantitative_int_type)) SUBTYPE OF (number_type); END_ENTITY; -- int_type ENTITY item_class SUPERTYPE OF (ONEOF (component_class,material_class)) SUBTYPE OF (class); simplified_drawing : OPTIONAL graphics; sub_class_properties : SET [0:?] OF property_bsu; class_constant_values : SET [0:?] OF class_value_assignment; coded_name : OPTIONAL value_code_type; WHERE wr1: (QUERY ( p <* sub_class_properties | (NOT (p IN SELF. described_by)) ) = []); wr2: ((NOT all_class_descriptions_reachable(SELF.identified_by)) OR (QUERY ( va <* class_constant_values | (SIZEOF(QUERY ( c <* va.super_class_defined_property.describes_classes | ( is_subclass(SELF,c) AND (va.super_class_defined_property IN c\item_class.sub_class_properties)) )) <> 1) ) = [])); END_ENTITY; -- item_class ENTITY item_names; preferred_name : pref_name_type; synonymous_names : SET OF syn_name_type; short_name : short_name_type; languages : OPTIONAL present_translations; icon : OPTIONAL graphics; WHERE wr1: (NOT (EXISTS(languages) XOR ((( 'ISO13584_IEC61360_LANGUAGE_RESOURCE_SCHEMA' + '.TRANSLATED_LABEL') IN TYPEOF(preferred_name)) AND ( languages :=: preferred_name\translated_label.languages) AND (('ISO13584_IEC61360_LANGUAGE_RESOURCE_SCHEMA' + '.TRANSLATED_LABEL') IN TYPEOF(short_name)) AND (languages :=: short_name\translated_label.languages) AND ( QUERY ( s <* synonymous_names | (NOT ( 'ISO13584_IEC61360_DICTIONARY_SCHEMA.LABEL_WITH_LANGUAGE' IN TYPEOF(s))) ) = [])))); wr2: ((NOT EXISTS(languages)) XOR (QUERY ( s <* synonymous_names | ( EXISTS(s.language) AND (NOT (s.language IN QUERY ( l <* languages.language_codes | TRUE )))) ) = [])); wr3: at_most_two_synonyms_per_language(languages,synonymous_names); END_ENTITY; -- item_names ENTITY label_with_language; l : label; language : language_code; END_ENTITY; -- label_with_language ENTITY length_measure_with_unit SUBTYPE OF (measure_with_unit); WHERE wr1: ('ISO13584_IEC61360_DICTIONARY_SCHEMA.LENGTH_UNIT' IN TYPEOF( SELF\measure_with_unit.unit_component)); END_ENTITY; -- length_measure_with_unit ENTITY length_unit SUBTYPE OF (named_unit); WHERE wr1: ((SELF\named_unit.dimensions.length_exponent = 1) AND (SELF\ named_unit.dimensions.mass_exponent = 0) AND (SELF\ named_unit.dimensions.time_exponent = 0) AND (SELF\ named_unit.dimensions.electric_current_exponent = 0) AND ( SELF\named_unit.dimensions. thermodynamic_temperature_exponent = 0) AND (SELF\named_unit .dimensions.amount_of_substance_exponent = 0) AND (SELF\ named_unit.dimensions.luminous_intensity_exponent = 0)); END_ENTITY; -- length_unit ENTITY level_type SUBTYPE OF (complex_type); levels : LIST [1:4] OF UNIQUE level; value_type : simple_type; WHERE wr1: ('ISO13584_IEC61360_DICTIONARY_SCHEMA.NUMBER_TYPE' IN TYPEOF( value_type)); END_ENTITY; -- level_type ENTITY luminous_intensity_measure_with_unit SUBTYPE OF (measure_with_unit); WHERE wr1: ('ISO13584_IEC61360_DICTIONARY_SCHEMA.LUMINOUS_INTENSITY_UNIT' IN TYPEOF(SELF\measure_with_unit.unit_component)); END_ENTITY; -- luminous_intensity_measure_with_unit ENTITY luminous_intensity_unit SUBTYPE OF (named_unit); WHERE wr1: ((SELF\named_unit.dimensions.length_exponent = 0) AND (SELF\ named_unit.dimensions.mass_exponent = 0) AND (SELF\ named_unit.dimensions.time_exponent = 0) AND (SELF\ named_unit.dimensions.electric_current_exponent = 0) AND ( SELF\named_unit.dimensions. thermodynamic_temperature_exponent = 0) AND (SELF\named_unit .dimensions.amount_of_substance_exponent = 0) AND (SELF\ named_unit.dimensions.luminous_intensity_exponent = 1)); END_ENTITY; -- luminous_intensity_unit ENTITY mass_measure_with_unit SUBTYPE OF (measure_with_unit); WHERE wr1: ('ISO13584_IEC61360_DICTIONARY_SCHEMA.MASS_UNIT' IN TYPEOF(SELF \measure_with_unit.unit_component)); END_ENTITY; -- mass_measure_with_unit ENTITY mass_unit SUBTYPE OF (named_unit); WHERE wr1: ((SELF\named_unit.dimensions.length_exponent = 0) AND (SELF\ named_unit.dimensions.mass_exponent = 1) AND (SELF\ named_unit.dimensions.time_exponent = 0) AND (SELF\ named_unit.dimensions.electric_current_exponent = 0) AND ( SELF\named_unit.dimensions. thermodynamic_temperature_exponent = 0) AND (SELF\named_unit .dimensions.amount_of_substance_exponent = 0) AND (SELF\ named_unit.dimensions.luminous_intensity_exponent = 0)); END_ENTITY; -- mass_unit ENTITY material_class SUBTYPE OF (item_class); END_ENTITY; -- material_class ENTITY mathematical_string; text_representation : text; sgml_representation : OPTIONAL text; END_ENTITY; -- mathematical_string ENTITY measure_with_unit SUPERTYPE OF (ONEOF (length_measure_with_unit,mass_measure_with_unit, time_measure_with_unit,electric_current_measure_with_unit, thermodynamic_temperature_measure_with_unit, amount_of_substance_measure_with_unit, luminous_intensity_measure_with_unit,plane_angle_measure_with_unit, solid_angle_measure_with_unit,area_measure_with_unit, volume_measure_with_unit,ratio_measure_with_unit)); value_component : measure_value; unit_component : unit; WHERE wr1: valid_units(SELF); END_ENTITY; -- measure_with_unit ENTITY named_type SUBTYPE OF (data_type); referred_type : data_type_bsu; END_ENTITY; -- named_type ENTITY named_unit SUPERTYPE OF (ONEOF (si_unit,conversion_based_unit, context_dependent_unit) ANDOR ONEOF (length_unit,mass_unit, time_unit,electric_current_unit,thermodynamic_temperature_unit, amount_of_substance_unit,luminous_intensity_unit,plane_angle_unit, solid_angle_unit,area_unit,volume_unit,ratio_unit)); dimensions : dimensional_exponents; END_ENTITY; -- named_unit ENTITY non_dependent_p_det SUBTYPE OF (property_det); END_ENTITY; -- non_dependent_p_det ENTITY non_quantitative_code_type SUBTYPE OF (string_type); domain : value_domain; WHERE wr1: (QUERY ( v <* domain.its_values | (NOT ( 'ISO13584_IEC61360_DICTIONARY_SCHEMA.VALUE_CODE_TYPE' IN TYPEOF(v.value_code))) ) = []); END_ENTITY; -- non_quantitative_code_type ENTITY non_quantitative_int_type SUBTYPE OF (int_type); domain : value_domain; WHERE wr1: (QUERY ( v <* domain.its_values | ( 'ISO13584_IEC61360_DICTIONARY_SCHEMA.VALUE_CODE_TYPE' IN TYPEOF(v.value_code)) ) = []); END_ENTITY; -- non_quantitative_int_type ENTITY non_si_unit SUBTYPE OF (named_unit); name : label; END_ENTITY; -- non_si_unit ENTITY number_type SUPERTYPE OF (ONEOF (int_type,real_type)) SUBTYPE OF (simple_type); END_ENTITY; -- number_type ENTITY organization; id : OPTIONAL identifier; name : label; description : text; END_ENTITY; -- organization ENTITY placement_type SUPERTYPE OF (ONEOF (axis1_placement_type,axis2_placement_2d_type, axis2_placement_3d_type)) SUBTYPE OF (entity_instance_type); WHERE wr1: ('GEOMETRY_SCHEMA.PLACEMENT' IN SELF\entity_instance_type. type_name); END_ENTITY; -- placement_type ENTITY plane_angle_measure_with_unit SUBTYPE OF (measure_with_unit); WHERE wr1: ('ISO13584_IEC61360_DICTIONARY_SCHEMA.PLANE_ANGLE_UNIT' IN TYPEOF(SELF\measure_with_unit.unit_component)); END_ENTITY; -- plane_angle_measure_with_unit ENTITY plane_angle_unit SUBTYPE OF (named_unit); WHERE wr1: ((SELF\named_unit.dimensions.length_exponent = 0) AND (SELF\ named_unit.dimensions.mass_exponent = 0) AND (SELF\ named_unit.dimensions.time_exponent = 0) AND (SELF\ named_unit.dimensions.electric_current_exponent = 0) AND ( SELF\named_unit.dimensions. thermodynamic_temperature_exponent = 0) AND (SELF\named_unit .dimensions.amount_of_substance_exponent = 0) AND (SELF\ named_unit.dimensions.luminous_intensity_exponent = 0)); END_ENTITY; -- plane_angle_unit ENTITY present_translations; language_codes : LIST [1:?] OF UNIQUE language_code; UNIQUE ur1 : language_codes; END_ENTITY; -- present_translations ENTITY property_bsu SUBTYPE OF (basic_semantic_unit); SELF\basic_semantic_unit.code : property_code_type; name_scope : class_bsu; DERIVE absolute_id : identifier := name_scope.defined_by.absolute_id + sep_id + name_scope.dic_identifier + sep_id + dic_identifier; INVERSE describes_classes : SET OF class FOR described_by; UNIQUE ur1 : absolute_id; WHERE wr1: (QUERY ( c <* describes_classes | (NOT is_subclass(c,name_scope .definition[1]\class)) ) = []); END_ENTITY; -- property_bsu ENTITY property_det ABSTRACT SUPERTYPE OF (ONEOF (condition_det,dependent_p_det, non_dependent_p_det)) SUBTYPE OF (class_and_property_elements); SELF\dictionary_element.identified_by : property_bsu; preferred_symbol : OPTIONAL mathematical_string; synonymous_symbols : SET [0:2] OF mathematical_string; figure : OPTIONAL graphics; det_classification : OPTIONAL det_classification_type; domain : data_type; formula : OPTIONAL mathematical_string; DERIVE describes_classes : SET [0:?] OF class := identified_by. describes_classes; END_ENTITY; -- property_det ENTITY ratio_measure_with_unit SUBTYPE OF (measure_with_unit); WHERE wr1: ('ISO13584_IEC61360_DICTIONARY_SCHEMA.RATIO_UNIT' IN TYPEOF( SELF\measure_with_unit.unit_component)); END_ENTITY; -- ratio_measure_with_unit ENTITY ratio_unit SUBTYPE OF (named_unit); WHERE wr1: ((SELF\named_unit.dimensions.length_exponent = 0) AND (SELF\ named_unit.dimensions.mass_exponent = 0) AND (SELF\ named_unit.dimensions.time_exponent = 0) AND (SELF\ named_unit.dimensions.electric_current_exponent = 0) AND ( SELF\named_unit.dimensions. thermodynamic_temperature_exponent = 0) AND (SELF\named_unit .dimensions.amount_of_substance_exponent = 0) AND (SELF\ named_unit.dimensions.luminous_intensity_exponent = 0)); END_ENTITY; -- ratio_unit ENTITY real_currency_type SUBTYPE OF (real_type); currency : OPTIONAL currency_code; END_ENTITY; -- real_currency_type ENTITY real_measure_type SUBTYPE OF (real_type); unit : dic_unit; END_ENTITY; -- real_measure_type ENTITY real_type SUPERTYPE OF (ONEOF (real_measure_type,real_currency_type)) SUBTYPE OF (number_type); END_ENTITY; -- real_type ENTITY representation; name : label; items : SET [1:?] OF representation_item; context_of_items : representation_context; END_ENTITY; -- representation ENTITY representation_context; context_identifier : identifier; context_type : text; INVERSE representations_in_context : SET [1:?] OF representation FOR context_of_items; END_ENTITY; -- representation_context ENTITY representation_item; name : label; WHERE wr1: (SIZEOF(using_representations(SELF)) > 0); END_ENTITY; -- representation_item ENTITY si_unit SUBTYPE OF (named_unit); prefix : OPTIONAL si_prefix; name : si_unit_name; DERIVE SELF\named_unit.dimensions : dimensional_exponents := dimensions_for_si_unit(SELF.name); END_ENTITY; -- si_unit ENTITY simple_type ABSTRACT SUPERTYPE OF (ONEOF (number_type,boolean_type,string_type)) SUBTYPE OF (data_type); value_format : value_format_type; END_ENTITY; -- simple_type ENTITY solid_angle_measure_with_unit SUBTYPE OF (measure_with_unit); WHERE wr1: ('ISO13584_IEC61360_DICTIONARY_SCHEMA.SOLID_ANGLE_UNIT' IN TYPEOF(SELF\measure_with_unit.unit_component)); END_ENTITY; -- solid_angle_measure_with_unit ENTITY solid_angle_unit SUBTYPE OF (named_unit); WHERE wr1: ((SELF\named_unit.dimensions.length_exponent = 0) AND (SELF\ named_unit.dimensions.mass_exponent = 0) AND (SELF\ named_unit.dimensions.time_exponent = 0) AND (SELF\ named_unit.dimensions.electric_current_exponent = 0) AND ( SELF\named_unit.dimensions. thermodynamic_temperature_exponent = 0) AND (SELF\named_unit .dimensions.amount_of_substance_exponent = 0) AND (SELF\ named_unit.dimensions.luminous_intensity_exponent = 0)); END_ENTITY; -- solid_angle_unit ENTITY string_type SUBTYPE OF (simple_type); END_ENTITY; -- string_type ENTITY supplier_bsu SUBTYPE OF (basic_semantic_unit); SELF\basic_semantic_unit.code : supplier_code_type; DERIVE SELF\basic_semantic_unit.version : version_type := '001'; absolute_id : identifier := SELF\ basic_semantic_unit.code; UNIQUE ur1 : absolute_id; END_ENTITY; -- supplier_bsu ENTITY supplier_bsu_relationship ABSTRACT SUPERTYPE; relating_supplier : supplier_element; related_tokens : SET [1:?] OF supplier_related_bsu; END_ENTITY; -- supplier_bsu_relationship ENTITY supplier_element SUBTYPE OF (dictionary_element); SELF\dictionary_element.identified_by : supplier_bsu; org : organization; addr : address; INVERSE associated_items : SET [0:?] OF supplier_bsu_relationship FOR relating_supplier; END_ENTITY; -- supplier_element ENTITY supplier_related_bsu ABSTRACT SUPERTYPE SUBTYPE OF (basic_semantic_unit); END_ENTITY; -- supplier_related_bsu ENTITY thermodynamic_temperature_measure_with_unit SUBTYPE OF (measure_with_unit); WHERE wr1: ('ISO13584_IEC61360_DICTIONARY_SCHEMA.THERMODYNAMIC_TEMPERATURE_UNIT' IN TYPEOF(SELF\measure_with_unit.unit_component)); END_ENTITY; -- thermodynamic_temperature_measure_with_unit ENTITY thermodynamic_temperature_unit SUBTYPE OF (named_unit); WHERE wr1: ((SELF\named_unit.dimensions.length_exponent = 0) AND (SELF\ named_unit.dimensions.mass_exponent = 0) AND (SELF\ named_unit.dimensions.time_exponent = 0) AND (SELF\ named_unit.dimensions.electric_current_exponent = 0) AND ( SELF\named_unit.dimensions. thermodynamic_temperature_exponent = 1) AND (SELF\named_unit .dimensions.amount_of_substance_exponent = 0) AND (SELF\ named_unit.dimensions.luminous_intensity_exponent = 0)); END_ENTITY; -- thermodynamic_temperature_unit ENTITY time_measure_with_unit SUBTYPE OF (measure_with_unit); WHERE wr1: ('ISO13584_IEC61360_DICTIONARY_SCHEMA.TIME_UNIT' IN TYPEOF(SELF \measure_with_unit.unit_component)); END_ENTITY; -- time_measure_with_unit ENTITY time_unit SUBTYPE OF (named_unit); WHERE wr1: ((SELF\named_unit.dimensions.length_exponent = 0) AND (SELF\ named_unit.dimensions.mass_exponent = 0) AND (SELF\ named_unit.dimensions.time_exponent = 1) AND (SELF\ named_unit.dimensions.electric_current_exponent = 0) AND ( SELF\named_unit.dimensions. thermodynamic_temperature_exponent = 0) AND (SELF\named_unit .dimensions.amount_of_substance_exponent = 0) AND (SELF\ named_unit.dimensions.luminous_intensity_exponent = 0)); END_ENTITY; -- time_unit ENTITY translated_label; labels : LIST [1:?] OF label; languages : present_translations; WHERE wr1: (SIZEOF(labels) = SIZEOF(languages.language_codes)); END_ENTITY; -- translated_label ENTITY translated_text; texts : LIST [1:?] OF text; languages : present_translations; WHERE wr1: (SIZEOF(texts) = SIZEOF(languages.language_codes)); END_ENTITY; -- translated_text ENTITY value_domain; its_values : LIST [2:?] OF dic_value; source_doc_of_value_domain : OPTIONAL document; languages : OPTIONAL present_translations; terms : LIST [0:?] OF item_names; WHERE wr1: ((NOT EXISTS(languages)) XOR (QUERY ( v <* its_values | ( languages :<>: v.meaning.languages) ) = [])); wr2: codes_are_unique(its_values); END_ENTITY; -- value_domain ENTITY volume_measure_with_unit SUBTYPE OF (measure_with_unit); WHERE wr1: ('ISO13584_IEC61360_DICTIONARY_SCHEMA.VOLUME_UNIT' IN TYPEOF( SELF\measure_with_unit.unit_component)); END_ENTITY; -- volume_measure_with_unit ENTITY volume_unit SUBTYPE OF (named_unit); WHERE wr1: ((SELF\named_unit.dimensions.length_exponent = 3) AND (SELF\ named_unit.dimensions.mass_exponent = 0) AND (SELF\ named_unit.dimensions.time_exponent = 0) AND (SELF\ named_unit.dimensions.electric_current_exponent = 0) AND ( SELF\named_unit.dimensions. thermodynamic_temperature_exponent = 0) AND (SELF\named_unit .dimensions.amount_of_substance_exponent = 0) AND (SELF\ named_unit.dimensions.luminous_intensity_exponent = 0)); END_ENTITY; -- volume_unit RULE assert_oneof FOR (named_unit); WHERE WR1: (QUERY ( u <* named_unit | ((( 'ISO13584_IEC61360_DICTIONARY_SCHEMA.NON_SI_UNIT' IN TYPEOF(u)) AND ( 'ISO13584_IEC61360_DICTIONARY_SCHEMA.SI_UNIT' IN TYPEOF( u))) OR (( 'ISO13584_IEC61360_DICTIONARY_SCHEMA.NON_SI_UNIT' IN TYPEOF(u)) AND ('ISO13584_IEC61360_DICTIONARY_SCHEMA.CONTEXT_DEPENDENT_UNIT' IN TYPEOF(u))) OR (( 'ISO13584_IEC61360_DICTIONARY_SCHEMA.NON_SI_UNIT' IN TYPEOF(u)) AND ('ISO13584_IEC61360_DICTIONARY_SCHEMA.CONVERSION_BASED_UNIT' IN TYPEOF(u)))) ) = []); END_RULE; -- assert_oneof RULE single_language_assignment FOR (global_language_assignment); WHERE WR1: (SIZEOF(global_language_assignment) <= 1); END_RULE; -- single_language_assignment FUNCTION acyclic_superclass_relationship( current: class_bsu; visited: SET OF class ): LOGICAL; IF SIZEOF(current.definition) = 1 THEN IF current.definition[1]\class IN visited THEN RETURN(FALSE); ELSE IF EXISTS(current.definition[1]\class.its_superclass) THEN RETURN(acyclic_superclass_relationship(current.definition[1]\ class.its_superclass,visited + current.definition[1]\class)); ELSE RETURN(TRUE); END_IF; END_IF; ELSE RETURN(UNKNOWN); END_IF; END_FUNCTION; -- acyclic_superclass_relationship FUNCTION all_class_descriptions_reachable( cl: class_bsu ): BOOLEAN; IF SIZEOF(cl.definition) = 0 THEN RETURN(FALSE); END_IF; IF NOT EXISTS(cl.definition[1]\class.its_superclass) THEN RETURN(TRUE); ELSE RETURN(all_class_descriptions_reachable(cl.definition[1]\class. its_superclass)); END_IF; END_FUNCTION; -- all_class_descriptions_reachable FUNCTION at_most_two_synonyms_per_language( languages: present_translations; synonymous_names: SET OF syn_name_type ): BOOLEAN; IF EXISTS(languages) THEN REPEAT i := 1 TO SIZEOF(languages.language_codes) BY 1; IF SIZEOF(QUERY ( s <* synonymous_names | (s.language = languages. language_codes[i]) )) > 2 THEN RETURN(FALSE); END_IF; END_REPEAT; RETURN(TRUE); ELSE RETURN(SIZEOF(synonymous_names) <= 2); END_IF; END_FUNCTION; -- at_most_two_synonyms_per_language FUNCTION bag_to_set( the_bag: BAG OF GENERIC:intype ): SET OF GENERIC:intype; LOCAL i : INTEGER; the_set : SET OF GENERIC:intype := []; END_LOCAL; IF SIZEOF(the_bag) > 0 THEN REPEAT i := 1 TO HIINDEX(the_bag) BY 1; the_set := the_set + the_bag[i]; END_REPEAT; END_IF; RETURN(the_set); END_FUNCTION; -- bag_to_set FUNCTION check_label_length( l: translatable_label; l_length: INTEGER ): BOOLEAN; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.TRANSLATED_LABEL' IN TYPEOF(l) THEN REPEAT i := 1 TO SIZEOF(l.labels) BY 1; IF LENGTH(l.labels[i]) > l_length THEN RETURN(FALSE); END_IF; END_REPEAT; RETURN(TRUE); ELSE RETURN(LENGTH(l) <= l_length); END_IF; END_FUNCTION; -- check_label_length FUNCTION check_syn_length( s: syn_name_type; s_length: INTEGER ): BOOLEAN; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.LABEL_WITH_LANGUAGE' IN TYPEOF(s) THEN RETURN(LENGTH(s.l) <= s_length); ELSE RETURN(LENGTH(s) <= s_length); END_IF; END_FUNCTION; -- check_syn_length FUNCTION check_text_length( t: translatable_text; t_length: INTEGER ): BOOLEAN; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.TRANSLATED_TEXT' IN TYPEOF(t) THEN REPEAT i := 1 TO SIZEOF(t.texts) BY 1; IF LENGTH(t.texts[i]) > t_length THEN RETURN(FALSE); END_IF; END_REPEAT; RETURN(TRUE); ELSE RETURN(LENGTH(t) <= t_length); END_IF; END_FUNCTION; -- check_text_length FUNCTION codes_are_unique( values: LIST OF dic_value ): BOOLEAN; LOCAL l : SET OF STRING := []; END_LOCAL; REPEAT i := 1 TO SIZEOF(values) BY 1; l := l + values[i].value_code; END_REPEAT; RETURN(SIZEOF(values) = SIZEOF(l)); END_FUNCTION; -- codes_are_unique FUNCTION compute_known_applicable_data_types( cl: class_bsu ): SET OF data_type_bsu; LOCAL s : SET OF data_type_bsu := []; END_LOCAL; IF SIZEOF(cl.definition) = 0 THEN RETURN(s); ELSE REPEAT i := 1 TO SIZEOF(cl.definition[1]\class.described_by) BY 1; s := s + cl.definition[1]\class.defined_types[i]; END_REPEAT; IF EXISTS(cl.definition[1]\class.its_superclass) THEN s := s + compute_known_applicable_data_types(cl.definition[1]\ class.its_superclass); END_IF; RETURN(s); END_IF; END_FUNCTION; -- compute_known_applicable_data_types FUNCTION compute_known_applicable_properties( cl: class_bsu ): SET OF property_bsu; LOCAL s : SET OF property_bsu := []; END_LOCAL; IF SIZEOF(cl.definition) = 0 THEN RETURN(s); ELSE REPEAT i := 1 TO SIZEOF(cl.definition[1]\class.described_by) BY 1; s := s + cl.definition[1]\class.described_by[i]; END_REPEAT; IF EXISTS(cl.definition[1]\class.its_superclass) THEN s := s + compute_known_applicable_properties(cl.definition[1]\ class.its_superclass); END_IF; RETURN(s); END_IF; END_FUNCTION; -- compute_known_applicable_properties FUNCTION compute_known_visible_data_types( cl: class_bsu ): SET OF data_type_bsu; LOCAL s : SET OF data_type_bsu := []; END_LOCAL; s := USEDIN(cl, 'ISO13584_IEC61360_DICTIONARY_SCHEMA.DATA_TYPE_BSU.NAME_SCOPE'); IF SIZEOF(cl.definition) = 0 THEN RETURN(s); ELSE IF EXISTS(cl.definition[1]\class.its_superclass) THEN s := s + compute_known_visible_data_types(cl.definition[1]\class. its_superclass); END_IF; RETURN(s); END_IF; END_FUNCTION; -- compute_known_visible_data_types FUNCTION compute_known_visible_properties( cl: class_bsu ): SET OF property_bsu; LOCAL s : SET OF property_bsu := []; END_LOCAL; s := USEDIN(cl, 'ISO13584_IEC61360_DICTIONARY_SCHEMA.PROPERTY_BSU.NAME_SCOPE'); IF SIZEOF(cl.definition) = 0 THEN RETURN(s); ELSE IF EXISTS(cl.definition[1]\class.its_superclass) THEN s := s + compute_known_visible_properties(cl.definition[1]\class. its_superclass); END_IF; RETURN(s); END_IF; END_FUNCTION; -- compute_known_visible_properties FUNCTION definition_available_implies( bsu: basic_semantic_unit; expression: LOGICAL ): LOGICAL; RETURN((NOT (SIZEOF(bsu.definition) = 1)) OR expression); END_FUNCTION; -- definition_available_implies FUNCTION derive_dimensional_exponents( x: unit ): dimensional_exponents; LOCAL i : INTEGER; result : dimensional_exponents := dimensional_exponents(0,0,0,0,0,0, 0); END_LOCAL; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.DERIVED_UNIT' IN TYPEOF(x) THEN REPEAT i := LOINDEX(x.elements) TO HIINDEX(x.elements) BY 1; result.length_exponent := result.length_exponent + (x.elements[i]. exponent * x.elements[i].unit.dimensions.length_exponent); result.mass_exponent := result.mass_exponent + (x.elements[i]. exponent * x.elements[i].unit.dimensions.mass_exponent); result.time_exponent := result.time_exponent + (x.elements[i]. exponent * x.elements[i].unit.dimensions.time_exponent); result.electric_current_exponent := result. electric_current_exponent + (x.elements[i].exponent * x. elements[i].unit.dimensions.electric_current_exponent); result.thermodynamic_temperature_exponent := result. thermodynamic_temperature_exponent + (x.elements[i].exponent * x.elements[i].unit.dimensions. thermodynamic_temperature_exponent); result.amount_of_substance_exponent := result. amount_of_substance_exponent + (x.elements[i].exponent * x. elements[i].unit.dimensions.amount_of_substance_exponent); result.luminous_intensity_exponent := result. luminous_intensity_exponent + (x.elements[i].exponent * x. elements[i].unit.dimensions.luminous_intensity_exponent); END_REPEAT; ELSE result := x.dimensions; END_IF; RETURN(result); END_FUNCTION; -- derive_dimensional_exponents FUNCTION dimensions_for_si_unit( n: si_unit_name ): dimensional_exponents; CASE n OF metre : RETURN(dimensional_exponents(1,0,0,0,0,0,0)); gram : RETURN(dimensional_exponents(0,1,0,0,0,0,0)); second : RETURN(dimensional_exponents(0,0,1,0,0,0,0)); ampere : RETURN(dimensional_exponents(0,0,0,1,0,0,0)); kelvin : RETURN(dimensional_exponents(0,0,0,0,1,0,0)); mole : RETURN(dimensional_exponents(0,0,0,0,0,1,0)); candela : RETURN(dimensional_exponents(0,0,0,0,0,0,1)); radian : RETURN(dimensional_exponents(0,0,0,0,0,0,0)); steradian : RETURN(dimensional_exponents(0,0,0,0,0,0,0)); hertz : RETURN(dimensional_exponents(0,0,-1,0,0,0,0)); newton : RETURN(dimensional_exponents(1,1,-2,0,0,0,0)); pascal : RETURN(dimensional_exponents(-1,1,-2,0,0,0,0)); joule : RETURN(dimensional_exponents(2,1,-2,0,0,0,0)); watt : RETURN(dimensional_exponents(2,1,-3,0,0,0,0)); coulomb : RETURN(dimensional_exponents(0,0,1,1,0,0,0)); volt : RETURN(dimensional_exponents(2,1,-3,-1,0,0,0)); farad : RETURN(dimensional_exponents(-2,-1,4,1,0,0,0)); ohm : RETURN(dimensional_exponents(2,1,-3,-2,0,0,0)); siemens : RETURN(dimensional_exponents(-2,-1,3,2,0,0,0)); weber : RETURN(dimensional_exponents(2,1,-2,-1,0,0,0)); tesla : RETURN(dimensional_exponents(0,1,-2,-1,0,0,0)); henry : RETURN(dimensional_exponents(2,1,-2,-2,0,0,0)); degree_celsius : RETURN(dimensional_exponents(0,0,0,0,1,0,0)); lumen : RETURN(dimensional_exponents(0,0,0,0,0,0,1)); lux : RETURN(dimensional_exponents(-2,0,0,0,0,0,1)); becquerel : RETURN(dimensional_exponents(0,0,-1,0,0,0,0)); gray : RETURN(dimensional_exponents(2,0,-2,0,0,0,0)); sievert : RETURN(dimensional_exponents(2,0,-2,0,0,0,0)); END_CASE; END_FUNCTION; -- dimensions_for_si_unit FUNCTION is_subclass( sub, super: class ): LOGICAL; IF (NOT EXISTS(sub)) OR (NOT EXISTS(super)) THEN RETURN(UNKNOWN); END_IF; IF NOT EXISTS(sub.its_superclass) THEN RETURN(FALSE); END_IF; IF SIZEOF(sub.its_superclass.definition) = 1 THEN IF sub.its_superclass.definition[1]\class = super THEN RETURN(TRUE); ELSE RETURN(is_subclass(sub.its_superclass.definition[1]\class,super)); END_IF; ELSE RETURN(UNKNOWN); END_IF; END_FUNCTION; -- is_subclass FUNCTION list_to_set( l: LIST [0:?] OF GENERIC:type_elem ): SET OF GENERIC:type_elem; LOCAL s : SET OF GENERIC:type_elem := []; END_LOCAL; REPEAT i := 1 TO SIZEOF(l) BY 1; s := s + l[i]; END_REPEAT; RETURN(s); END_FUNCTION; -- list_to_set FUNCTION string_for_derived_unit( u: derived_unit ): STRING; FUNCTION string_for_derived_unit_element( u: derived_unit_element; neg_exp: BOOLEAN ): STRING; LOCAL result : STRING; END_LOCAL; result := string_for_named_unit(u.unit); IF u.exponent <> 0 THEN IF (u.exponent > 0) OR (NOT neg_exp) THEN result := result + '**' + FORMAT(ABS(u.exponent),'1I'); ELSE result := result + '**' + FORMAT(u.exponent,'1I'); END_IF; END_IF; RETURN(result); END_FUNCTION; -- string_for_derived_unit_element LOCAL us : STRING; neg : SET OF derived_unit_element; pos : SET OF derived_unit_element; END_LOCAL; pos := QUERY ( ue <* u.elements | (ue.exponent > 0) ); neg := QUERY ( ue <* u.elements | (ue.exponent < 0) ); us := ''; IF SIZEOF(pos) > 0 THEN REPEAT i := LOINDEX(pos) TO HIINDEX(pos) BY 1; us := us + string_for_derived_unit_element(pos[i],FALSE); IF i <> HIINDEX(pos) THEN us := us + '.'; END_IF; END_REPEAT; IF SIZEOF(neg) > 0 THEN us := us + '/'; IF SIZEOF(neg) > 1 THEN us := us + '('; END_IF; REPEAT i := LOINDEX(neg) TO HIINDEX(neg) BY 1; us := us + string_for_derived_unit_element(neg[i],FALSE); IF i <> HIINDEX(neg) THEN us := us + '.'; END_IF; END_REPEAT; IF SIZEOF(neg) > 1 THEN us := us + ')'; END_IF; END_IF; ELSE IF SIZEOF(neg) > 0 THEN REPEAT i := LOINDEX(neg) TO HIINDEX(neg) BY 1; us := us + string_for_derived_unit_element(neg[i],TRUE); IF i <> HIINDEX(neg) THEN us := us + '.'; END_IF; END_REPEAT; END_IF; END_IF; RETURN(us); END_FUNCTION; -- string_for_derived_unit FUNCTION string_for_derived_unit_element( u: derived_unit_element; neg_exp: BOOLEAN ): STRING; LOCAL result : STRING; END_LOCAL; result := string_for_named_unit(u.unit); IF u.exponent <> 0 THEN IF (u.exponent > 0) OR (NOT neg_exp) THEN result := result + '**' + FORMAT(ABS(u.exponent),'1I'); ELSE result := result + '**' + FORMAT(u.exponent,'1I'); END_IF; END_IF; RETURN(result); END_FUNCTION; -- string_for_derived_unit_element FUNCTION string_for_named_unit( u: named_unit ): STRING; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.SI_UNIT' IN TYPEOF(u) THEN RETURN(string_for_si_unit(u\si_unit)); ELSE IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.CONTEXT_DEPENDENT_UNIT' IN TYPEOF(u) THEN RETURN(u\context_dependent_unit.name); ELSE IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.CONVERSION_BASED_UNIT' IN TYPEOF(u) THEN RETURN(u\conversion_based_unit.name); ELSE IF ('ISO13584_IEC61360_DICTIONARY_SCHEMA' + '.NON_SI_UNIT') IN TYPEOF(u) THEN RETURN(u\non_si_unit.name); ELSE RETURN('name_unknown'); END_IF; END_IF; END_IF; END_IF; END_FUNCTION; -- string_for_named_unit FUNCTION string_for_si_unit( unit: si_unit ): STRING; LOCAL prefix_string : STRING; unit_string : STRING; END_LOCAL; IF EXISTS(unit.prefix) THEN CASE unit.prefix OF exa : prefix_string := 'E'; peta : prefix_string := 'P'; tera : prefix_string := 'T'; giga : prefix_string := 'G'; mega : prefix_string := 'M'; kilo : prefix_string := 'k'; hecto : prefix_string := 'h'; deca : prefix_string := 'da'; deci : prefix_string := 'd'; centi : prefix_string := 'c'; milli : prefix_string := 'm'; micro : prefix_string := 'u'; nano : prefix_string := 'n'; pico : prefix_string := 'p'; femto : prefix_string := 'f'; atto : prefix_string := 'a'; END_CASE; ELSE prefix_string := ''; END_IF; CASE unit.name OF metre : unit_string := 'm'; gram : unit_string := 'g'; second : unit_string := 's'; ampere : unit_string := 'A'; kelvin : unit_string := 'K'; mole : unit_string := 'mol'; candela : unit_string := 'cd'; radian : unit_string := 'rad'; steradian : unit_string := 'sr'; hertz : unit_string := 'Hz'; newton : unit_string := 'N'; pascal : unit_string := 'Pa'; joule : unit_string := 'J'; watt : unit_string := 'W'; coulomb : unit_string := 'C'; volt : unit_string := 'V'; farad : unit_string := 'F'; ohm : unit_string := 'Ohm'; siemens : unit_string := 'S'; weber : unit_string := 'Wb'; tesla : unit_string := 'T'; henry : unit_string := 'H'; degree_celsius : unit_string := 'Cel'; lumen : unit_string := 'lm'; lux : unit_string := 'lx'; becquerel : unit_string := 'Bq'; gray : unit_string := 'Gy'; sievert : unit_string := 'Sv'; END_CASE; RETURN(prefix_string + unit_string); END_FUNCTION; -- string_for_si_unit FUNCTION string_for_unit( u: unit ): STRING; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.DERIVED_UNIT' IN TYPEOF(u) THEN RETURN(string_for_derived_unit(u)); ELSE RETURN(string_for_named_unit(u)); END_IF; END_FUNCTION; -- string_for_unit FUNCTION using_representations( item: representation_item ): SET OF representation; LOCAL results : SET OF representation; i : INTEGER; intermediate_items : SET OF representation_item; result_bag : BAG OF representation; END_LOCAL; result_bag := USEDIN(item, 'ISO13584_IEC61360_DICTIONARY_SCHEMA.REPRESENTATION.ITEMS'); IF SIZEOF(result_bag) > 0 THEN REPEAT i := 1 TO HIINDEX(result_bag) BY 1; results := results + result_bag[i]; END_REPEAT; END_IF; intermediate_items := QUERY ( z <* bag_to_set(USEDIN(item,'')) | ( 'ISO13584_IEC61360_DICTIONARY_SCHEMA.REPRESENTATION_ITEM' IN TYPEOF(z)) ); IF SIZEOF(intermediate_items) > 0 THEN REPEAT i := 1 TO HIINDEX(intermediate_items) BY 1; results := results + using_representations(intermediate_items[i]); END_REPEAT; END_IF; RETURN(results); END_FUNCTION; -- using_representations FUNCTION valid_units( m: measure_with_unit ): BOOLEAN; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.LENGTH_MEASURE' IN TYPEOF(m. value_component) THEN IF derive_dimensional_exponents(m.unit_component) <> dimensional_exponents(1,0,0,0,0,0,0) THEN RETURN(FALSE); END_IF; END_IF; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.MASS_MEASURE' IN TYPEOF(m. value_component) THEN IF derive_dimensional_exponents(m.unit_component) <> dimensional_exponents(0,1,0,0,0,0,0) THEN RETURN(FALSE); END_IF; END_IF; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.TIME_MEASURE' IN TYPEOF(m. value_component) THEN IF derive_dimensional_exponents(m.unit_component) <> dimensional_exponents(0,0,1,0,0,0,0) THEN RETURN(FALSE); END_IF; END_IF; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.ELECTRIC_CURRENT_MEASURE' IN TYPEOF(m.value_component) THEN IF derive_dimensional_exponents(m.unit_component) <> dimensional_exponents(0,0,0,1,0,0,0) THEN RETURN(FALSE); END_IF; END_IF; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.THERMODYNAMIC_TEMPERATURE_MEASURE' IN TYPEOF(m.value_component) THEN IF derive_dimensional_exponents(m.unit_component) <> dimensional_exponents(0,0,0,0,1,0,0) THEN RETURN(FALSE); END_IF; END_IF; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.AMOUNT_OF_SUBSTANCE_MEASURE' IN TYPEOF(m.value_component) THEN IF derive_dimensional_exponents(m.unit_component) <> dimensional_exponents(0,0,0,0,0,1,0) THEN RETURN(FALSE); END_IF; END_IF; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.LUMINOUS_INTENSITY_MEASURE' IN TYPEOF(m.value_component) THEN IF derive_dimensional_exponents(m.unit_component) <> dimensional_exponents(0,0,0,0,0,0,1) THEN RETURN(FALSE); END_IF; END_IF; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.PLANE_ANGLE_MEASURE' IN TYPEOF(m.value_component) THEN IF derive_dimensional_exponents(m.unit_component) <> dimensional_exponents(0,0,0,0,0,0,0) THEN RETURN(FALSE); END_IF; END_IF; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.SOLID_ANGLE_MEASURE' IN TYPEOF(m.value_component) THEN IF derive_dimensional_exponents(m.unit_component) <> dimensional_exponents(0,0,0,0,0,0,0) THEN RETURN(FALSE); END_IF; END_IF; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.AREA_MEASURE' IN TYPEOF(m. value_component) THEN IF derive_dimensional_exponents(m.unit_component) <> dimensional_exponents(2,0,0,0,0,0,0) THEN RETURN(FALSE); END_IF; END_IF; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.VOLUME_MEASURE' IN TYPEOF(m. value_component) THEN IF derive_dimensional_exponents(m.unit_component) <> dimensional_exponents(3,0,0,0,0,0,0) THEN RETURN(FALSE); END_IF; END_IF; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.RATIO_MEASURE' IN TYPEOF(m. value_component) THEN IF derive_dimensional_exponents(m.unit_component) <> dimensional_exponents(0,0,0,0,0,0,0) THEN RETURN(FALSE); END_IF; END_IF; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.POSITIVE_LENGTH_MEASURE' IN TYPEOF(m.value_component) THEN IF derive_dimensional_exponents(m.unit_component) <> dimensional_exponents(1,0,0,0,0,0,0) THEN RETURN(FALSE); END_IF; END_IF; IF 'ISO13584_IEC61360_DICTIONARY_SCHEMA.POSITIVE_PLANE_ANGLE_MEASURE' IN TYPEOF(m.value_component) THEN IF derive_dimensional_exponents(m.unit_component) <> dimensional_exponents(0,0,0,0,0,0,0) THEN RETURN(FALSE); END_IF; END_IF; RETURN(TRUE); END_FUNCTION; -- valid_units END_SCHEMA; -- iso13584_iec61360_dictionary_schema