Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Аверянов Современная информатика 2011

.pdf
Скачиваний:
113
Добавлен:
16.08.2013
Размер:
6.43 Mб
Скачать

Особенно часто в информатике и, в частности, в алгоритмических языках программирования используются следующие логические операции: отрицание («не»), конъюнкция («и» –

логическое умножение) и дизъюнкция («или» – логическое сложе-

ние). Эти три функции часто называют булевыми, а алгебру логики, в которой используются лишь эти функции, а также константы 0 и 1 – булевой алгеброй, поскольку они впервые появились в середине XIX в. в трудах английского математика Дж. Буля как аппарат символической логики. Однако иногда и другие логические функции, представленные в табл.1.1, также называют булевыми. Используемые в высказываниях основные логические связки типа «и», «или», «не», «если…, то», «тогда и только тогда» и другие можно рассматривать, соответственно, как «элементарные» булевы функции

x y , x y , x , x y , x y и т.д.

Поскольку, как видно, имеется много логических функций, приобретает важность проблема их функциональной полноты. Некоторая система S логических функций называется функционально полной, если любую логическую функцию можно записать в виде формулы с помощью функций из S. Например, система булевых функций, состоящая из отрицания, конъюнкции и дизъюнкции, обладает функциональной полнотой. Однако функционально полными могут быть и системы, состоящие всего из двух логических функций. Так, полными системами являются отрицание и конъюнкция, отрицание и дизъюнкция, отрицание и импликация и др. Более того, функциональной полнотой могут обладать даже отдельные логические функции, например штрих Шеффера или стрелка Пирса. Следовательно, с точки зрения функциональной полноты, система булевых функций избыточна, однако избыточность позволяет короче и нагляднее записывать сложные высказывания. В алгоритмических языках программирования для нескольких наиболее распространенных логических связок («не», «и», «или», а иногда и др.) предусмотрены соответствующие символы или служебные (зарезервированные) слова.

21

Обозна- чение связок

x

xy

x y

x y

x y

x + y

xy

xy

Другие обозначения и представления

x , x

x & y x y xy

x y

x y x ~ y

x y

(x y)

(x y)

(x y)

x& y

xy

(x y)

(x y) x y

 

 

 

 

 

 

 

 

 

 

 

Таблица 1.1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таблица

 

 

 

 

 

 

 

 

истинности

 

 

 

 

 

 

 

x

 

0

0

1

 

1

Название связки

 

Как читать

 

 

 

 

 

 

 

 

 

 

 

 

 

y

 

0

1

0

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Не x; отрица-

 

1

 

0

 

 

Отрицание, инверсия

 

 

 

 

 

 

 

 

 

 

ние x

 

 

0

0

0

 

1

Конъюнкция,

логиче-

x и y

 

 

 

 

 

 

 

 

ское умножение, логи-

 

 

 

 

 

 

 

 

 

 

ческое «и», функция

 

 

 

 

 

 

 

 

 

 

совпадения, and (энд)

 

 

 

 

 

 

 

 

 

 

 

x или y

 

 

0

1

1

 

1

Дизъюнкция,

логиче-

 

 

 

 

 

 

 

 

ское сложение, логиче-

 

 

 

 

 

 

 

 

 

 

ское «или», функция

 

 

 

 

 

 

 

 

 

 

разделения, or (ор)

 

 

 

 

 

 

 

 

 

 

 

Если x, то y; x

 

1

1

0

 

1

Импликация,

матери-

 

 

 

 

 

 

 

альная импликация

влечет y, x им-

 

 

 

 

 

 

 

 

 

 

плицирует y

 

 

 

 

 

 

 

x

 

 

1

0

0

 

1

Эквивалентность,

эквивалентно

 

 

 

 

 

 

 

функция

равнозначно-

y;

x

тогда и

 

 

 

 

 

 

 

сти

 

 

только

тогда,

 

 

 

 

 

 

 

 

 

 

когда y

 

 

0

1

1

 

0

Сумма по модулю 2,

Либо x, либо y;

 

 

 

 

 

 

 

разделительная

дизъ-

х

неэквива-

 

 

 

 

 

 

 

юнкция, отрицание эк-

лентно y

 

 

 

 

 

 

 

вивалентности,

функ-

 

 

 

 

 

 

 

 

 

 

ция неравнозначности,

 

 

 

 

 

 

 

 

 

 

исключающее «или»

 

 

 

 

 

 

 

 

 

 

x и y несовме-

 

1

1

1

 

0

Штрих Шеффера, от-

 

 

 

 

 

 

 

рицание

конъюнкции,

стны;

неверно,

 

 

 

 

 

 

 

антиконъюнкция, nand

что

 

 

 

 

 

 

 

 

(нэнд)

 

 

x и y

 

 

 

 

 

 

 

 

Ни х, ни у

 

1

0

0

 

0

Стрелка Пирса, отри-

 

 

 

 

 

 

 

цание дизъюнкции, ан-

 

 

 

 

 

 

 

 

 

 

тидизъюнкция,

функ-

 

 

 

 

 

 

 

 

 

 

ция Вебба, nor (нор)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

22

 

 

 

 

 

 

 

 

 

 

 

 

Окончание табл.1.1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обо-

Другие

 

 

Таблица

 

 

 

 

 

 

 

обозначе-

 

истинности

 

 

 

 

 

 

 

зна-

 

 

 

 

 

 

 

Название связки

Как читать

 

 

 

 

 

 

 

 

 

чение

ния и

x

 

0

0

1

 

1

 

связок

представ-

 

 

 

 

 

 

 

 

 

 

 

 

 

y

 

0

1

0

 

1

 

 

 

 

 

 

 

ления

 

 

 

 

 

 

 

 

x / y

x →/ y

 

0

0

1

 

0

Отрицание

импли-

x, но не y; не-

 

( x y)

 

 

 

 

 

 

 

кации,

антиимпли-

верно,

что

х

 

 

 

 

 

 

 

 

кация,

материаль-

влечет y

 

 

 

( x y)

 

 

 

 

 

 

 

ная

антиимплика-

 

 

 

 

 

 

 

 

 

 

 

ция

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x y

x y

 

1

0

1

 

1

Обратная

имплика-

x, если y; если y,

 

y x

 

 

 

 

 

 

 

ция

 

 

то х; y влечет х;

 

y x

 

 

 

 

 

 

 

 

 

 

y имплицирует х

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x / y

x ←/ y

 

0

1

0

 

0

Отрицание

обрат-

Не х, но y; не-

 

( y x)

 

 

 

 

 

 

 

ной

импликации,

верно,

что

y

 

 

 

 

 

 

 

 

обратная

антиим-

влечет х

 

 

 

( y x)

 

 

 

 

 

 

 

пликация

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

При записи логических формул может быть также полезен закон, или принцип двойственности. Логическая функция f* называется двойственной по отношению к логической функции f, если ее

таблица истинности получается из таблицы истинности функции f заменой всех 0 на 1 и 1 на 0 (при этом замену нужно производить и для аргументов функции).

В силу принципа двойственности любую логическую функцию (формулу) f можно заменить на двойственную ей f* по правилу

f (x1, x2 ,..., xn ) = f * ( x1 , x2 ,..., xn ) .

(1.1)

23

Так, конъюнкция двойственна дизъюнкции, штрих Шеффера – стрелке Пирса, отрицание – самому себе и т.д. Пусть, например, A и B – произвольные логические формулы. Тогда в силу принципа двойственности

(A B) =A B , (A B) =A B

(1.2)

(формулы (1.2) иногда называют законами де Моргана).

Для преобразования логических формул можно также использовать:

закон противоречия

 

A A =0 ,

(1.3)

закон исключенного третьего

 

 

A A =1,

(1.4)

законы идемпотентности

 

 

A A = A ,

A A = A ,

(1.5)

законы поглощения

 

 

 

A (A B) = A ,

A (A B) = A ,

(1.6)

а также формулы

 

 

 

( A) = A , A 1 = A ,

A 0 =0 , A 1 =1 , A 0 = A,

(1.7)

A B =A B ,

A B = (A B) ( A B) .

 

(В выражениях (1.3) – (1.7) A и B – по-прежнему произвольные логические формулы.)

1.2. Элементы исчисления предикатов

Развитием исчисления высказываний является исчисление предикатов. Пусть xi (i = 1, 2, …, m) – заданные на некотором конеч-

ном или бесконечном множестве (поле) М переменные, называемые предметными, а их конкретные значения – индивидуальные предметы из этого множества. Предметными переменными могут быть, например, целые, действительные, комплексные числа; буквы различных алфавитов, химические символы, геометрические фигуры, фамилии (имена) членов некоторого коллектива и многое

24

др. Пусть также имеется набор функциональных символов (функций) с различным числом аргументных мест. Такими функциональными символами могут быть символы, описывающие математические функции; химические, экономические или финансовые формулы (правила), заготовки для слов, строк, таблиц, изображений, диаграмм, блок-схем с различным числом свободных (аргументных) мест и т.п. Из предметных переменных и функциональных символов можно конструировать так называемые термы, интерпретируемые как имена объектов исследования (математические выражения, слова и тексты, химические или ядерные реакции, изображения, блок-схемы и др.).

Тогда n-местным (n-арным) предикатом называется функция P(t1,t2,...,tn ) , которая представляет собой некоторое высказывание

о термах t1,t2,...,tn (n 0) и может принимать лишь значения «истина» или «ложь» в зависимости от индивидуальных предметов x1, x2,... из М, входящих в эти термы. При n = 1 предикат называют

свойством, а при n > 1 – отношением или, конкретнее, n-арным отношением. Изучаемые в исчислении высказываний отдельные высказывания могут формально рассматриваться как нульместные предикаты.

Таким образом, аргументами функций исчисления высказываний являются лишь высказывания, тогда как аргументами предикатов могут быть любые предметные переменные. При этом число мест, т.е. число термов в предикате, вообще говоря, отличается от числа

аргументов. Пусть, например, x1, x2, x3 – буквы русского алфавита, а z1, z2, z3, z4 – действительные числа. Образуем термы t1 = x1x2x1x3 (слово из четырех букв с одинаковыми первой и третьей буквами): t2 = z1 + z2 , t3 = z3z4 . Тогда высказывание « t1 – имя собственное» – одноместный предикат (свойство) с тремя аргументами ( x1, x2, x3 ), а высказывание « t2 >t3 » – двуместный предикат (отношение), зависящий от четырех аргументов ( z1, z2, z3, z4 ). Для

простейших математических отношений «меньше», «меньше или равно», «равно», «не равно», «больше или равно», «больше» в алгоритмических языках программирования имеются соответствующие символы или зарезервированные слова.

25

Отдельные предикаты – элементарные формулы исчисления предикатов. Связывая предикаты логическими связками, можно получать сложные формулы исчисления предикатов, например

P(t,u) Q(v, z, w) , R(t) S(t,v) , T (u,v) F(u) ,

 

(x > y) (y > z) , (u < v) (u < 0) ,

(1.8)

которые можно также рассматривать как новые предикаты. В этих формулах могут использоваться и высказывания алгебры логики (нульместные предикаты).

Помимо операций алгебры высказываний, в исчислении предикатов используются так называемые кванторы – логические операторы, переводящие одну высказывательную форму в другую и позволяющие указывать объем тех значений предметных переменных х, для которых данная высказывательная форма истинна. Обычно в логике предикатов ограничиваются двумя кванторами – квантором общности x и квантором существования x. Пусть x – предмет-

ная переменная, принимающая значения из множества (поля) М. Тогда выражение

x P(x) ,

(1.9)

начинающееся квантором общности, представляет собой высказывание: «для всякого x M истинно P(x. Поскольку задание любых индивидуальных предметов (значений) x M не нарушает истинность P(x), высказывание (1.9) уже не зависит от x. Говорят, что предметная переменная x связана квантором общности, и поэтому такие переменные называют связанными.

Выражение

 

xQ(x),

(1.10)

начинающееся квантором существования, понимается как высказывание: «существует такой элемент x M , для которого Q(x) истинно». Это высказывание также вполне определено и уже не зависит от x, т.е. переменная x связана квантором существования и является связанной переменной.

Кванторы общности x и существования x называются двойственными друг другу. В формулы (1.9), (1.10), кроме x, могут входить и другие предметные переменные (не показанные в формулах). Поскольку эти формулы не зависят от x, они полностью определяются заданием остальных переменных. Такие предметные пе-

26

ременные, не связанные никакими кванторами, называют свобод-

ными.

Существует закон, связывающий кванторы со знаком отрицания. Рассмотрим выражение

( xP(x)) . (1.11)

Очевидно, выраженное (1.11) высказывание « xP(x) ложно» равносильно высказыванию «существует такой элемент x M , для которого P(x) ложно» или, что то же самое, «существует элемент x,

для которого P(x) истинно». Следовательно, выражение (1.11) равносильно выражению

x P(x) . (1.12)

Аналогично, выражение

( xQ(x)) ,

(1.13)

означающее высказывание « xQ(x) ложно», равносильно высказыванию «для всех x ложно Q(x)» или «для всех x истинно Q(x) ». Следовательно, выражение (1.13) равносильно выражению

x Q(x) . (1.14)

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

1.3. Алгоритмы

Важнейшим понятием информатики является алгоритм. Алгоритмом называют понятное и точное предписание, которое задает порядок действий или процесс (называемый в этом случае алгоритмическим), начинающийся с произвольных исходных данных x (из некоторой совокупности значений X, допустимых для данного алгоритма) и направленный на получение полностью определяемого этими исходными данными результата y из некоторого допустимого множества Y [30, 31]. В современной математике понятие алгоритма относят к фундаментальным, т.е. к таким, которые не могут быть определены через более простые (таковы, например, фундаментальные понятия «точка», «линия» и др.). Поэтому данная

27

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

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

Детерминированность предполагает, что алгоритм не допускает никаких произвольных, интуитивных толкований и действий и должен предусматривать строго определенную последовательность действий для всех случаев, которые могут встретиться в ходе выполнения алгоритма при любых возможных исходных данных и промежуточных результатах. Детерминированность алгоритма обеспечивает получение идентичных результатов любыми исполнителями, а отсутствие в алгоритме каких-либо сознательных действий делает возможным его выполнение автоматическими устройствами, например компьютерами. В то же время детерминированность не препятствует использованию в алгоритмах (например, в алгоритмах случайного поиска) случайных величин, но должны быть строго определены вероятностные характеристики используемых случайных величин и последовательность действий, предпринимаемых в зависимости от значения каждого очередного случайного числа.

Свойство массовости понимается как применимость алгоритма к решению бесконечного класса однотипных задач, различающихся исходными данными (из множества допустимых исходных данных). Например, массовость алгоритма численного интегрирования означает его пригодность для вычисления определенных интегралов от любых интегрируемых функций, а алгоритма синтаксического контроля программ – возможность проверки любых программ данного языка программирования. В математике проблему создания алгоритмов, обладающих массовостью, называют массо-

вой алгоритмической проблемой.

28

Свойство результативности алгоритма означает, что он для каждого набора исходных данных x X обеспечивает получение за конечное (хотя заранее, возможно, и неизвестное) число шагов некоторого результата y Y . (При этом неявно подразумевается,

что результат должен быть получен за приемлемое время.) Если же для каких-либо x X не удается получить результат за конечное число шагов или получаемый результат y Y , то для достижения

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

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

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

Основными средствами описания алгоритмов служат словесная запись, блок-схемы, псевдокоды и алгоритмические языки.

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

29

мов арифметических действий (сложение, вычитание, умножение, деление) «в столбик».

Блок-схема алгоритма представляется в виде конечного множества узлов (блоков, вершин) и соединяющих их направленных отрезков линий (ребер). В математике такая фигура называется ориентированным графом. Вершины графа описывают различные действия с информацией (данными), а ребра – передачи управления и потоки данных. В простейших блок-схемах достаточно использовать всего три типа узлов – функциональный, предикатный и слияния, которые считаются основными (рис. 1.1).

F

P

 

ИЛ

а

б

в

Рис. 1.1. Основные типы узлов в блок-схемах: а – функциональный, б – предикатный, в – слияния

Функциональный узел изображается прямоугольником, имеет один вход и один выход и осуществляет указанную в нем обработку информации. Предикатный узел изображается ромбом, имеет один вход и два выхода и определяет истинность или ложность указанного в нем предиката. Если предикат приобретает значение «истина», осуществляется выход по стрелке, помеченной буквой «И». Если предикат приобретает значение «ложь», – происходит выход по стрелке, помеченной буквой «Л». Вместо «И» и «Л» часто используются также, соответственно, «да» и «нет». Узел слияния изображается кружком, не действует на данные и указывает, что два пути обработки данных сливаются в один. Помимо основных типов узлов в блок-схемах алгоритмов используют еще ряд дополнительных, которые здесь рассматривать не будем. В силу хорошей наглядности блок-схемы алгоритмов обычно используются в качестве пояснительных и промежуточных рабочих материалов. В качестве примера на рис. 1.2 изображена блок-схема поиска максимального числа

xmax из множества n > 1 действительных чисел { xi ; i = 1, 2, …, n} и его номера imax.

30