Прогнозирующее программирование

редактировать

Предикативное программирование - это оригинальное название формального метода для программ спецификации и уточнения, позднее названного Практической теорией программирования, изобретенного Эрик Хенер. Основная идея заключается в том, что каждая спецификация представляет собой двоичное (логическое ) выражение, которое верно для допустимого поведения компьютера и ложно для недопустимого поведения. Отсюда следует, что уточнение - это всего лишь импликация. Это простейший формальный метод и самый общий, применяемый к последовательным, параллельным, автономным, взаимодействующим, завершающим, незавершенным программам, программам естественного времени, реального времени, детерминированным и вероятностным программам, и включает время и пространство.

Команды на языке программирования считаются особым случаем спецификации - те спецификации, которые можно компилировать. Например, если программными переменными являются x {\ displaystyle x}x , y {\ displaystyle y}y и z {\ displaystyle z}z , команда x {\ displaystyle x}x : = y {\ displaystyle y}y +1 эквивалентна спецификации (двоичное выражение) x ′ {\ displaystyle x '}x'=y {\ displaystyle y}y +1 ∧ y ′ {\ displaystyle y'}y'=y {\ displaystyle y}y z ′ { \ displaystyle z '}z'=z {\ displaystyle z}z , в котором x {\ displaystyle x}x , y {\ displaystyle y}y и z {\ displaystyle z}z представляют значения программных переменных до назначения, а x ′ {\ displaystyle x '}x', y ′ {\ displaystyle y'}y'и z ′ {\ displaystyle z '}z'представляют значения переменных программы после присвоения. Если спецификация имеет вид x ′ {\ displaystyle x '}x'>y {\ displaystyle y}y , мы легко докажем (x {\ displaystyle x}x : = y {\ displaystyle y}y +1) ⇒ (x ′ {\ displaystyle x '}x'>y {\ displaystyle y}y ), в котором говорится, что x {\ displaystyle x}x : = y {\ displaystyle y}y +1 подразумевает, уточняет или реализует x ′ { \ displaystyle x '}x'>y {\ displaystyle y}y .

Циклическое доказательство значительно упрощено. Например, если x {\ displaystyle x}x является целочисленной переменной, чтобы доказать, что

whilex {\ displaystyle x}x >0 dox {\ displaystyle x}x : = x {\ displaystyle x}x –1 od

уточняет или реализует спецификацию x {\ displaystyle x}x ≥0 ⇒ x ′ {\ displaystyle x '}x'= 0, доказать

ifx {\ displaystyle x}x >0, затемx {\ displaystyle x}x : = x {\ displaystyle x}x –1; (x {\ displaystyle x}x ≥0 ⇒ x ′ {\ displaystyle x '}x'= 0) elseхорошо {\ displaystyle ok}{\ displaystyle ok} fi⇒ (x {\ displaystyle x}x ≥0 ⇒ x ′ {\ displaystyle x '}x'= 0)

где хорошо {\ displaystyle ok}{\ displaystyle ok} = (x ′ {\ displaystyle x '}x'=x {\ displaystyle x}x ) равно пустая команда или команда ничего не делать. Нет необходимости в инварианте цикла или с наименьшей фиксированной точкой. Петли с несколькими промежуточными неглубокими и глубокими выходами работают одинаково. Эта упрощенная форма доказательства возможна, потому что программные команды и спецификации могут быть осмысленно смешаны вместе.

Время выполнения (верхняя граница, нижняя граница, точное время) можно доказать таким же образом, просто введя временную переменную. Чтобы доказать прекращение, докажите, что время выполнения конечно. Чтобы доказать отсутствие прекращения действия, докажите, что время выполнения бесконечно. Например, если переменная времени t {\ displaystyle t}t , а время измеряется путем подсчета итераций, то для доказательства того, что выполнение предыдущего while -loop требует время x {\ displaystyle x}x , когда x {\ displaystyle x}x изначально неотрицательно, и продолжается вечно, когда x {\ displaystyle x}x изначально отрицательно, докажите

ifx {\ displaystyle x}x >0, затемx {\ displaystyle x}x : = x {\ displaystyle x}x –1; т {\ displaystyle t}t : = t {\ displaystyle t}t +1; (икс {\ displaystyle x}x ≥0 ⇒ t ′ {\ displaystyle t '}t'=t {\ displaystyle t}t +x {\ displaystyle x}x ) ∧ (Икс {\ Displaystyle x}x <0 ⇒ t ′ {\ Displaystyle t '}t'= ∞) elseхорошо {\ Displaystyle ок}{\ displaystyle ok} fi⇒ (х {\ displaystyle x}x ≥0 ⇒ t ′ {\ displaystyle t '}t'=t {\ displaystyle t}t +x { \ displaystyle x}x ) ∧ (x {\ displaystyle x}x <0 ⇒ t ′ {\ displaystyle t '}t'= ∞)

где хорошо {\ displaystyle ok}{\ displaystyle ok} = (x ′ {\ displaystyle x '}x'=x {\ displaystyle x}x t ′ {\ displaystyle t'}t'=т {\ displaystyle t}t ).

Библиография
Внешние ссылки

.

Последняя правка сделана 2021-06-02 04:29:00
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте