Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6gJr5byPBn.file.1.doc
Скачиваний:
12
Добавлен:
30.04.2022
Размер:
2.09 Mб
Скачать

4.2. Алгоритмические логики

Алгоритмические логики создаются с целью описания семантики языков программирования и включают формулы вида {}S{ψ}, читающиеся как «если до выполнения оператора S было истинно , то после его выполнения будет истинно ψ».

Эти логики были изобретены Р.У. Флойдом (1967 год), Ч.Хоаром (1969 год) и представителями польской логической школы (А.Сальвиницкий и др. (1970 год)).

Хоар определил простой язык программирования через логическую систему аксиом и правил вывода для доказательства частичной правильности программ. Им показано, что определение семантики языка не в терминах выполнения программы, а в терминах доказательства ее правильности упрощает процесс построения программы.

На базе работы Хоара проводились исследования в области аксиоматических определений языков программирования. Появилось много работ по аксиоматизации различных конструкций: от оператора присваивания до различных форм циклов, от вызова процедур до сопрограмм. В 1973 году были сформулированы правила доказательства правильности для большинства конструкций языка Паскаль. В 1975 году была построена автоматическая система верификации для языка Паскаль, основанная на аксиомах и правилах вывода. В 1979 году был определен язык программирования Евклид, в проект которого с самого начала была заложена идея аксиоматизации.

В 1976 году Э.Дейкстра предложил метод доказательства правильности программ. Суть метода заключается в том, чтобы строить программу вместе с доказательством, причем доказательство должно опережать построение программы. Дейкстра определил для простого языка программирования слабейшие предусловия и показал, как их можно использовать в качестве исчисления для вывода программ. Стало ясно, что использование формализма может привести к построению программ более надежным способом.

Опишем принцип построения алгоритмической логики L0.

Память в L0 разделена на ячейки. Каждая ячейка имеет идентификатор, представляющий собой слово из латинских букв и цифр и начинающийся с буквы. Ячейки содержат натуральные числа.

Программа в L0 состоит из операторов. Исходный оператор – оператор присваивания х:=t, где х – идентификатор, а t – терм сигнатуры в котором в качестве переменных используются идентификаторы.

Пусть – формула сигнатуры 0, истинная на состоянии памяти после присваивания, – формула, истинная до присваивания. Тогда по оператору присваивания строится формула

Пример. Если формула равна (х<2) и t=x+1, то формула равна (х+1<2). Следовательно, чтобы после присваивания х:=x+1 стало истинным (x<2), требуется, чтобы до присваивания выполнялось неравенство х+1<2, т. е. |–{(x+1<2)} x:=x+1{(x<2)}.

Пусть два оператора S1 и S2 выполняются один за другим. Тогда композиции S1 S2 операторов S1 и S2 соответствует правило вывода

Условный оператор – это конструкция

IF IF,

где 1,…,n – бесконечные формулы сигнатуры 0, а S1,…,Sn – последовательность операторов. При работе условного оператора проверяются формулы i при текущем состоянии памяти. Если ни одна из формул i не истинна, то фиксируется ошибка. Если же некоторые i истинны, то по некоторым приоритетам выбирается одна из них и выполняется соответствующая последовательность операторов Si.

Если каждая из команд Si описана в логике L0 формулой ψiSi, то условный оператор описывается формулой

IF IF {}

Операторам цикла соответствуют конструкции

DOOUT OD.

Выполняется оператор цикла следующим образом. Проверяются формулы 1,…,n, ψ1,…,ψm при текущем состоянии памяти. Если ни одна из них не истинна, то по некоторым приоритетам выбирается одна из них. Если выбрана i, то выполняется соответствующая последовательность операторов Si и выполнение цикла возобновляется. Если выбрана ψj, то выполняется соответствующая последовательность операторов Тj и выполнение цикла завершается.

Если каждая из команд Si описана в логике L0 формулой { }Si{i}, Тj – формулой { }Tj{θ}, то однократное выполнение цикла описывается формулой

{

} IF

IF {θ}.

Двукратное выполнение цикла соответствует формуле

{

} IF

IF { }.

{

}IF

IF {θ}

и т. д. до бесконечности. Обозначив через DOk{θ} условие правильности k шагов цикла, получаем, что корректность цикла равносильна истинности формулы DOk{θ}. Но эта формула имеет бесконечную длину и не является формулой логики L0. Появление таких формул, относящихся к логике , порождает серьезные проблемы для алгоритмических логик.

Опишем алгоритмическую логику Хоара, которая является основной для логики выводов правильных программ и допускает интерпретации в терминах программных конструкций. Следующие аксиомы, называемые аксиомами Хоара или правилами верификации, определяют предусловия как достаточные условия, гарантирующие, что исполнение соответствующего оператора при успешном завершении приведет к желательным постусловиям.

А1. { }x:=t{} (аксиома присваивания).

А2. {}S{ψ} (аксиома ослабления постусловия).

А3. {}S{ψ} (аксиома усиления предусловия).

А4. {}S1{ψ} (аксиома композиции).

А5. { }S{}

(аксиома условного оператора).

А6. ({ }S1{})

(аксиома альтернативного оператора).

А7. { }S{} (аксиома оператора цикла until(до)).

А8. { }S{} (аксиома оператора цикла while(пока)).

В аксиомах А7 и А8 утверждается, что формула истинна перед выполнением и после выполнения каждого шага цикла. Эта формула называется инвариантной формулой или инвариантом цикла.

Аксиомы А1 – А8 можно использовать для проверки согласованности передачи данных от оператора к оператору, для анализа структурных свойств текстов программ, для установления условий окончания цикла. Кроме того, аксиомы можно использовать для анализа результатов выполнения программы.

Пример. Рассмотрим задачу нахождения частного q и остатка r от деления n на m.

Входные данные:

m и n – натуральные числа, где m>0.

Выходные данные:

q, r – натуральные числа.

Описание программы S:

задать(n,m)

r:=n; q:=0;

while mr do

begin

r:=rm; q:=q+1

end;

выдать(q,r).

Сформулируем предусловие : m>0.

Сформулируем условие ψ:

Требуется доказать, что |–{}S{ψ}

или

|–{m>0}S{ }

Доказательство.

ε

Формулы

Аксиомы и правили вывода

1

в формальной арифметике

2

{ }r:=n{ }

аксиома А1

3

{ }q:=0{ }

аксиома А1

4

{}r:=n{ }

А3 к пунктам 1 и 2

5

{}r:=n;q:=0{ }

А4 к пунктам 3 и 4

6

арифметика

7

аксиома А1

8

аксиома А1

9

А4 к пунктам 7 и 8

10

А2 к пунктам 6 и 9

11

А8 к пункту 10

12

{}S{ }

А4 к пунктам 5 и 11

В силу того, что система является вполне упорядоченным множеством и на каждом шаге значение r уменьшается на положительную величину r, найдется такое значение r, для которого не будет выполняться условие , и циклический процесс завершится.

Таким образом, установлено, что

т. е. программа S является тотально правильной.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]