Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпаргалка по программированию.DOC
Скачиваний:
50
Добавлен:
01.05.2014
Размер:
1.9 Mб
Скачать

Кванторы и запись утверждений о массивах

Квантор существования. Пусть m и n – выражения с целочисленными значениями (m  n). Рассмотрим предикат Pm or m + 1 or ... or Pn  1, (4.1)

где каждое Pi – предикат. Предикат (4.1) истинен, если истинно хотя бы одно из Pi. Предикат (4.1) можно записать в другой форме, использующей квантор существования : ( im  i < nPi). (4.2)

Здесь i называется квантифицированной переменной, а нер-во m  i < n задает область её значений. На естественном языке (4.2) читается следующим образом: существует по крайней мере одно (целое) значение i, лежащее между m и n  1 (включительно), для которого выполнено утверждение Pi.

Используемые в математике способы записи сумм и произведений тоже могут рассматриваться как кванторы:

Их иногда записывают в форме

что совсем близко к виду (4.2). Далее там, где удобно, будем записывать их в виде

(  im  i < n:   ai), (  im  i < n:   ai).

Формально квантор существования  можно определить рекурсивно следующим образом.

Определение :

1) для m : ( im  i < m:  Pi) = false,

2)для n = k + 1 > m: ( im  i < k + 1:  Pi) = ( im  i < k:  Pior Pk. Квантор всеобщности. Содержательно определим квантор всеобщности  (читается: «для всех») как

( im  i < nPi) = Pm & m + 1 & ... & Pn  1.

Формально можно либо дать рекурсивное определение, аналогичное определению квантора , либо определить квантор всеобщности через квантор , подчеркивая тот факт, что с формальной точки зрения лишь один из этих кванторов является новым понятием. Действительно, используя законы отрицания и де Моргана, получаем

Pm & m + 1 & ... & Pn  1 = not not (Pm & m + 1 & ... & Pn  1 ) =

not (not Pm or not P m + 1 or ... or not Pn  1) = not ( im  i < n:  not Pi),

что дает возможность определить квантор  через квантор .

Определение : ( im  i < nPi) = not ( im  i < n:  not Pi).

Из этого опред следует, что( im  i < m:  Pi) =  =not ( im  i < m:  not Pi) = not false = true.

Квантор количества (счёта). Для количества различных значений i из области m  i < n, при которых истинно Pi, удобно иметь специальное обозначение ( im  i < n:  Pi) .

Дадим формальное определение (по существу, это определение некоторой индуктивной ф-ции).

Определение :

1) для m : ( im  i < m:  Pi) = 0,

2) для n = k +1 > m: (i k + 1: Pi)=

= ( i kPi)+(if Pk then 1 else 0).

Заметим, что кванторы существования и всеобщности можно выразить через квантор количества:

( im  i < n:  Pi) = ( ( im  i < n :  Pi)  1),

( im  i < n:  Pi) = ( ( im  i < n :  Pi) = n  m).

В качестве примера использования квантора количества приведем ситуацию, когда нужно записать утверждение о том, что k  второе по величине из чисел, для которых выполняется Pk (из ряда возможных P0P1, ...). Если бы требовалось найти наименьшее k, при котором истинно Pk, то это можно было бы выразить таким образом: (k  0) & ( i: 0  i < k:  not Pi) & Pk.

Утверждение о втором по величине k выглядит уже более громоздко:

(k  0) & (0  j < k) & ( i: 0  i < j:  not Pi) & P&  ( i+ 1  i < k:  not Pi) & Pk,

не говоря уже об утверждениях относительно третьего и следующих по величине k. С помощью квантора счёта все эти утверждения можно записать лаконичнее и яснее:

для первого k:  ( ( i: 0  i < k :  Pi) = 0 ) & Pk,

для второго k:  ( ( i: 0  i < k :  Pi) = 1 ) & Pk,  ...

для -го по величине k: ( ( i: 0  i < k :  Pi) =   1 ) & Pk.

Замечание 1. Можно доопредилить введенные кванторы на тот случай, когда область значений квантифицированной переменной включает правую границу n, например:

( im  i  n:  Pi) = ( im  i < n + 1:  Pi).

Замечание 2. Кванторы с прилегающими друг к другу областями можно соединять следующим образом:

( im  i < n:  Pior ( in  i < q:  Pi) = ( im  i < q:  Pi) ,

( im  i < n:  Pi) & ( in  i < q:  Pi) = ( im  i < q:  Pi) ,

( im  i < n:  Pi) + ( in  i < q:  Pi) = ( im  i < q:  Pi) .

Рассмотрим примеры записи утверждений о массивах с помощью кванторов. Пусть имеется массив a[1..n] и целые переменные j и k, такие, что 1  j  k + 1  n + 1. Запись a[j..k] обозначает отрезок (или сегмент) массива. Первый элемент этого сегмента есть a[j], а последний  a[k]. При j = k + 1 сегмент пуст. В каждом приведенном ниже примере даны содержательная и формальная формулировки утверждения:

1)все элементы a[j..k]нулевые: ( ij  i < k + 1:  a[i] = 0)

2) все элементы a[j..k]  ненулевые: ( ij  i < k + 1:  a[i]  0), или not ( ij  i < k + 1:  a[i] = 0); 3) значения элементов a[j..k] расположены в возрастающем порядке: ( ij  i < k:  a[i] < a[+ 1]);

4) любой элемент a[1..j] меньше y, а любой элемент a[j+1..n] больше y: (0   n) & ( i: 1  i < j + 1:  a[i] < y) & ( ij + 1  i < n + 1:  a[i] > y);

5) значение y встречается в массивах b[1..n] и c[1..m] одинаковое число раз: ( i: 1  i  n:  b[i] = y) = ( i: 1  i  m:  c[i] = y).

Сокращения. В некоторых случаях удобно использовать сокращенную запись утверждений о массивах, например:



Предикат Сокращение



( i: 1  i < j + 1:  a[i] < ya[1..j] < y

( ij  i < k + 1:  a[i] = 0) a[j..k] = 0

( ij  i < k + 1:  a[i] = y) y  a[j..k]

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

1

j k

n

a:

?

= 0

?

& (1  j  k + 1  n + 1)

Эквивалентна предикату (1  j  k + 1  n + 1) & ( ij  i < k + 1:  a[i] = 0) , а картинка

1 j

n

a:

y

y

& (0  j  n )

эквивалентна предикату

(0  j  n ) & ( i: 1  i < j + 1:  a[i] < y) & ( ij + 1  i < n + 1:  a[i] > y).

Билет№28 Правила вывода для операторов цикла с парпаметром и верификаця программ с одномерными массивами №28