Программа как математический объект: Методические указания для самостоятельного изучения темы и выполнения РГР, страница 21

                       x > 0 L x £ y ® z := y |

                        x£ 0 L y > 0 Lx < y ®  z := x |

                        x£ 0 L y > 0 L x ³ y ®  z := y)

В последнем правиле условие противоречиво ( тождественно ложно), поэтому это правило исключить из разделяющихся правил;

5) Оставшиеся правила можно пояснить с помощью диаграммы на плоскости x, y, как показано на рис. 32

6) обратное преобразование в условное правило, записанное без использования операций max и min.

4.4.4  Сравнение условных правил

При сравнении двух условных правил в процессе верификации более удобна разделяющаяся форма этих условных правил. Предположим, разделяющиеся правила   (p1 ® r1 | p2 ® r2 | p3 ® r3 ) и  (q1 ® s1 | q2 ® s2 ) сравниваются с целью определения полной корректности. В этом случае необходимо и достаточно, чтобы правила 1) задавали идентичные области определения и 2) совпадали при каждой парной конъюнкции предикатов правил, т. е.  Должны выполняться соотношения:

p1 V p2 V p3 = q1 V q2 (идентичные области определения) и

(p1 Lq1  ® r1) = (p1 Lq1  ® s1)

(p1 Lq2  ® r1) = (p1 Lq2  ® s2)

(p2 Lq1  ® r2) = (p2 Lq1  ® s1

(p2 Lq2  ® r2) = (p2 Lq2  ® s2)

(p3 Lq1  ® r3) = (p3 Lq1  ® s1)

(p3 Lq2  ® r3) = (p3 Lq2  ® s2) (сравнение каждой парной конъюнкции).

Например, сравним два условных правила:

(x ³ 0 Ly ³ 0 ® x:= x - y | x ³ 0 L x + y ³ 0 ® x:= x + y) и

(x + y ³ 0 Ly £ 0 ® x:= x + y | x ³ 0 L x + y > 0 ® x:= x - y)

1) разделение условий : (преобразование второго предиката   первого правила можно записать как

Ø(x ³ 0 L y ³ 0 ) L x ³ 0 L  x + y ³ 0 = ( x < 0 V y < 0) L x ³ 0 L  x + y ³ 0 =

y < 0 L x ³ 0 L  x + y ³ 0;

второй предикат второго правила приводится к следующему виду:

Ø ( x + y ³ 0 L y £ 0) L x + y > 0 L x ³ 0 = (x + y < 0 V y > 0) L x + y > 0 L x ³ 0

= y > 0  L x + y > 0 L x ³ 0.

2) исходные правила в разделяющейся форме выглядят  так:

(x ³ 0 L y ³ 0 ® x := x - y | y < 0 L x ³ 0 L  x + y ³ 0® x := x+ y)

(x + y ³ 0 L y  £ 0 ® x := x + y | y > 0  L x + y > 0 L x ³ 0 ® x := x - y)

3) проверка равенства областей определения:

верно ли,  что (x ³ 0 L y ³ 0) V (y < 0 L x ³ 0 L  x + y ³ 0) =

                          (x + y ³ 0 L y  £ 0) V (y > 0  L x + y > 0 L x ³ 0) ?

О равенстве областей определения можно судить по диаграмме  (рис. 33)

 

  L1, L2  - область определения первого условного правила, а R1, R2 - область определения второго условного правила.

4) Проверка равенства правил:

вариант 1.1     (x ³ 0 L y ³ 0 )L (x + y ³ 0 L y  £ 0)  (p1 Lq1)

верно ли, что x := x - y = x := x + y ? (r1 = s1)

поскольку y ³ 0  и y  £ 0 , то данное   выражение истинно при  y =0, следовательно x := x - y = x := x + y  равенство истинно.

вариант 1.2 ( x ³ 0 L y ³ 0 )L (y > 0  L x + y > 0 L x ³ 0)  (p1 Lq2)

верно ли, что x := x - y = x := x - y ?  (r1 = s2) равенство очевидно

вариант 2.1  (y < 0 L x ³ 0 L  x + y ³ 0) L( x + y ³ 0 L y  £ 0)  (p2Lq1)

верно ли, что x := x + y = x := x + y ? (r2 = s1) равенство очевидно.

вариант 2.1  (y < 0 L x ³ 0 L  x + y ³ 0) L  (y > 0  L x + y > 0 L x ³ 0)  (p2 Lq2)

верно ли, что x := x + y = x := x - y ? (r2 = s2)

Так как выражение  (p2 Lq2) тождественно ложно ( y < 0 L y> 0), данное равенство можно не рассматривать. Диаграмма,  показанная на рис.34 , соответствует трём определённым выше случаям.

4.4.5 Трассировочные таблицы для последовательностей условных правил

Для определения программной функции программы, состоящей из последовательности условных правил, необходимо описать все возможные пути вычисления в этой программе. Это делается так же, как и при описании функции схемы - программы без циклов. ( см. 3.2.4 рис. 13 ).  Отдельно описывается  каждый путь в Е - схеме и для него  составляется трассировочная  таблица, которая отличается от трассировочной таблицы  для обычных последовательностей лишь тем, что добавляется  столбец условий. Рассматривая  реальную программу из последовательности условных правил, можно не строить  Е - схему, а достаточно преобразовать программу в последовательность разделяющихся правил. Например, if  x ³ 0 then  x:= x + y else y:= y + x;