Предикативное программирование
Предикативное программирование — это оригинальное название формального метода спецификации и уточнения программ , недавно получившего название «Практическая теория программирования», изобретенного Эриком Хенером . Основная идея заключается в том, что каждая спецификация представляет собой двоичное ( логическое ) выражение, которое истинно для приемлемого поведения компьютера и ложно для неприемлемого поведения. Отсюда следует, что уточнение — это всего лишь следствие . Это простейший формальный метод и наиболее общий, применимый к последовательным, параллельным, автономным, взаимодействующим, завершающим, незавершающим, работающим в естественном времени, реальном времени, детерминированным и вероятностным программам и включающий временные и пространственные границы.
Команды в языке программирования считаются особым случаем спецификации — тех спецификаций, которые компилируются. Например, если переменные программы , , и , команда := +1 эквивалентно спецификации (двоичное выражение) = +1 ∧ = ∧ = в котором , , и представляют значения переменных программы перед присвоением и , , и представляют значения переменных программы после присвоения. Если спецификация > , мы легко докажем ( := +1) ⇒ ( > ), в котором говорится, что := +1 подразумевает, или уточняет, или реализует > .
Доказательства цикла значительно упрощены. Например, если является целочисленной переменной, чтобы доказать, что
пока >0 делать := -1 из
уточняет или реализует спецификацию ≥0 ⇒ =0, докажи
если >0 тогда := –1; ( ≥0 ⇒ =0) еще быть ⇒ ( ≥0 ⇒ =0)
где = ( = ) — пустая команда или команда, ничего не делающая. Нет необходимости в инварианте цикла или наименьшей фиксированной точке . Петли с несколькими промежуточными мелкими и глубокими выходами работают одинаково. Эта упрощенная форма доказательства возможна, поскольку команды программы и спецификации можно осмысленно смешивать.
Время выполнения (верхние границы, нижние границы, точное время) можно доказать таким же образом, просто введя переменную времени. Чтобы доказать завершение, докажите, что время выполнения конечно. Чтобы доказать непрерывность, докажите, что время выполнения бесконечно. Например, если переменная времени , а время измеряется путем подсчета итераций, чтобы затем доказать, что выполнение предыдущего цикла while требует времени когда изначально неотрицательен и занимает вечность, когда изначально отрицательно, докажите
если >0 тогда := –1; := +1; ( ≥0 ⇒ = + ) ∧ ( <0 ⇒ =∞) иначе быть ⇒ ( ≥0 ⇒ = + ) ∧ ( <0 ⇒ =∞)
где = ( = ∧ = ).
Библиография [ править ]
- ECR Hehner, Практическая теория программирования , Springer-Verlag, 1993. Последнее онлайн-издание на сайте « Практическая теория программирования» .
Внешние ссылки [ править ]
- Публикации Эрика Хенера .