| Application module: Production rule | ISO/TS 10303-1739:2019(E) © ISO | 
         (*
ISO/TC 184/SC 4/WG 12 N10540 - ISO/TS 10303-1739 Production rule - EXPRESS ARM
Supersedes 
         ISO/TC 184/SC 4/WG 12 N7034
*)
         
SCHEMA Production_rule_arm;
         USE FROM
         Activity_arm;
            -- ISO/TS 10303-1047
         USE FROM
         Date_time_assignment_arm;
            -- ISO/TS 10303-1014
         USE FROM
         Identification_assignment_arm;
            -- ISO/TS 10303-1021
         USE FROM
         Product_identification_arm;
            -- ISO/TS 10303-1017
         USE FROM
         Software_arm;
            -- ISO/TS 10303-1746
         USE FROM
         Specification_document_arm;
            -- ISO/TS 10303-1747
         REFERENCE FROM 
         Specification_document_arm   -- ISO/TS 10303-1747
  (get_document_definition);
         
         REFERENCE FROM 
         Support_resource_arm   -- ISO/TS 10303-1800
  (bag_to_set);
         
TYPE built_in_functions =
         
         EXTENSIBLE
         
         ENUMERATION
         
         OF
         
            
         (attr_val);
         END_TYPE; 
         
TYPE clause_select =
         
         
         SELECT
            (Simple_clause, 
    Complex_clause);
         END_TYPE; 
         
TYPE constants =
         
         EXTENSIBLE
         
         
         SELECT
            (any_number_value, 
    any_string_value, 
    Logical_representation_item);
         END_TYPE; 
         
TYPE expression_syntax =
         
         EXTENSIBLE
         
         ENUMERATION
         
         OF
         
            
         (express);
         END_TYPE; 
         
TYPE function_symbol =
         
         
         SELECT
            (any_string_value, 
    built_in_functions);
         END_TYPE; 
         
TYPE pr_activity_item =
         
         
         SELECT
         BASED_ON
         activity_item
         WITH 
         
            (Rule_set, 
    Rule_version);
         END_TYPE; 
         
TYPE pr_documented_element_select =
         
         EXTENSIBLE
         
         GENERIC_ENTITY
         
         
         SELECT
         BASED_ON
         documented_element_select
         WITH 
         
            (Rule_set);
         END_TYPE; 
         
TYPE pr_identification_item =
         
         
         SELECT
         BASED_ON
         identification_item
         WITH 
         
            (Rule_set);
         END_TYPE; 
         
TYPE pr_organization_or_person_in_organization_item =
         
         
         SELECT
         BASED_ON
         organization_or_person_in_organization_item
         WITH 
         
            (Rule_action);
         END_TYPE; 
         
TYPE predicate_symbol =
         STRING;
         END_TYPE; 
         
TYPE scope_select =
         
         
         SELECT
            (Rule_definition, 
    Rule_set, 
    Rule_set_group);
         END_TYPE; 
         
TYPE term_select =
         
         
         SELECT
            (Symbol, 
    constants, 
    Func, 
    Scalar_variable, 
    Row_value, 
    Row_variable);
         END_TYPE; 
         
ENTITY Abstract_variable
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (Scalar_variable,
                                Row_variable));
           name : STRING;
           scope : scope_select;
UNIQUE
           UR1: name, scope;
         
         END_ENTITY;
ENTITY Atomic_formula
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (Rule_condition,
                                Ground_fact));
           predicate_symbol : predicate_symbol;
           terms : LIST[0:?] OF term_select;
         
         END_ENTITY;
ENTITY Attribute_assertion
           SUBTYPE OF (Fact_type);
           entity_type : STRING;
           attribute : STRING;
         
         END_ENTITY;
ENTITY Back_chaining_rule
           SUBTYPE OF (Rule_definition);
           head : Rule_condition;
           body : LIST[0:?] OF Rule_condition;
WHERE
           WR1: SELF.head.positive = TRUE;
           WR2: local_vars_of(SELF.head) <= local_vars_of(SELF.body);
         
         END_ENTITY;
ENTITY Complex_clause
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (Complex_conjunctive_clause,
                                Complex_disjunctive_clause));
           clauses : LIST[2:?] OF clause_select;
         
         END_ENTITY;
ENTITY Complex_conjunctive_clause
           SUBTYPE OF (Complex_clause);
         
         END_ENTITY;
ENTITY Complex_disjunctive_clause
           SUBTYPE OF (Complex_clause);
         
         END_ENTITY;
ENTITY Entity_assertion
           SUBTYPE OF (Fact_type);
         
         END_ENTITY;
ENTITY Enum_reference_prefix;
           prefix : STRING;
         
         END_ENTITY;
ENTITY Extent;
           variable_id : 
         OPTIONAL 
         STRING;
           source : STRING;
           query_expression : STRING;
           syntax : 
         OPTIONAL 
         expression_syntax;
         
         END_ENTITY;
ENTITY Fact_type
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (Entity_assertion,
                                Attribute_assertion));
           source : Extent;
           predicate_symbol : STRING;
         
         END_ENTITY;
ENTITY Forward_chaining_rule
           SUBTYPE OF (Rule_definition);
           premise : clause_select;
           conclusion : Literal_conjunction;
WHERE
           WR1: local_vars_of(SELF.conclusion) <= local_vars_of(SELF.premise);
         
         END_ENTITY;
ENTITY Func;
           func_sym : function_symbol;
           terms : LIST[0:?] OF term_select;
         
         END_ENTITY;
ENTITY Global_assignment;
           variable : Abstract_variable;
           val : term_select;
WHERE
           WR1: NOT(contains_variable(SELF.val));
         
         END_ENTITY;
ENTITY Ground_fact
           SUBTYPE OF (Atomic_formula);
WHERE
           WR1: SIZEOF(QUERY(r <* SELF\Atomic_formula.terms | contains_variable(r))) = 0;
         
         END_ENTITY;
ENTITY Literal_conjunction
           SUBTYPE OF (Simple_clause);
         
         END_ENTITY;
ENTITY Literal_disjunction
           SUBTYPE OF (Simple_clause);
         
         END_ENTITY;
ENTITY Row_value;
           values : LIST[0:?] OF term_select;
WHERE
           WR1: SIZEOF(QUERY(v <* SELF.values | contains_variable(v))) = 0;
           WR2: SIZEOF(QUERY(v <* SELF.values | 'PRODUCTION_RULE_ARM.ROW_VALUE' IN TYPEOF(v))) = 0;
         
         END_ENTITY;
ENTITY Row_variable
           SUBTYPE OF (Abstract_variable);
         
         END_ENTITY;
ENTITY Rule_action
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (Rule_submission,
                                Rule_adoption,
                                Rule_rejection,
                                Rule_supersedence,
                                Rule_creation,
                                Rule_expiration,
                                Rule_change_request,
                                Rule_request,
                                Rule_modification));
           subject_rule : Rule_version;
DERIVE
           subject_action_assignment : SET[0:?] OF Organization_or_person_in_organization_assignment := bag_to_set(QUERY(temp <* USEDIN ( SELF , 'PERSON_ORGANIZATION_ASSIGNMENT_ARM.' + 
         'ORGANIZATION_OR_PERSON_IN_ORGANIZATION_ASSIGNMENT.ITEMS' ) 
         | ( temp.role = 'subject action assignment')));
UNIQUE
           UR1: subject_rule, subject_action_assignment;
WHERE
           WR1: EXISTS (subject_action_assignment) AND (SIZEOF(subject_action_assignment) = 1 );
         
         END_ENTITY;
ENTITY Rule_adoption
           SUBTYPE OF (Rule_action);
         
         END_ENTITY;
ENTITY Rule_change_request
           SUBTYPE OF (Rule_action);
           change_reason : STRING;
         
         END_ENTITY;
ENTITY Rule_condition
           SUBTYPE OF (Atomic_formula);
           positive : BOOLEAN;
         
         END_ENTITY;
ENTITY Rule_creation
           SUBTYPE OF (Rule_action);
         
         END_ENTITY;
ENTITY Rule_definition
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (Forward_chaining_rule,
                                Back_chaining_rule))
           SUBTYPE OF (Rule_software_definition);
         
         END_ENTITY;
ENTITY Rule_expiration
           SUBTYPE OF (Rule_action);
           expiration_rationale : STRING;
         
         END_ENTITY;
ENTITY Rule_justification
           SUBTYPE OF (Rule_action);
           justified_action : Rule_action;
           justification_rationale : STRING;
WHERE
           WR1: SELF <> justified_action;
         
         END_ENTITY;
ENTITY Rule_modification
           SUBTYPE OF (Rule_action);
           modification_rationale : Rule_change_request;
         
         END_ENTITY;
ENTITY Rule_priority;
           priority : INTEGER;
           prioritized_rule : Rule_definition;
WHERE
           WR1: priority >= 0;
         
         END_ENTITY;
ENTITY Rule_product
           SUBTYPE OF (Software);
         
         END_ENTITY;
ENTITY Rule_rejection
           SUBTYPE OF (Rule_action);
           rejection_reason : STRING;
         
         END_ENTITY;
ENTITY Rule_request
           SUBTYPE OF (Rule_action);
         
         END_ENTITY;
ENTITY Rule_set
           SUBTYPE OF (Rule_software_definition);
           conflict_resolution_strategy : 
         OPTIONAL 
         STRING;
           rule_member : SET[1:?] OF Rule_priority;
DERIVE
           engine : SET[1:1] OF Document_definition := get_document_definition(SELF, 'engine', 
         		'SPECIFICATION_DOCUMENT_ARM.LANGUAGE_REFERENCE_MANUAL');
INVERSE
           purpose : Identification_assignment FOR items;
WHERE
           WR1: purpose.role = 'purpose';
         
         END_ENTITY;
ENTITY Rule_set_group
           SUBTYPE OF (Rule_software_definition);
           elements : SET[2:?] OF Rule_set;
         
         END_ENTITY;
ENTITY Rule_software_definition
           SUPERTYPE OF 
         (ONEOF (Rule_definition,
                       Rule_set_group,
                       Rule_set))
           SUBTYPE OF (Software_definition);
           SELF\Product_view_definition.defined_version : Rule_version;
         
         END_ENTITY;
ENTITY Rule_submission
           SUBTYPE OF (Rule_action);
           submission_rationale : STRING;
         
         END_ENTITY;
ENTITY Rule_supersedence
           SUBTYPE OF (Rule_action);
           superseded_rule : Rule_version;
         
         END_ENTITY;
ENTITY Rule_version
           SUBTYPE OF (Software_version);
           SELF\Product_version.of_product : Rule_product;
INVERSE
           management_action : SET[1:?] OF Rule_action FOR subject_rule;
           product_definition : SET[1:?] OF Rule_software_definition FOR defined_version;
         
         END_ENTITY;
ENTITY Scalar_variable
           SUBTYPE OF (Abstract_variable);
         
         END_ENTITY;
ENTITY Simple_clause
           ABSTRACT SUPERTYPE
         
         OF (ONEOF (Literal_conjunction,
                                Literal_disjunction));
           formulas : LIST[1:?] OF Rule_condition;
         
         END_ENTITY;
ENTITY Symbol
           SUBTYPE OF (Representation_item);
UNIQUE
           UR1: SELF\Representation_item.name;
         
         END_ENTITY;
RULE max_one_entity_prefix FOR 
         (Enum_reference_prefix);
WHERE
           WR1: SIZEOF(QUERY(x <* Enum_reference_prefix | TRUE)) <= 1;
         END_RULE;
         
RULE rule_software_definition_constraint FOR 
         (Product_view_definition);
WHERE
           WR1: SIZEOF (QUERY ( pvd <* Product_view_definition | ( NOT('PRODUCTION_RULE_ARM.' + 'RULE_SOFTWARE_DEFINITION' 
            IN TYPEOF(pvd))) 
            AND ('PRODUCTION_RULE_ARM.' + 'RULE_VERSION' IN TYPEOF (pvd . defined_version)))) = 0;
         END_RULE;
         
RULE rule_version_constraint FOR 
         (Product_version);
WHERE
           WR1: SIZEOF (QUERY(pv <* Product_version | (NOT('PRODUCTION_RULE_ARM.' + 'RULE_VERSION' IN TYPEOF(pv))) 
            AND ( 'PRODUCTION_RULE_ARM.' + 'RULE_PRODUCT' IN TYPEOF(pv.of_product)))) = 0;
         END_RULE;
         
FUNCTION contains_variable
 (x : term_select) : BOOLEAN;
         IF ('PRODUCTION_RULE_ARM.ABSTRACT_VARIABLE' IN TYPEOF(x)) THEN RETURN (TRUE);
      ELSE IF (('PRODUCTION_RULE_ARM.FUNC' IN TYPEOF(X)) AND
              (SIZEOF(QUERY(y <* x.terms | contains_variable(y))) > 0)) 
              THEN RETURN (TRUE);
              ELSE RETURN (FALSE);
           END_IF;
  END_IF;
         END_FUNCTION;
         
FUNCTION local_vars_aux
 (thing : GENERIC; accum : SET[0:?] OF Scalar_variable) : SET[0:?] OF Scalar_variable;
         LOCAL i,j,k : INTEGER; END_LOCAL;
  IF (('PRODUCTION_RULE_ARM.ABSTRACT_VARIABLE' IN TYPEOF(thing)) AND 
      ('PRODUCTION_RULE_ARM.RULE_DEFINITION' IN (TYPEOF(thing.scope))))
   THEN accum := accum + thing;
   ELSE IF ('PRODUCTION_RULE_ARM.RULE_CONDITION' IN TYPEOF(thing))
        THEN REPEAT i := 1 TO HIINDEX(thing\Atomic_formula.terms);
                accum := local_vars_aux(thing\Atomic_formula.terms[i],accum);
             END_REPEAT;
        ELSE IF ('PRODUCTION_RULE_ARM.SIMPLE_CLAUSE' IN TYPEOF(thing))
             THEN REPEAT j := 1 TO HIINDEX(thing.formulas);
                        accum := local_vars_aux(thing.formulas[j],accum);
                  END_REPEAT;
             ELSE IF ('PRODUCTION_RULE_ARM.COMPLEX_CLAUSE' IN TYPEOF(thing))
                  THEN REPEAT k := 1 TO HIINDEX(thing.clauses);
                        accum := local_vars_aux(thing.clauses[k],accum);
                       END_REPEAT;
                  END_IF;
             END_IF;
        END_IF;
  END_IF;
  RETURN(accum);
         END_FUNCTION;
         
FUNCTION local_vars_of
 (thing : GENERIC) : SET[0:?] OF Scalar_variable;
         LOCAL
    accum : SET [0:?] OF Scalar_variable := [];
  END_LOCAL;
  RETURN (local_vars_aux(thing, accum));
         END_FUNCTION;
         
         END_SCHEMA;  -- Production_rule_arm
© ISO 2019 — All rights reserved