Редактирование: МФСП, 08 лекция (от 22 октября)

Материал из eSyr's wiki.

Перейти к: навигация, поиск

Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.

Текущая версия Ваш текст
Строка 67: Строка 67:
* ∀ x ∀ i (i=i_j) ⇒ c(a(x, i_1, n_1, ..., i_k, n_k), i) = n_j
* ∀ x ∀ i (i=i_j) ⇒ c(a(x, i_1, n_1, ..., i_k, n_k), i) = n_j
-
Для метода индуктивных утверждений у нас осталось всё то же самое:
+
Для метода индукционных утверждений у нас осталось всё то же самое:
* Ш1.
* Ш1.
* Ш2.
* Ш2.
-
* Ш3. Добавляем условие корректности, связанное с невыходом за границы массива. Условие корректности определяется для всех операторов всех видов, кроме join. Для всех операторов, в которых встречается индекс некоего массива: x[y], необходимо &forall; путей, начинающихся во всех точках сечения i и заканчивающихся в операторе n (i-n), на котором нет других точек сечения, необходимо сформулировать условие корректности: &forall; -x- &forall -y- p_i(-x-, -y-) &and; R_&alpha;(-x-, -y-) &rArr; 0 &le; y < N. Если говорить более формально, то в качестве индекса используется f(-x-, -y-), соответственно, если писать формально, то надо писать f(-x-, r_&alpha;(-y-)). Соответственно, аналогично требование для путей, которые начинаются в начальном операторе: в любом операторе, в котором есть разыменование, в любом пути, в котором есть начальный оператор, и который не содержит точек сечения, будет аналог. сформируем выражение: &forall; -x- &phi;(-x-) &and; R'_&alpha;(-x-) &rArr; 0 &le; f('x', r_&alpha;(-x-)) < N
+
* Ш3. Добавл. усл. корр., связанное с невыходом за гр. массива. Усл. корр. опр. для всех операторов всех видов, кроме join. Для всех операторов, в которых встреччается инд. некоего массива: x[y], необх. &forall; путей, нач. во всех точках сечения i и зак. в операторе n (i-n), на котором нет других точек сечения, необх. сформ. усл. корректности: &forall; -x- &forall -y- p_i(-x-, -y-) &and; R_&alpha;(-x-, -y-) &rArr; 0 &le; y < N. Если говорить более форм., то в качестве инд. исп. f(-x-, -y-), соотв., если писать форм., то надо писать f(-x-, r_&alpha;(-y-)). Соответственно, аналогично требование для путей, которые нач. в начальном операторе: в любом опер., в котором есть разым., в любом путе, в котором есть нач. оператор, и которое не сод. точек сечения, будет аналог. сформ. выражение: &forall; -x- &phi;(-x-) &and; R'_&alpha;(-x-) &rArr; 0 &le; f('x', r_&alpha;(-x-)) < N
-
При доказательстве завершимости программы, на самом деле, просто полезно иметь в виду, что у нас есть хорошее свойство фундированных множеств: если у нас их есть несколько, то декартово произведение с заданным на нём лексикографическом порядке есть фундированное множество. Именно этим способом организуется фундированное множество оказывается удобно использовать при работе с массивами.
+
При док. завершимости программа, на самом деле, просто полезно иметь в виду, что у нас есть зорошее св-во фунд. мн-в: если у нас их есть неск., то дек. произв. с заданным на нём лекс. порядко есть фунд. множество. Именно этим способом орг. фунд. множество оказ удобно польз.ю при работе с массивами.
-
В качестве примера рассмотрим программу, которая вычисляет реверсирование массива.
+
В касестве примера рассм. программу, которая выч. реверсирование массива.
-
Допустим, есть входной массив x: N[10]. Есть промежуточные переменные y : N[10], i : N. Домен выходных переменных: z : N[10].
+
Допустьим, есть вх. массив x: N[10]. Есть промеж. переменные y : N[10], i : N. Домен вых. переменных: z : N[10].
-
Вообще, это делается в одно присваивание. Но мы простым путём не пойдём и нарисуем программу с циклом:
+
Вообще, это делается в одно присв.. Но мы простым путём не пойдём и нарис. программу с циклом:
START:
START:
Строка 92: Строка 92:
(y[0-i, y[i]], i+1) z &larr; y
(y[0-i, y[i]], i+1) z &larr; y
-
Теперь необходимо сформулировать спецификацию:
+
Теперь необх. сформю спецификацию:
* Предусловие: &phi; &equiv; true
* Предусловие: &phi; &equiv; true
* Постусловие: &psi; &equiv; &forall; i &isin; {0..9}: z[i] = x[9-i]
* Постусловие: &psi; &equiv; &forall; i &isin; {0..9}: z[i] = x[9-i]
Строка 98: Строка 98:
Ш1. Выберем точку сечения: i.
Ш1. Выберем точку сечения: i.
-
Ш2. На втором шаге необходимо сформулировать индуктивное утверждение: &forall; j &isin; N: 0 &le; j &le; i &rArr; (y[j]=x[9-j])&and;(y[9-j]=x[j])
+
Ш2. На втором шаге необх. сформ. инд. утверждение: &forall; j &isin; N: 0 &le; j &le; i &rArr; (y[j]=x[9-j])&and;(y[9-j]=x[j])
-
Ш3. Необходимо сформулировать условия верификации для всех базовых путей. &forall; x &forall; j &isin; N 0 &le; j &le; 0 &rarr; x[j] = x[9-j] &and; x[9-j]=x[j]. Условие записано корректно, но оно не является истиной. То есть инвариант, который мы выбрали, является не совсем корректным, поскольку на 1 проходе он не выполняется. Соответственно, нам надо подкорректировать этот инвариант, чтобы он действительно описывал точку сечения, или передвинуть точку сечения. Но было предложено подправить инвариант. На самом деле, 0 &le; j '''<''' i. Соответственно, теперь, кода мы модифицируем инвариант, левая часть импликации становится ложью и импликация становится истиной. Посмотрим на следующий базовый путь. Рассмотрим базовый путь, который начинается с т. с., проходит итерацию цикла и в неё возвращается: &forall; x &forall; y &forall; i: (&forall;j &isin; N, 0 &le; j < i &rArr; y[j] = x[9-j] &and; y[9-j]=x[j]) &and; i < 5 &rarr; (&forall; j &isin; N 0 &le; j < i+1 &rArr; y'[j] = x[9-j] &and; y'[9-j]=x[j]), y' = a(y, i, y[9-i], 9-i, y[i]). Это не есть тождественная истина. В данном случае, когда мы писали инвариант, мы безусловно написали, что для части, которую мы прошли, перестановка произошла, но мы забыли важный момент: конец массива содержит неизменённый массив x. Именно это знание и необходимо отразить. Необходимо написать, что для i <= j < 9-i y[j]=x[j]. Тогда слева появится конъюнкция и это тогда действительно будет тождественная истина.
+
Ш3. Необх. сформ. усл. вериф. для всех базовых путей. &forall; x &forall; j &isin; N 0 &le; j &le; 0 &rarr; x[j] = x[9-j] &and; x[9-j]=x[j]. Условие зап. корр., но оно не явл. истиной. То есть инв., который мы выбрали, явл. не совсем корр., поск на 1 проходе он не вып. Соотв., нам надо подкорр. эжтот инв., чтобы он действ. описывал точку сечения, или передвинуть точку сечения. Но лектор предл. подпр. инв. На самом деле, 0 &le; j '''<''' i. Соотв., теперь, кода мы модиф. инвариант, левая часть импл. становится ложью и импл. становится истиной. Посмотрим на след. базовый путь. Рассм.п базовы йпуть, который нач. с т. с., проходит итерацию цикла и в неё возвр.: &forall; x &forall; y &forall; i: (&forall;j &isin; N, 0 &le; j < i &rArr; y[j] = x[9-j] &and; y[9-j]=x[j]) &and; i < 5 &rarr; (&forall; j &isin; N 0 &le; j < i+1 &rArr; y'[j] = x[9-j] &and; y'[9-j]=x[j]), y' = a(y, i, y[9-i], 9-i, y[i]). Это не есть тожд. истина. В данном случае, когда мы пис. инв., мы бкзусл .написали, что для частиЮ, которую мы прошли, перест. произошла, но мы забыли важный момент: конец массива сод. неизм. массив x. Именно это знание и необх. отразить. Необх. написать, что для i <= j < 9-i y[j]=x[j]. Тогда слева появится конъюнкция и это тогда действ. будет тожд. истина.
-
Когда пишете инварианты, не забывайте вносить вещи, которые как бы очевидны. Это же относится к ограничениям на область значений переменных.
+
Тем самым лектор зотел проилл. момент, что когда пишете инв., не забывайте вносить вещи, которые как бы очевидны. Это же отн. к огр. на обл. значений перем.
Ссылки:
Ссылки:

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. eSyr's_wiki:Авторское право).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Личные инструменты
Разделы