Здесь вспомогательная переменная N не входит в φ, B, n или S. Смысл
этого правила заключается в том, что N является стартовым значением
n, и на каждой итерации значение n уменьшается, но остается
неотрицательным. Эта конструкция в точности ликвидирует
бесконечные вычисления, так как n не может уменьшаться бесконечно
часто без нарушения условия n ≥ 0. Переменная n называется
вариантой.
Формальная верификация параллельных систем
Пусть для операторов S
1
и S
2
конструкция S
1
|| S
2
обозначает
параллельную композицию этих операторов. Основным для
применения формальной верификации к параллельным программам
является следующее правило вывода:
12
12
,
||
S ' S '
' S S '
.
Это правило позволяет верифицировать параллельные системы тем же
путем, что и последовательные, рассматривая части программ по
отдельности. Ввиду взаимодействия между S
1
и S
2
хотя бы за счет
доступа к разделяемым переменным или обмена сообщениями, это
правило, к сожалению, в общем случае неверно. Много усилий было
приложено к получению правил вывода описанной формы [14].
Существует несколько причин, почему достичь этого непросто.
Введение параллелизма по существу приводит к введению
недетерминизма. Это означает, что для параллельных программ,
которые взаимодействуют путем использования разделяемых
переменных, поведение на входе-выходе существенно зависит от
порядка, в котором к этим общим переменным получен доступ.
Например, если S
1
– это x := x + 2, S
2
– это x := x + 1; x := x + 1 и S
3
–
это x := 0, значение x после выполнения S
1
|| S
3
может быть 0 или 2, а
значение x после выполнения S
2
|| S
3
может быть 0, 1 или 2. Различные
значения для x зависят от порядка выполнения операторов в S
1
и S
3
или S
2
и S
3
. Более того, несмотря на то, что входное-выходное
поведение S
1
и S
2
идентично (увеличение x на 2), нет никакой
гарантии, что это будет верно в параллельном контексте.
Параллельные процессы потенциально могут взаимодействовать в
любой момент их исполнения, а не только в начале вычисления. Если
требуется сделать вывод о том, как параллельные программы
взаимодействуют, недостаточно знать свойства их стартовых и
финальных состояний. Необходимо также уметь формировать
суждения о том, что происходит во время вычисления. Таким образом,
свойства должны ссылаться не только на стартовые и финальные
состояния, но и на сами вычисления.