<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>МЕТОД ИЗВЛЕЧЕНИЯ ЛОГИКИ ПОВЕДЕНИЯ ИЗ ПРОМЫШЛЕННОГО ПРОГРАММНОГО КОДА НА ЯЗЫКЕ КОБОЛ</article-title>
      </title-group>
      <pub-date>
        <year>2016</year>
      </pub-date>
      <fpage>17</fpage>
      <lpage>25</lpage>
      <abstract>
        <p>Цель работы - разработка комплекса инструментальных средств для автоматизации анализа и упрощения понимания поведения кода программных систем. Предложены методы трансляции, абстракции, отладки и построения тестов для языка Кобол. Разработана экспериментальная система, реализующая предложенные методы. Ключевые слова: трансляция, Кобол, моделирование, абстракция, генерация тестов, отладка. Мета роботи - розробка комплексу інструментальних засобів для автоматизації аналізу та спрощення розуміння поведінки коду програмних систем. Запропоновано методи трансляції, абстракції, відлагодження та побудови тестів для мови Кобол. Розроблено експериментальну систему, яка реалізує запропоновані методи. Ключові слова: трансляція, Кобол, моделювання, абстракція, генерація тестів, відлагодження. The purpose of this work is to develop a software tool for analysis automation and simplifying of understanding of software systems behavior. Methods for translation, abstraction, debugging and test generation for COBOL are proposed. We developed a software system, which implements the methods.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>Формальная модель</p>
      <p>
        Для применения формальных методов преобразований и проверки достижимости мы используем
модель атрибутной транзиционной системы, в которой переходы представлены тройками вида (t,α ,β ) , где t
– имя перехода, α – его предусловие, а β – постусловие [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. Предусловием служит формула предикатов
первого порядка, в постусловии выполняются присваивания атрибутам модели. Семантика переходов
аналогична охраняемым командам Дейкстры [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]: если в некотором состоянии s предусловие перехода t
истинно, то модель может выполнить этот переход и перейти в новое состояние s′ = t(s) , которое отличается
от предыдущего значениями тех атрибутов, которым было выполнено присваивание новых значений в
постусловии. Для задания потока управления используется UCM (Use-Case Maps). Это язык высокого уровня,
который позволяет разрабатывать и изучать модели систем со сложной структурой и поведением. UCM
связывает поведение системы с ее архитектурой в формальной и визуальной форме. Описание модели на
UCM представляется множеством карт, которые состоят из конечного множества путей. Пути содержат
вершины и определяют порядок их прохождения. Вершины могут быть конструктами разных типов, которые
используются для задания начала и конца путей, альтернатив, последовательный и параллельных
композиций, соединения путей, таймеров, прерываний и их обработки. UCM модель можно представить
четверкой &lt; U, S, E, R &gt; , где U – множество ее элементов; S ⊆ U – множество стартовых точек; E ⊆ U –
множество конечных точек; R ⊆ U × U – отношение переходов, которое определяет достижимость одной
вершины из другой. Язык UCM был рекомендован для разработки моделей программных систем
Международным Телекоммуникационным Союзом в 2008 году и имеет стандарт Z151 [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. Формальная
семантика языка описывается в работе [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ].
Трансляция
      </p>
      <p>Построение UCM основано на использовании знаний о зависимостях исходной программы (PDG), при
этом выполняются: автоматическое преобразование процедур в соответствующие карты UCM диаграмм;
преобразование «goto» операторов в пути между картами; трансляция структур данных, заданных в Procedure
Division, Data Division, Copy-books; удаление данных, которые отсутствуют в условиях и сигналах; удаление
заведомо недостижимого кода; разворачивание REDEFINE операторов; преобразование CICS операторов в
сигналы; преобразование SQL выражений в сигналы.</p>
      <p>Для анализа и моделирования программ строится граф потока управления (CFG) с сохранением
структуры исходного кода. Он представляется древовидной структурой данных, которая для удобства
записывается в формате JSON, который включает в себя объекты следующих типов: «start» – начальная точка
потока управления; «return» – оператор возврата; «decision» – разветвление потока управления, имеет
вложенный массив объектов, каждый из которых соответствует ветке (branch) потока управления; «branch» –
условие ветки потока управления; «assignment» – выражение с присваиванием; «call» – вызов программы или
процедуры; «readevent» – оператор чтения (из файла, терминала, т. д.); «writeevent» – оператор записи (в
файл, терминал, т. д.); «goto» – оператор безусловного перехода к произвольной точке программы; «attribute»
– определение переменной в программе. Также строится соответствие строкам исходного кода.</p>
      <p>Выражения преобразуются в абстрактное синтаксическое дерево (AST), которое представляется как
массив объектов. Первый объект всегда строка, определяющая оператор или терминальный символ.
Остальные объекты могут быть как строками для задания терминалов, так и массивами объектов для
вложенных AST.</p>
      <p>Ниже представлены приоритеты операторов в убывающем порядке:
"[ ]" – обращение к элементу массива;
" " – вызов функции (скобки);
"-", "!" – унарный минус и отрицание;
"*", "/" – арифметические операции;
"+", "-" – арифметические операции;
"&lt;", "&gt;", "&lt;=", "&gt;=", "==", "!=" – операции сравнения;
"&amp;&amp;" – конъюнкция (логическое И);
"||" – дизъюнкция (логическое ИЛИ);
"," – запятая, разделяющая параметры в вызове функции;
":=" – присваивание.</p>
      <p>Бинарные операторы имеют правостороннюю ассоциативность, кроме бинарного минуса и деления – они
левосторонние.</p>
      <p>AST не зависит от языка исходного кода и может содержать любые неспецифицированные операторы,
как например, конкатенация строк. Так как в большинстве случаев такие операторы не влияют на логику
программы, то можно от них абстрагироваться, заменив недетерминированными присваиваниями, тем самым</p>
      <p>Рис.1. Синтаксис описания данных в языке Кобол
Номера уровней (level-number) от 01 до 50 задают иерархию. Переменная является структурой и
содержит все переменные, объявленные ниже с более высоким уровнем до конца секции или до переменной с
тем же или более низким уровнем. Есть специальные уровни:</p>
      <p>− уровень 66 используется для задания альтернативного имени data-name-1 области памяти,
содержащей заданную переменную data-name-2 или все переменные от data-name-2 до data-name-3;
− уровень 77 обозначает независимую переменную без возможности дальнейшего разбиения;
− уровень 88 не определяет переменных, а используется для сравнения переменной, определенной
перед 88 уровнем, с заданным значением или множеством значений.
Тип любой переменной может быть числовым, буквенным или буквенно-цифровым. Последние два будем
называть строковыми.</p>
      <p>Для построения формул исчисления предикатов первого порядка необходимо преобразовать данные
исходного языка в переменные перечислимых типов, целочисленные или булевские переменные. Разные
уровни иерархии (поля структур) приводятся к простым переменным путем переименования. Строковые
переменные преобразуются в переменные перечислимых типов по следующему алгоритму:
1. По всему исходному коду собираются пары переменных, связанных операторами, требующими
строго соответствия типов (присваивание, сравнение), а также встречающиеся значения всех переменных.</p>
      <p>2. Из собранных пар, по транзитивности строятся группы переменных, обязанных иметь один и тот же
тип, а собранные значения этих переменных формируют элементы этого типа.
Такое преобразование сохраняет свойства достижимости исходного кода в абстрактной модели, если
отсутствуют операции над строками.</p>
      <p>Трансляция данных для 77-го уровня тривиальна. 88-й уровень преобразовывается двумя способами:
1. Если значения в разных именах 88-го уровня для одной переменной не пересекаются, то все
вхождения этих значений в модели заменяются на соответствующие имена, которые и составляют
перечислимый тип.
параметром перечислимого типа, построенного как в предыдущем пункте. Это позволяет иметь истинное
значение переменной одновременно для нескольких имен 88-го уровня.</p>
      <p>Дополнительные сложности возникают при несоблюдении типов, т. е. записи строковых значений в
числовые переменные и наоборот, что вполне допускается в языке Кобол. Однако семантика операций над
переменными, имеющими значения несоответствующего типа, не определена. Для обработки таких
ситуаций мы генерируем сразу 3 переменных: целочисленная, перечислимого типа и переменная-флаг,
сохраняющая информацию о том, какая из двух предыдущих модифицировалась последней. А при каждом
чтении оригинальной переменной (т. е. одной из сгенерированных с учетом типа) также проверяется флаг,
и в случае несоответствия выполняется обработка ошибки (сообщение пользователю или соответствующая
трасса).</p>
      <p>Некоторые системы трансляции языка Кобол выполняют преобразования области данных
Коболпрограммы в один массив памяти, а доступ к каждой переменной заменяют на ряд доступов к
соответствующим элементам этого массива (побайтно). Такой подход может быть эффективным для
одноразовой автоматической трансляции, но к сожалению, не пригоден для случая, когда требуется
дальнейшая модификация результирующего кода и совсем неприемлем для извлечения логики.</p>
      <p>Далее мы предлагаем рассмотреть методы преобразований и абстракций на сквозном примере,
исходный текст кода которого показан на рис. 2. Граф зависимости для этой программы показан на рис. 3.</p>
      <p>На рис. 4, а и 4, б изображен UCM, который автоматически построен из программы. Заметим, что
строки 11 и 28 удалены ввиду того, что атрибут Q не используется в условиях и сигналах.
01. IDENTIFICATION DIVISION.
02. PROGRAM-ID. Example initial.
03. DATA DIVISION.
04. WORKING-STORAGE SECTION.
05. 01 BUTTON-RECORD.
06. 05 S PIC 9(16).
07. 05 KEYV PIC X(16).
08. 01 RESULT PIC X(16).
09. 01 X PIC 9(7) VALUE 'UNKNOWN'.
10. 01 Z PIC X(16).
11. 01 Q PIC 9(16).
12. 01 U PIC 9(16).
13. 01 FORM-RECORD.
14. 05 LOGIN PIC X(16).
15. 05 PASS PIC X(16).
16. PROCEDURE DIVISION.
17. EXEC CICS
18. READ FILE ('F')
19. INTO (BUTTON-RECORD)
20. END-EXEC.
21. IF EIBCALEN &gt; ZERO
22. MOVE S TO U
23. ELSE
24. MOVE 'ABORT' TO RESULT
25. EXIT
26. END-IF.</p>
      <p>27. IF S &gt; 0 THEN
28. MOVE 1 TO Q
29. IF KEYV = 'M' THEN
30. MOVE 'MODERATOR' TO Z
31. ELSE
32. MOVE 'USER' TO Z
33. END-IF
34. IF U = 0 THEN
35. MOVE Z TO X
36. END-IF
37. ELSE
38. PERFORM 0000-AUTH
39. IF RESULT = 'OK' THEN
40. MOVE 'ADMIN' TO X
41. ELSE
42. MOVE 'INTRUDER' TO X
43. END-IF
44. END-IF.
45. EXEC CICS
46. SEND TEXT FROM (X)
47. END-EXEC.
48. STOP RUN.
49. 0000-AUTH.
50. EXEC CICS READ
51. FILE ('FORM')
52. INTO (FORM-RECORD)
53. END-EXEC.
54. IF LOGIN NOT EQUAL 'admin' THEN
55. MOVE 'FAILED' TO RESULT
56. ELSE
57. IF PASS NOT EQUAL 'admin' THEN
58. MOVE 'FAILED' TO RESULT
59. END-IF
60. END-IF.</p>
      <p>Рис. 2. Исходный код на языке Кобол
Рис. 3. Граф зависимостей в программе
Статический срез</p>
      <p>Исходная модель может быть очень большой. Извлечение логики может потребовать сильных
огрублений. Но можно рассматривать поведение «по частям», например, организовав разбиение по принципу
входных и выходных сигналов, исследуя их по отдельности. Так, задав множество интересующих сигналов,
можно статически идентифицировать место их вхождения в коде и использовать технику слоев. Например,
для выходных сигналов использовать обратные срезы, а для входных – прямые. Таким образом, можно
восстановить логику зависимости выходных сигналов от входных. При этом размер кода будет существенно
уменьшен. Так же можно прибегнуть к технике частичных вычислений. В результате построения обратного
статического среза для строки 46 будет удалена строка 24.
Абстракция процесса вычислений</p>
      <p>Часто код описывает довольно громоздкий анализ некоторых входных параметров, в результате
которого вычисляется некое результирующее значение. Во многих случаях можно выделить процесс
вычисления и исследовать его отдельно, а в общей схеме поведения, в целях уменьшения размера описания
логики поведения, заменить его недетерминированным присваиванием, таким образом, абстрагироваться от
загромождающих деталей. Интуитивно, достаточным условием корректности такой абстракции будет
нарушение связности DEF-USE графа при удалении ребра, соединяющего процесс вычисления с
результатом. На рис. 5 показан результат применения такого типа абстракции для строки 46.</p>
      <p>Рис. 5. Абстракция вычисления значения атрибута RESULT
На этом этапе удалены строки 49–60, строка 38 заменена строкой 38а, в которой используется оператор
NONDET, обозначающий недетерминированный выбор.
Анализ достижимости</p>
      <p>
        Как известно, статические методы преувеличивают фактические информационные связи [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ], как
следствие, некоторые несущественные для логики поведения участки кода могут остаться. Их можно
удалить, прибегнув к использованию методов проверки достижимости. В нашем примере строка 35
недостижима, и после ее удаления и повторного выполнения процедуры обратного статического среза
строки 29–33 будут удалены как несущественные (см. рис. 6). Таким образом, повтор процедуры
статического среза после анализа достижимости может устранить зависимости, обусловленные
недостижимыми переходами.
      </p>
      <p>Недостижимым код может оказаться не только вследствие ошибки, но и после выполнения частичных
вычислений, когда удаляются участки кода, не удовлетворяющие некоторому заданному условию. При этом
некоторый код, подлежащий удалению, может остаться из-за того, что некоторые зависимости или условия
не удалось разрешить статически.</p>
      <p>Отметим полезную функциональность разработанной системы – оперативное выделение всех
DEFUSE ветвей для заданного атрибута в заданной точке, причем с информацией об их достижимости. На базе
этой функции реализован режим объяснения причин недостижимости. В этом режиме будут построены (и
выделены на UCM специальной подсветкой) участки путей от последнего присваивания атрибуту, значение
которого не удовлетворяет формуле предусловия недостижимого перехода, к самому переходу.</p>
      <p>
        Следует иметь ввиду, что даже при условии конечности множества состояний модели, анализ
достижимости может оказаться весьма трудоемким процессом ввиду так называемого эффекта
комбинаторного взрыва [
        <xref ref-type="bibr" rid="ref11 ref12">11, 12</xref>
        ]. Поэтому приступать к этой процедуре лучше после применения статических
абстракций, которые часто сокращают исходный размер на порядки.
Рис. 6. Результат повторного статического среза
Результирующий код показан на рис. 7 и выглядит таким образом:
01. IDENTIFICATION DIVISION.
02. PROGRAM-ID. Example reduced.
03. DATA DIVISION.
04. WORKING-STORAGE SECTION.
05. 01 BUTTON-RECORD.
06. 05 S PIC 9(16).
08. 01 RESULT PIC X(16).
09. 01 X PIC 9(7) VALUE 'UNKNOWN'.
16. PROCEDURE DIVISION.
17. EXEC CICS
18. READ FILE ('F')
19. INTO (BUTTON-RECORD)
20. END-EXEC.
21. IF EIBCALEN &gt; ZERO
22. MOVE S TO U
23. ELSE
25. EXIT
26. END-IF.
      </p>
      <p>27. IF S &gt; 0 THEN
27a. CONTINUE
37. ELSE
38a.
39.
40.
41. ELSE
42. MOVE 'INTRUDER' TO X
43. END-IF
44. END-IF.</p>
      <p>MOVE NONDET{OK,FAILED} TO RESULT
IF RESULT = 'OK' THEN</p>
      <p>MOVE 'ADMIN' TO X
45. EXEC CICS
46. SEND TEXT FROM (X)
47. END-EXEC.</p>
      <p>48. STOP RUN.</p>
      <p>Рис. 7. Результирующий код после повторного статического среза</p>
      <p>UCM сценарий, получившийся в результате описанных преобразований и абстракций описывает
логику поведения модели, ведущего к интересующей точке (в нашем примере, к 46-й строке кода).
Аналогично, можно исследовать влияние некоторой точки на последующее поведение, используя прямые
срезы и абстракции.
Генерация тестов</p>
      <p>
        При выполнении миграции на другую платформу возникает проблема проверки адекватности новой
реализации. Одним из методов, широко применяемых на практике для этих целей, является тестирование. В
условиях отсутствия спецификаций на исходную реализацию, актуальной становится задача порождения
тестовых наборов. Некоторые подходы предлагают осуществлять запуск старой программы и фиксировать
реакцию на различные входы вручную, однако такой подход не эффективен для больших систем. Мы
предлагаем автоматическую генерацию тестовых сценариев на основе анализа кода. Так, построив
формальную модель UCM, применяем существующие методы анализа достижимости, которые в процессе
обхода поведения модели способны [
        <xref ref-type="bibr" rid="ref11 ref13">11, 13</xref>
        ] генерировать трассы (последовательности событий), которые
представляют собой тестовые сценарии в виде Message Sequence Chart, после чего метод конкретизации [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]
транслирует такие сценарии в исполнимые тесты. Проблемы комбинаторного взрыва и качества покрытия
при генерации трасс заслуживают отдельного рассмотрения. Методы [
        <xref ref-type="bibr" rid="ref10 ref11 ref12 ref13">10–13</xref>
        ] эффективно строят классы
эквивалентности для различных путей выполнения программ на основе статического [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] и динамического
[
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] анализа информационной зависимости, значительно сокращая перебор вариантов поведения, достигая
при этом покрытия DEF-USE ветвей.
Примеры использования
      </p>
      <p>Разработанный программный комплекс был успешно применен в ряде промышленных проектов. Далее
представлена сводная таблица статистики.</p>
      <p>Отметим, что операционное время, затраченное созданным программным комплексом на получение
указанных результатов, исчисляется секундами. Такая производительность позволяет использовать
инструментарий интерактивно в режиме реального времени, что очень востребовано при анализе поведения
больших объемов программного кода.
Таблица. Статистика применения</p>
      <p>Проект (домен)
№ 1 (лизинг)
№ 2 (страхование)
№ 3 (финансы)</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Cosentino</surname>
            <given-names>V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Cabot</surname>
            <given-names>J.,</given-names>
          </string-name>
          <article-title>and oth. Extracting Business Rules from COBOL: A Model-</article-title>
          Based Tool // Working Conference on Reverse Engineering, Koblenz, Germany. -
          <year>2013</year>
          . - P.
          <fpage>483</fpage>
          -
          <lpage>484</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Hajnal</surname>
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Forgacs</surname>
            <given-names>I.</given-names>
          </string-name>
          <article-title>A demand-driven approach to slicing legacy COBOL systems // Journal of software: evolution and process</article-title>
          . - Vol.
          <volume>24</volume>
          . - P.
          <fpage>67</fpage>
          -
          <lpage>82</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Ning</surname>
            <given-names>J.Q.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Engberts</surname>
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kozaczynski</surname>
            <given-names>W</given-names>
          </string-name>
          . Automated support for legacy code understanding // Communs ACM -
          <year>1994</year>
          . - Vol.
          <volume>38</volume>
          . - P.
          <fpage>50</fpage>
          -
          <lpage>57</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Jones</surname>
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gomard</surname>
            <given-names>C.</given-names>
          </string-name>
          , and Sestoft P.
          <article-title>Partial Evaluation and AutomaticProgram Generation</article-title>
          . Prentice Hall International -
          <year>1993</year>
          . - 415 p.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Letichevsky</surname>
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Godlevsky</surname>
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Letychevskyy</surname>
            <given-names>O</given-names>
          </string-name>
          .
          <article-title>(jr</article-title>
          .),
          <string-name>
            <surname>Potiyenko</surname>
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Peschanenko</surname>
            <given-names>V</given-names>
          </string-name>
          .
          <article-title>Properties of VRS predicate transformer // Cybernetics</article-title>
          and
          <string-name>
            <given-names>System</given-names>
            <surname>Analysis</surname>
          </string-name>
          .
          <article-title>-</article-title>
          <year>2010</year>
          . - Vol.
          <volume>46</volume>
          . - P.
          <fpage>521</fpage>
          -
          <lpage>532</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Dijkstra</surname>
            <given-names>E.</given-names>
          </string-name>
          <article-title>Guarded commands, nondeterminacy and formal derivation of programs // Communications of the ACM</article-title>
          .
          <article-title>-</article-title>
          <year>1975</year>
          . - Vol.
          <volume>18</volume>
          . -
          <fpage>№</fpage>
          8. - P.
          <fpage>453</fpage>
          -
          <lpage>457</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>ITU-T Recommendation</surname>
          </string-name>
          Z.
          <volume>151</volume>
          .
          <article-title>User requirements notation (URN</article-title>
          ),
          <volume>10</volume>
          /
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Guba</surname>
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shushpanov</surname>
            <given-names>K.</given-names>
          </string-name>
          <article-title>Insertion semantics of flat multithreaded models</article-title>
          of UCM // USIM. -
          <year>2012</year>
          . -
          <fpage>№</fpage>
          6. - P.
          <fpage>15</fpage>
          -
          <lpage>22</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Vale</surname>
            <given-names>M.</given-names>
          </string-name>
          <article-title>The evolving algebra semantics of Cobol. Part 1: programs and control</article-title>
          .
          <source>Technical Report CSE-TR-162-93</source>
          , EECS Dept., University of Michigan.
          <article-title>-</article-title>
          <year>1993</year>
          . - 29 P.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Kolchin</surname>
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Letychevskyy</surname>
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Potiyenko</surname>
            <given-names>S.</given-names>
          </string-name>
          <article-title>A static method for elimination of redundant dependencies in preconditions of transitions of formal models of transition systems</article-title>
          .
          <source>- 2015</source>
          .
          <article-title>- N 1-2</article-title>
          . - P.
          <fpage>127</fpage>
          -
          <lpage>136</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Kolchin</surname>
            <given-names>A. V.</given-names>
          </string-name>
          <article-title>An automatic method for the dynamic construction of abstractions of states of a formal model // Cybernetics and system analysis</article-title>
          .
          <source>- 2010</source>
          . -
          <fpage>№</fpage>
          4. - P.
          <fpage>70</fpage>
          -
          <lpage>90</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Kolchin</surname>
            <given-names>A. V.</given-names>
          </string-name>
          <article-title>A method for reduction of analyzed behavior space during verification of formal models of distributed software systems // Artificial intelligence</article-title>
          .
          <source>- 2013</source>
          . -
          <fpage>№</fpage>
          4. - P.
          <fpage>113</fpage>
          -
          <lpage>126</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Kolchin</surname>
            <given-names>A.V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kotlyarov</surname>
            <given-names>V.P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Drobintsev</surname>
            <given-names>P.D.</given-names>
          </string-name>
          <article-title>Method of test scenario generation in insertion modeling environment // Control systems</article-title>
          and machines. -
          <source>2012</source>
          .
          <article-title>- N 6</article-title>
          . - P.
          <fpage>43</fpage>
          -
          <issue>48</issue>
          ,
          <fpage>63</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Drobintsev</surname>
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kolchin</surname>
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kotlyarov</surname>
            <given-names>V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Letichevsky</surname>
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Peschanenko</surname>
            <given-names>V.</given-names>
          </string-name>
          <article-title>An approach to creating concretized test scenarios within test automation technology for industrial software projects // Automatic Control</article-title>
          and
          <string-name>
            <given-names>Computer</given-names>
            <surname>Sciences</surname>
          </string-name>
          .
          <article-title>-</article-title>
          <year>2013</year>
          . - Vol.
          <volume>47</volume>
          (
          <issue>7</issue>
          ). - P.
          <fpage>433</fpage>
          -
          <lpage>442</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          http://orcid.org/0000-0003-0482-5678, Колчин Александр Валентинович,
          <article-title>кандидат физико-математических наук, старший научный сотрудник</article-title>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          http://orcid.org/0000-0001-
          <fpage>7809</fpage>
          -536X,
          <article-title>Потиенко Степан Валериевич, кандидат физико-математических наук, старший научный сотрудник</article-title>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          http://orcid.org/0000-0001-
          <fpage>9462</fpage>
          -599X.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>