ГОСТ Р ИСО 10303-11 — 2009
(* Собираются строки всех типов для экземпляров FOR в один набор. *)
REPEAT i:=1 ТО number_of_input_instances;
set_of_input_types := set_of_input_types + TYPEOF(all_instances [ i]);
END_REPEAT;
WHERE
WR1: dependently_instantiated(all_instances. set_of_input_types. previous_in_chain);
END_RULE;
FUNCTION dependently_instantiated(
set_ofJnputJnstances : SET OF GENERIC:igen;
set_of_input_types :SET OF STRING;
previous_in_chain ; LIST OF GENERIC:cgen): BOOLEAN;
(‘Функция "dependentlyjnstantiated" предназначена для проверки, на все ли экземпляры в исходном
set_ofJnput_inetancee имеются ссылки от независимо реализуемых экземпляров. Если да. то функ
ция возвращает значение true. Set_of_input_types содержит строки типов для всех исходных экземп
ляров. Экземпляры в previous_in_chain используются для выявления циклических ссылок при рекур
сивном вызове данной функции. Параметр содержит список уже проверенных экземпляров в цепочке
ссылок.
INTEGER;
INTEGER;
BAG OF GENERIC:igen := (];
BOOLEAN;
LIST OF GENERIC:cgen := [ ];
BOOLEAN ;= true:
SET OF STRING :=[];
*)
LOCAL
number_of_input_instances
number_ofjefemngJnstances
bag_of_referring_insta nces
dependently_instantiated_flag
previous_in_chain_plus
result
set_of_types
END_LOCAL;
IF EXISTS(set_of_input_instances) THEN
number_of_inputJnstances := SIZEOF(set_of_input_instances):
(* Объявленный тип bag_of_referring_instances добавляется к множеству типов импортированных
посредством оператора REFERENCE экземпляров для последующего сравнения подмножеств.
*)
set_of_input_types := set_of_input_types ♦ ’ GENERIC
REPEAT i:=1 TO number_ofJnputJnstances;
(’ Определяются все ссылки на текущий исходный экземпляр. *)
bag_of_referringJnstances := USEDIN (set_ofJnputJnstances [ i ] .’
IF EXISTS(bag_of_referringJnstances) THEN
number_of_referringJnstances := SIZEOF(bag_of_referring_instances);
dependentlyjnstantiatedJlag := false;
REPEAT j:=1 TO number_of_referringJnstances;
(* Определяются строки типов текущего ссылающегося экземпляра.
*)
set_ofJypes := TYPEOF(bag_of_referring_instances [ j ]);
(* Если ссылающийся экземпляр принадлежит к одному из типов только зависимо реализуе
мых выбираемых элементов, то текущий исходный экземпляр еще может быть недопустимо
реализован. В противном случае все в порядке, и проверяется следующий исходный экземп
ляр.
‘)
IF set_ofJypes <= set_of_input_types THEN — оператор подмножества
(‘ Ссылающийся экземпляр принадлежит к одному из ограниченных типов. Однако на него
самого может ссылаться допустимый экземпляр: тогда текущий экземпляр также мог бы
быть допустимым.
Таким образом, осуществляется рекурсивный вызовданной функции со ссылающимся эк
земпляром в качестве входного параметра.
Чтобы избежать бесконечного цикла в случае, когда множество экземпляров ссылается
друг на друга в замкнутом цикле, сначала проверяется, присутствует ли текущий ссылаю
щийся экземпляр в списке уже обработанных элементов цепочки.
*>
IF NOT (bag_of_referringJnstances (j ] IN previousJn_chain) THEN
previousJn_chain_plus := previousJn_chain ♦
set_ofJnputJnstances [ i ];
IF dependentlyJnstantiated([bag_ofjeferringJnstances [j ]],
setj>fjnputJypes,
previousJn_chain_plus) THEN
161