Свойства выполнения компьютерной программы, особенно для параллельных и распределенных систем , давно сформулированы путем задания свойств безопасности («плохие вещи не случаются») и свойств жизнеспособности («хорошие вещи случаются»). [1]
Программа полностью корректна относительно предусловия и постусловия, если любое выполнение, начатое в состоянии, удовлетворяющем , завершается в состоянии, удовлетворяющем . Полная корректность является конъюнкцией свойства безопасности и свойства жизнеспособности: [2]
Обратите внимание, что плохая вещь дискретна, [3], поскольку она происходит в определенном месте во время выполнения. «Хорошая вещь» не обязательно должна быть дискретной, но свойство жизнеспособности завершения дискретно.
Формальные определения, которые в конечном итоге были предложены для свойств безопасности [4] и свойств жизнеспособности [5], продемонстрировали, что эта декомпозиция не только интуитивно привлекательна, но и является полной: все свойства исполнения являются совокупностью свойств безопасности и жизнеспособности. [5] Более того, проведение декомпозиции может быть полезным, поскольку формальные определения позволяют доказать, что для проверки свойств безопасности и свойств жизнеспособности должны использоваться разные методы. [6] [7]
Свойство безопасности запрещает дискретные плохие вещи , происходящие во время казни. [1] Таким образом, свойство безопасности характеризует то, что разрешено, устанавливая то, что запрещено. Требование, чтобы плохая вещь была дискретной, означает, что плохая вещь , происходящая во время казни, обязательно происходит в какой-то идентифицируемой точке. [5]
Примеры отдельных плохих вещей , которые можно использовать для определения свойства безопасности, включают: [5]
Выполнение программы можно описать формально, указав бесконечную последовательность состояний программы, которая возникает в ходе выполнения, где последнее состояние завершающейся программы повторяется бесконечно. Для интересующей программы пусть обозначает множество возможных состояний программы, обозначает множество конечных последовательностей состояний программы и обозначает множество бесконечных последовательностей состояний программы. Соотношение справедливо для последовательностей и тогда и только тогда , когда является префиксом или равно . [5]
Свойством программы является набор разрешенных выполнений.
Основная характеристика свойства безопасности : Если некоторое выполнение не удовлетворяет , то определяющая плохая вещь для этого свойства безопасности происходит в какой-то момент в . Обратите внимание, что после такой плохой вещи , если дальнейшее выполнение приводит к выполнению , то также не удовлетворяет , поскольку плохая вещь в также происходит в . Мы принимаем этот вывод о неисправимости плохих вещей в качестве определяющей характеристики для того, чтобы быть свойством безопасности. Формализация этого в логике предикатов дает формальное определение того, чтобы быть свойством безопасности. [5]
Это формальное определение свойств безопасности подразумевает, что если выполнение удовлетворяет свойству безопасности , то каждый префикс (с повторением последнего состояния) также удовлетворяет .
Свойство жизнеспособности предписывает хорошие вещи для каждого выполнения или, что эквивалентно, описывает что-то, что должно произойти во время выполнения. [1] Хорошая вещь не обязательно должна быть дискретной — она может включать бесконечное количество шагов. Примеры хорошей вещи, используемой для определения свойства жизнеспособности, включают: [5]
В первом примере хорошо то , что он дискретен, а в остальных — нет.
Выдача ответа в пределах заданной границы реального времени является свойством безопасности, а не свойством жизнеспособности. Это происходит потому, что запрещается дискретная плохая вещь : частичное выполнение, которое достигает состояния, в котором ответ еще не был получен, а значение часов (переменной состояния) нарушает границу. Свобода от тупиков является свойством безопасности: «плохая вещь» — это тупик (который является дискретным).
В большинстве случаев знание того, что программа в конечном итоге делает что-то "хорошее", не является удовлетворительным; мы хотим знать, что программа выполняет "хорошее" в течение некоторого количества шагов или до некоторого крайнего срока. Свойство, которое дает определенную границу для "хорошего" - это свойство безопасности (как отмечено выше), тогда как более слабое свойство, которое просто утверждает, что граница существует, - это свойство жизнеспособности. Доказать такое свойство жизнеспособности, вероятно, будет проще, чем доказать более жесткое свойство безопасности, потому что доказательство свойства жизнеспособности не требует такого подробного учета, который требуется для доказательства свойства безопасности.
В отличие от свойства безопасности, свойство жизнеспособности не может исключать какой-либо конечный префикс [8] выполнения (поскольку это было бы «плохим» и, таким образом, определяло бы свойство безопасности). Это приводит к определению свойства жизнеспособности как свойства, которое не исключает какой-либо конечный префикс. [5]
Это определение не ограничивает хорошую вещь дискретностью — хорошая вещь может включать в себя все , что является выполнением бесконечной длины.
Лампорт использовал термины свойство безопасности и свойство жизнеспособности в своей статье 1977 года [1] о доказательстве корректности многопроцессных (параллельных) программ . Он заимствовал термины из теории сетей Петри , которая использовала термины жизнеспособность и ограниченность для описания того, как может развиваться назначение «токенов» сети Петри ее «местам»; безопасность сети Петри была особой формой ограниченности . Лампорт впоследствии разработал формальное определение безопасности для краткого курса НАТО по распределенным системам в Мюнхене. [9] Он предполагал, что свойства инвариантны относительно заикания . Формальное определение безопасности, данное выше, появляется в статье Альперна и Шнайдера; [5] связь между двумя формализациями свойств безопасности появляется в статье Альперна, Демерса и Шнайдера. [10]
Альперн и Шнайдер [5] дают формальное определение жизнеспособности, сопровождаемое доказательством того, что все свойства могут быть построены с использованием свойств безопасности и свойств жизнеспособности. Это доказательство было вдохновлено пониманием Гордона Плоткина , что свойства безопасности соответствуют замкнутым множествам , а свойства жизнеспособности соответствуют плотным множествам в естественной топологии на множестве бесконечных последовательностей состояний программы. [11] Впоследствии Альперн и Шнайдер [12] не только дали характеристику автомата Бюхи для формальных определений свойств безопасности и свойств жизнеспособности, но и использовали эти формулировки автоматов, чтобы показать, что проверка свойств безопасности потребует инварианта , а проверка свойств жизнеспособности потребует аргумента обоснованности . Соответствие между видом свойства (безопасность против жизнеспособности) и видом доказательства (инвариантность против обоснованности) было сильным аргументом в пользу того, что разложение свойств на безопасность и жизнеспособность (в отличие от некоторого другого разбиения) было полезным — знание типа доказываемого свойства диктовало тип требуемого доказательства.