Вы находитесь на странице: 1из 24

Денис Смирнов!

Первое письмо.

Высылаю фрагмент презентации. Для выполнения заданий по дисциплине в


качестве руководства. Отправьте всем студентам группы.

Нижегородский государственный архитектурно-строительный университет

Кафедра информационных систем и технологий

Супрун Анатолий Николаевич

Профессор, доктор физико-математических наук

Математическая логика и теория алгоритмов

(для направления подготовки «Информационные системы и технологии»)


Нижний Новгород, 2018

Литература

Основная литература

1.    Гриченков Д.В., Потоцкий С.И. Математическая логика и теория


алгоритмов для программистов: учебное пособие. М.: КОНУС, 2010
– 208 с.

2.    Зарипова Э.Р., Кокотчикова М.Г., Севастьянов Л.А. Лекции по


дискретной математике. Математическая логика: учебное пособие.
М.: Российский ун-т дружбы народов, 2014.

3.    Маньшин М.Е. Математическая логика и теория алгоритмов:


учебное пособие. Волгоград: Волгоградский институт бизнеса,
Вузовское образование, 2013.

4.    Успенский В.А., Верещагин Н.К., Плиско В.Е. Вводный курс


математической логики: учебное пособие. М.: ФИЗМАТЛИТ, 2007.

5.    Балюк А.С., Винокуров С.Ф., Гайдуков А.И., Зубков О.В.,


Кириченко К.Д., Перязев Н.А. Избранные вопросы теории булевых
функций: учебное пособие. М.: ФИЗМАТЛИТ, 2001.

6.    Марченков С.С. Основы теории булевых функций: учебное


пособие. М.: ФИЗМАТЛИТ, 2014.

7.    Ершов Ю.Л., Палютин Е.А. Математическая логика: учебное


пособие. М.: ФИЗМАТЛИТ, 2011.

Дополнительная литература

1.    Гаврилов О.В. Типовые задачи по теме «Алгебра логики» и


«Логические основы ЭВМ» (на базе тестов ФЕПО): учебное
пособие. М.: Московский гуманитарный университет, 2014.
2.    Берков В.Ф. Логика: учебное пособие. Минск: ТетраСистемс,
2014.

3.    Закревский А.Д., Поттосин Ю.В., Черемисинова Л.Д. Логические


основы проектирования дискретных устройств. М.: ФИЗМАТЛИТ,
2007.

Дисциплина ориентирована на получение студентами знаний и


практических навыков по использованию методов решения практических
задач и их эффективной программной реализации.

Учебное пособие состоит из двух основных взаимосвязанных разделов:


«Математическая логика» и «Теория алгоритмов» с общей ориентацией
для IT-специалистов.

1.    Математическая логика.

Основные идеи построения логики на математической основе были


высказаны немецким математиков Г. Лейбницем, который допускал, что
основные понятия логики можно обозначить символами, соединяющимися
по особым правилам, позволяющим всякое логическое рассуждение
представить в виде математических вычислений. Идеи Г. Лейбница впервые
были реализованы английским учёным Джорджем Булем (1815-1864). Так
возникла наука математическая логика – наука, изучающая математические
доказательства. Объектами исследования математической логики (булевой
алгебры) являются высказывания (суждения), над которыми производятся
операции, аналогичные операциям над числами в алгебре.

1.1.        Булева алгебра (БА)

Булеву алгебру определяют как систему А=(В,  ), где В={0,


1} двухэлементное множество двоичных чисел, над которыми могут
производиться допустимые в БА математические операции из множества  -
аналогами логическим операциям.

Применение двухэлементных множеств можно встретить не только в


математике, но и в художественной литературе:

Но дружбы нет и той меж нами;


Все предрассудки истребя,
Мы почитаем всех нулями,
А единицами – себя.

(«Евгений Онегин», А.С. Пушкин).

Элементам множества В в БА традиционно принимается следующая


интерпретация: 1 - истинно; 0 – ложно.

БА обычно применяется:

1)    в языках программирования для описания логических условий;

2)    в математической логике, лингвистике, теории искусственного


интеллекта при формировании логических высказываний;

3)    в автоматике при разработке и описании дискретных


технических систем.

БА позволяет производить анализ и синтез логических устройств.


Анализ – это поиск аналитического выражения, которое описывает работу
системы. Синтез – обратная задача: создание технического устройства на
основе математического описания средствами БА.

Одним из базовых в БА является понятие высказывания.

Высказывание – это любое повествовательное предложение, в


отношении которого имеет смысл утверждение о его истинности или
ложности.

Обычно высказывания обозначаются буквами латинского алфавита,


например, a, b, x, A, B, X.

Для каждого высказывания вводится значение истинности, которое


может принимать только одно из двух возможных значений: 1 – истина,
0 – ложь.

1.2.        Функции БА

Рассмотрим здесь основные допустимые в БА математические


операции. Пусть имеется n двухэлементных {0, 1} двоичных
переменных x1, x2, …, xn. Тогда функцию БА  (логическую функцию) в
общем виде можно записать как ( x1, x2, …, xn) = у,

где у – некоторое двухэлементное число. Таким образом логическая функция


в БА устанавливает связь между сочетанием значений входных двухзначных
двоичных переменных и двухзначным двоичным значением этой функции.
Рассмотрим некоторые виды функций БА.

А. Функция одной переменной:

(x) = у.

К ней относится отрицание (инверсия). Это функция, выражающая


высказывание, которое истинно, если x ложно, и ложно, если x истинно.
Обозначается , читается «не x».

Записывается (x) = , иллюстрируется таблицей истинности.

x
0 1
1 0

В. Функции двух переменных:

(x1, x2) = у,

где x1, x2 – некоторые двухэлементные двоичные числа.

В.1. Дизъюнкция (логическое сложение)

Это функция, выражающая высказывание, которое истинно только


тогда, когда по крайней мере одно из высказываний x1 или x2 является
истинным.

Пример. Два друга захотели приобрести один предмет, который


выдаётся автоматом только одной монетой достоинством 10 р. Тогда они
сделают покупку, если хотя бы у одного из них будет такая монета.

Записывается (x1, x2) = x1  ˅  x2 (читается: x1 или x2). А также (x1, x2)


= x1  +  x2. Иллюстрируется указанной таблицей истинности.

x1 x2 x1 ˅ x2

0 0 0

0 1 1

1 0 1

1 1 1

В.2. Конъюнкция (логическое умножение)
Это функция, выражающая высказывание, которое истинно только
тогда, когда истинно оба высказывания.

Пример. Студент захотел приобрести один предмет, который выдаётся


автоматом только одной монетой достоинством 10 р. Тогда он сделает
покупку, если одновременно у него будет такая монета (x1 = 1) и автомат
будет в рабочем состоянии (x2 = 1).

Записывается (x1, x2) = x1  ˄  x2 (читается: x1 и x2). А также (x1, x2) =


x1  &  x2 = x1  ●  x2  = x1  x2.

x1 x2 x1 ˄ x2
0 0 0
0 1 0
1 0 0
1 1 1

В.3. Эквивалентность (равнозначность)

Это функция, выражающая истинное высказывание только тогда, когда


оба аргумента (x1 и x2) совпадают.

Пример. Два студента имеют эквивалентные успехи на зачёте без


оценки по математике.

Записывается (x1, x2) = x1  ~  x2 (читается: x1 равно x2).

x1 x2 x1 ~ x2
0 0 1
0 1 0
1 0 0
1 1 1

В.4. Инверсия функции (x1, x2)

Записывается . Означает, что следует инвертировать результат (x1, x2).

Заметим, что отрицание, дизъюнкция и конъюнкция являются наиболее


важными функциями в БА, т.к. все остальные функции в БА могут быть
выражены через эти три.

1.3.        Некоторые свойства основных логических функций

Укажем здесь некоторые свойства возможных преобразований в БА:


1)    коммуникативность дизъюнкции (x1  ˅  x2  = x2  ˅  x1) и конъюнкции
(x1  ˄  x2 = x2  ˄  x1);

2)    ассоциативность дизъюнкции x1  ˅  (x2  ˅  x3) = (x1  ˅  x2)  ˅  x3 и


конъюнкции x1  ●  (x2  ●  x3) = (x1  ●  x2)  ●  x3;

3)    идемпотентность дизъюнкции (x  ˅  x  = x)  и


конъюнкции (x  ●  x  = x);

4)    дистрибутивность:

- дизъюнкции относительно конъюнкции:


x1  ˅  (x2  ●  x3) = (x1  ˅  x2)  ● (x1  ˅  x3),

- конъюнкции относительно дизъюнкции:
x1  ●  (x2  ˅  x3) = (x1  ●  x2)  ˅ (x1  ●  x3);

5) двойное отрицание: = x;

6) правило де Моргано: = ˅ , = ● ;

7) правило «склеивания»: x1  ●  x2  ˅ x1  ●  = x1, (x1  ˅  x2) ● (x1  ˅) = x1;

8) действия с константами:

x    ˅  0 = x;  x  ●  0 = 0;

x    ˅  1 = x;  x  ●  1 = x;

x    ˅   = 1;  x    ●   = 0.

Доказательство справедливости указанных преобразований


можно построить с помощью таблиц истинности. Например, покажем,
что = ● (правило де Моргано).
x1 x2 x1  ˅  x2
0 0 0 1
0 1 1 0
1 0 1 0
1 1 1 0

x1 x2 ●

0 0 1 1 1
0 1 1 0 0
1 0 0 1 0
1 1 0 0 0
 

Мы получили, что значения функций и ● совпадают на всех возможных


наборах x1 и x2. Следовательно, = ● .

В качестве упражнений можно построить таблицы всех указанных в 1.3


свойств возможных преобразований в БА.

1.4.        Синтез и анализ логических устройств с применением


БА

Рассмотрим пример. Некоторое техническое устройство (U) должно


моделировать логическую функцию у = x1  ●  x2  ●  x3 + x1  ●  x2  ●  и состоять из
технических устройств, моделирующих логические операции дизъюнкцию
(логическое сложение), конъюнкцию (логическое умножение) и инверсию
(отрицание). Указанные технические устройства будем графически
изображать в виде треугольников:

Тогда можно изобразить следующую схему устройства U (этап


синтеза):
В результате мы получим
у = x1  ˄  x2  ˄  x3 + x1  ˄  x2  ˄  = x1  ˄  x2  ˄ (x3 +) = x1  ˄  x2  ˄ 1 = x1  ˄  x2
или  у = x1  ˄  x2, т. е.

Следовательно, алгебраические преобразования математического


представления функции устройства U позволили получить более простую
техническую схему (этап анализа).

2.    Теория алгоритмов

Термин «алгоритм» произошёл от имени узбекского математика Аль-


Хорезми (из Хорезма) – автора «Книги о восстановлении и
противопоставлении» (IX век), где были изложены простейшие алгоритмы
выполнения действий в арифметике и алгебре. Однако до сих пор этому
термину не дано строго научного определения. В таком случае обычно
прибегают к формулировке определения термина на основе общепринятого
понятия. Сегодня термину алгоритм можно дать следующее определение.

Алгоритм – это конкретный план действий, состоящий из


последовательности конечного числа понятных пользователю шагов к
искомому результату.

2.1.        Общие сведения об алгоритмах

Укажем здесь основные требования к алгоритмам.

А. Понятность. Алгоритм должен быть доступен для понимания


классу пользователей, для которого он предназначен.

В. Массовость. Применимость ко всем задачам рассматриваемого


класса при любых исходных данных, удовлетворяющих оговорённым
ограничениям.

С. Определённость. Любое указание алгоритма должно быть строго


определено не допуская неоднозначность толкования.
D. Дискретность. Представимость всякого определяемого алгоритмом
процесса в виде последовательности выполняемых отдельных (дискретных)
законченных шагов.

Е. Результативность. Выполнение алгоритма должно всегда


приводить к получению результата за конечное число шагов.

В теории алгоритмов используется ряд общепринятых терминов.

Операция. Элементарная часть алгоритма.

Оператор – математическое понятие, означающее в самом общем


смысле соответствие между элементами двух множеств X и Y, относящее
каждому элементу x  ∈ X некоторый элемент y  ∈ Y. Например X и Y могут
быть множествами некоторых функций. В теории алгоритмов
подразумевается, что оператор объединяет одну или несколько выполняемых
последовательно операций. Будем обозначать буквой А.

Предикат. Условный оператор, который в зависимости от истинности


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

Цикл. Один или несколько многократно выполняемых операторов.


Цикл внутри себя может иметь ветвления. Должен иметь ограничения для
исключения возможного «зацикливания» вычислительного процесса.

2.2.        Описание алгоритмов

На языке публикаций часто используется словесное описание


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

Наиболее часто в публикациях и отчётах получило применение


описания алгоритмов в виде блок-схем (см. ниже), т.е. в виде графов, где
вершинами могут быть операторы или предикаты, а рёбрами – переходы.
Здесь «+» и «-» означает направление вычисления в зависимости от
истинности предиката. В блок-схеме каждый оператор А1, А2,… может быть
либо элементарным, либо многокомпонентным, вплоть до самостоятельного
алгоритма.

Обычно структура алгоритма связывается с машинной математикой.


Впервые такой алгоритм был построен в 1937 г. и исследован английским
математиком Алан Тьюринг.

Гипотетическая машина Тьюринга должна состоять из разбитой на


ячейки бесконечной ленты, считывающей-записывающей информацию
головки управляющего устройства.

Основной тезис А. Тьюринга: всякий алгоритм может быть задан


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

2.3.        Примеры алгоритмов

Рассмотрим следующую задачу.

Для заданного х определить – попадает ли х в множество , заданное


следующими условиями:

x ≤ -2, -1 ≤ x ≤ 1, x ≥ 2.

Пусть e двухэлементная двоичная переменная и при e = 0 х не


принадлежит , при e = 1 – принадлежит .

Введём ещё 4 булевых переменных:

a = 1 при х ≤ -2, а = 0 при х > -2;

b = 1 при х ≥ -1, b = 0 при x < -1;

c = 1 при х ≤ 1, с = 0 при х > 1;

d = 1 при х ≥ 2, d = 0 при х < 2.

Тогда e = a + b ● c + d.

Алгоритм вычисления
 
 

 
 

 
x1  ˄  x2  ˄  x3
 

 
 

x1  ˄  x2  ˄
 

x1  ˄  x2
 
x1  ˄  x2
 
x3

 
 
x3

 
 
x2

 
 
x1
 
 

3.              Язык C#

Типы данных в C#


3.1.        Логический тип данных

Тип bool представляет два логических значения: "истина" и "ложь". Эти


логические значения обозначаются в C# зарезервированными словами true и
false соответственно. Следовательно, переменная или выражение типа bool
будет принимать одно из этих логических значений. Кроме того, в C# не
определено взаимное преобразование логических и целых значений.
Например, 1 не преобразуется в значение true, а 0 — в значение false.

3.2.        Операторы отношения и логические операторы

Операторы отношения

Логические операторы
3.3.        Операции сравнения

В операциях сравнения сравниваются два операнда и возвращается значение


типа bool – true, если выражение верно, и false, если выражение неверно.

1)    = =   равны

Сравнивает два операнда на равенство. Если они равны, то операция


возвращает true, если не равны, то возвращает false:

1                int a = 10;

2                int b = 4;

3                bool c = a = = b;

2)    ! =    не равны

Сравнивает два операнда и возвращает true, если операнды не равны, и false,


если они равны.

1                int a = 10;

2                int b = 4;

3                bool c = a ! = b;

4                bool d = a ! = 10;

3)    <       строго меньше чем

Операция «меньше чем». Возвращает true, если первый операнд меньше


второго, и false, если первый операнд больше второго:

1                int a = 10;

2                int b = 4;
3                bool c = a < b;

4)    >       строго больше чем

Операция «больше чем». Сравнивает два операнда и возвращает true, если


первый операнд больше второго, иначе возвращает false:

1                int a = 10;

2                int b = 4;

3                bool c = a > b;

4                bool d = a > 25;

5)    < =   меньше или равно

Операция «меньше или равно». Сравнивает два операнда и возвращает true,


если первый операнд меньше или равен второму. Иначе возвращает false.

1                int a = 10;

2                int b = 4;

3                bool c = a < = b;

4                bool d = a < = 25;

6)    > =   больше или равно

Операция «больше или равно». Сравнивает два операнда и возвращает true,


если первый операнд больше или равен второму, иначе возвращается false:

1                int a = 10;

2                int b = 4;

3                bool c = a > = b;

4                bool d = a > = 25;

3.4.        Логические операции

Как правило, применяются к отношениям и объединяют несколько операций


сравнения.
1)| логическое сложение (или) дизъюнкция

Операция логического сложения или логическое ИЛИ. Возвращает true, если


хотя бы один из операндов возвращает true.

1                bool x1 = (5 > 6) | (4 < 6);

2                bool x2 = (5 > 6) | (4 > 6);

2)&        логическое умножение, конъюнкция (и)

Операция логического умножения или логическое И. Возвращает true, если


оба операнда одновременно равны true.

1                bool x1 = (5 > 6) & (4 < 6);

2                bool x2 = (5 < 6) & (4 < 6);

3)||

Операция логического сложения. Возвращает true, если хотя бы один из


операндов возвращает true.

1                bool x1 = (5 > 6) || (4 < 6);

2                bool x2 = (5 > 6) || (4 > 6);

4)&&

Операция логического умножения. Возвращает true, если оба операнда


одновременно равны true.

1                bool x1 = (5 > 6) && (4 < 6);

2                bool x2 = (5 < 6) && (4 < 6);

5)!         логическое отрицание

Операция логического отрицания. Производится над одним операндом и


возвращает true, если операнд равен false. Если операнд равен true, то
операция возвращает false.

1                bool a = true;
2                bool b = !a;

6)^        Операция исключающего ИЛИ.

Возвращает true, если либо первый, либо второй операнд (но не


одновременно) равны true, иначе возвращает false

1                bool x5 = (5 > 6) ^ (4 < 6); // 6 – false, 4 < 6 –


true, поэтому true

2                bool x6 = (50 > 6) ^ (4 / 2 < 3); // 6 – true, 4/2 < 3 –


true, поэтому false

3.5.        Задача

Рассмотрим задачу  пункт 2.3

a<b<c<d

   при х ≤ а, w=w1;

          при b≤ х ≤ с, w=w2;

          при х ≥d, w=w3;

          w= 0 при a < х < b или при c < х < d

                    Построить программу, возвращающую для


заданного х сообщение о принадлежности х или w1, или w2, или w3,
или х вне W (w1+w2+w3).

    int a = 1;

    int b = 4;
    int c = 10;

    int d = 14;

    int x = 0;

    if (x<=a)

          Console.WriteLine(“w1");

    else if ((x>=b)&&(x<=c));

          Console.WriteLine(“w2");

    else if (x>=d);

          Console.WriteLine(“w3");

    else

          Console.WriteLine(“вне W");

using  System;

using  System.Collections.Generic;

using  System.Linq;

using  System.Text;

namespace ConsoleApplication1

          class Program

          {
                    static void Main(string[] args)

                    {

                              double x, a=-5, b=-1, c=3, d=7;

                              x=Convert.ToDouble(Console.ReadLine());

                              if (x<=a)

                                    Console.WriteLine(“w1");

                              else if (x>=b&&x<=c)

                                    Console.WriteLine(“w2");

                             else if (x>=d)

                                    Console.WriteLine(“w3");

                              else

                                    Console.WriteLine(“вне W");

                              Console.ReadKey();

                    }

          }