Трассировочная таблица позволяет путём систематического исключения всех промежуточных значений индексов, начиная с конечных значений, вывести функцию программы:
x3 = x2 - y2 = x1 - (x1 - y1) = y1 =y0
y3 = y2 = x1 - y1 = x0 -+ y0 - y0 = x0
Таким образом, функция программы этой последовательности представляет собой присваивание вида x, y:= y, xпри котором переменные обмениваются значениями.
Заметим, что более привычный для нас обмен реализуется последовательностью присваиваний:
1) initial t := x
2) x := y
3) y := t
4) free t
Эта последовательность имеет трассировочную таблицу:
Фрагмент |
t |
x |
y |
1. initial t := x |
t1 = x0 |
x1 = x0 |
y1 = y0 |
2. x := y |
t2 = t1 |
x2 = y1 |
y2 = y1 |
3. y := t |
t3 = t2 |
x3 = x2 |
y3 = t2 |
4. free t |
free |
x4 = x3 |
y4 = y3 |
вывод:x4 = x3 = x2 = y1 = y0; y4 = y3 = t2 = t1 = x0
функцию программы: x, y:= y, x.
4.4.2 Разделяющиеся условные правила
Чтобы доказать, что программа типа if _then _ else (ifp then G else H fi) правильно выполняет функцию f, необходимо верифицировать отношения:
f = [if p then G else H fi] и f Ì [if p then G else H fi]
Процесс верификации может повлечь за собой сравнение условных правил, потому что функция программы if _then _ else может быть точно преобразована в форму условного правила.
Например,
[if p then G else H fi] = ( p ® [G] | Øp ® [H] )
В общем случае f, [G], [H] могут быть сами заданы условными правилами; поэтому необходимо уметь упрощать их с целью сравнения и определения программной функции. Для этого введём понятие разделённых предикатов: два предиката pi и pj разделены, если pi L pj º ложь, а условное правило в случае разделения всех предикатов называем разделяющимся правилом.
Разделяющееся правило может оказаться более удобным для верификации, чем условное правило. К тому же его легко вывести, логически умножая каждый предикат на отрицание каждого и предыдущих предикатов. Таким образом, условное правило (p1 ® r1 | p2 ® r2 | p3 ® r3 | . . .) совпадает по результату с разделяющимся правилом (p1 ® r1 | Øp1 L p2 ® r2 | Øp1 LØ p2 Lp3 ® r3 | . . . ), а разделяющееся правило (q 1 ® s1 | q2 ® s2 | q3 ® s3 | . . .) даёт такой же результат, как и условное правило (q1 ® s1 | q1 V q2 ® s2 | q1 V q2 V q3 ® s3 | . . .)
Отметим, что в каждом предикате последнего условного правила можно опустить любой член, кроме последнего; таким образом, разделяющееся правило можно преобразовать в одно из многочисленных условных правил.
Разделяющееся правило обладает следующим свойством: произвольная перестановка принадлежащих ему правил не изменяет результата самого правила. Это правило лежит в основе верификации условных правил и их преобразования в более простые эквивалентные условные правила.
4.4.3 Преобразование условных правил
Алгоритм преобразования:
1) преобразовать данное условное правило в эквивалентное ему разделяющееся правило;
2) преобразовать любым удобным способом разделяющееся правило, переставляя принадлежащие ему правила;
3) выполнить обратное преобразование разделяющегося правила в некоторое простое эквивалентное условное правило.
Пример: 1) исходное условное правило:
(x>0 ® z := max (x, y) | y >0 ® z := min (x, y));
2) раскроем функции max и min через условные правила, получим вложенное условное правило:
(x>0®( x > y®z := x | истинно®z := y) | y>0®
( x < y ® z := x | истинно ®z := y) );
3) преобразуем в разделяющиеся правила:
(x>0®( x > y®z := x | x £ y ®z := y) | x £0 L y>0®
( x < y ® z := x | x ³ y ®z := y) );
4) введём внешние предикаты во внутренние:
(x > 0 L x > y ® z := x |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.