Логические операции Применение двоичной системы счисления дает возможность использовать аппарат математической логики, в частности исчисление высказываний. В математической логике под высказыванием понимается любое предложение, относительно которого имеет смысл говорить об его истинности или ложности. Предложения которые могут быть одновременно истинными и ложными или частично истинными, в математической логике не рассматриваются. При оценке высказываний мы будем принимать во внимание лишь их истинность или ложность, никак не учитывая их конкретного содержания Высказывания будем обозначать заглавными буквами латинского алфавита Если A истинно, то будем писать A=1, если ложно A=0 Математическая логика изучает вопросы представления и преобразования двоичных функций от двоичных аргументов посредством некоторых логических операций, называемыми логическими связями Из простых выражений посредством логических связей могут быть составлены сложные высказывания, принимающие значения истинно (1) или ложно (0) в зависимости от значения составляющих простых высказываний Так как высказывания можно рассматривать как двоичные переменные, то логические связи между высказываниями можно представить как операции над двоичными переменными величинами Определим основные логические операции 1. Отрицание (унарная) _ А - читается “не A” (обозначается ¬ A) (в С - !A) 1 0 результат 0 1 Операция отрицание называется также инверсией, логическим НЕ Отрицание высказывания А является высказывание, которое ложно, когда А истинно, и истинно, когда А ложно 2. Логическое умножение А B - читается “A и B” (обозначается A /\ B) (в С - A & B ) 0 /\ 0 0 /\ 1 1 /\ 0 1 /\ 1 результат = 0 = 0 = 0 = 1 Операция логического умножения называется конъюнкцией, или логическим И, логическим умножением. Конъюнкция двух высказываний представляет собой сложное высказывание, которое истинно тогда и только тогда, когда истинны оба составляющих его высказывания. 3. Логическое сложение А B - читается “A и B” (обозначается A \/ B) (в С - A | B ) 0 \/ 0 0 \/ 1 1 \/ 0 1 \/ 1 результат = 0 = 1 = 1 = 1 Операция логического сложения называется дизъюнкцией, логическим ИЛИ, логическим сложением. Дизъюнкция двух высказываний представляет собой сложное высказывание, которое ложно, тогда и только тогда, когда оба слагаемых ложно В исчислении высказываний доказывается, что любое сложное высказывание может быть построено из простых при помощи операций отрицания, логического умножения и логического сложения Modus ponens — правило вывода в исчислении высказываний 4. Следование (импликация) А B - обозначается A → B результат 0→0 0→1 1→0 1→1 = = = = 1 1 0 1 Импликация как булева функция ложна лишь тогда, когда посылка истинна, а следствие ложно. Операция A → B определяет логическую функцию, тождественно совпадающую с функцией ¬ A \/ B . 5. Равнозначность (эквивалентность) А B - читается “A равнозначно B” результат 00 01 10 11 = = = = 1 0 0 1 Равнозначность двух высказываний представляет собой сложное высказывание, которое истинно, когда оба его составляющих имеют одинаковой значение истинности и ложна в противоположном случае 6. Сложение по модулю 2 А B - (в С - A ^ B ) результат 00 01 10 11 = = = = 0 1 1 0 Операция сложения по модулю 2 выражается через операции равнозначности и отрицания по формуле _____ AB =AB Приоритеты логических операций Инверсия (отрицание) Конъюнкция (логическое умножение) Дизъюнкция (логическое сложение) Импликация (следование) Таким образом: ¬ A /\ B \/ C /\ D То же самое ((¬ A) /\ B) \/ (C /\ D) Для логических ассоциативность операций Проверить следующие формулы (вместо звездочки произвольная операция). Проверка осуществляется подстановкой переменных значений 0 или 1 в различных комбинациях и применением таблиц, определяющих эти операции A * B = B *A (A * B) * C = A *(B*C) Например: A /\ (B \/ C) = ( A /\ B ) \/ (A /\ C) выполняется коммутативность Коммутативность Ассоциативность и Табличный способ определения истинности сложного выражения имеет ограниченное применение, так как при увеличении числа логических переменных приходится перебирать слишком много вариантов. В таких случаях используют способ приведения формул к нормальной форме. Формула имеет нормальную форму, если в ней отсутствуют знаки эквивалентности, импликации и двойного отрицания, а все знаки отрицания относятся только к переменным, а не к выражениям. Следующие формулы преобразований дополняют сформулированные выше законы булевой алгебры и позволяют приводить формулы к нормальной форме. ¬(¬ A) = A ¬(A & B) = ¬ A | ¬ B ¬(A | B) = ¬ A & ¬ B ¬(A→B) = A & ¬ B A→B =¬A|B AB = (A & B) | (¬A & ¬B) =(¬A | B) & (A | ¬B) Знание законов математической логики позволяет решать так называемые логические задачи, возникающие в различных жизненных ситуациях. Воспользуемся исчислением высказываний для решения следующих двух задач. Задача 1. Следователь допрашивал четырех гангстеров по делу о похищении автомобиля. Джек сказал: "Если Том не угонял автомобиля, то его угнал Боб". Боб сказал: "Если Джек не угонял автомобиля, то его угнал Том". Фред сказал: "Если Том не угонял автомобиля, то его угнал Джек". Том сказал: "Если Боб не угонял автомобиля, то его угнал я". Удалось выяснить, что Боб солгал, а Том сказал правду. Правдивы ли показания Джека и Фреда? Кто угнал машину? Решение: Определим следующие простые высказывания: А - "машину угнал Боб"; В - "машину угнал Том"; С - "машину угнал Джек"; D - "машину угнал Фред". Запишем (и сразу упростим) сложные высказывания, выражающие приведенные факты: (1) !B -> A = !( !B) | A = B | A (истинность неизвестна); (2) !C -> B = !( !C) | B = C | B = F (высказывание ложно); (3) !B -> C = !( !B) | C = B | C = C | B (истинность неизвестна); (4) !A -> B = !( !A) | B = A | B = T (высказывание истинно). Заметим, что после упрощения высказывание (3) совпало с высказыванием (2), которое ложно. Таким образом, высказывание (3), произнесенное Фредом, также ложно. Из ложности высказывания (2) следует ложность каждого дизъюнкта, входящего в него, т. е. C = F и B = F. Подставив найденное значение B в высказывание (4) получаем A || B = A || F = T, что возможно лишь если A = T, т. е. машину угнал Боб. Рассмотрим высказывание Джека (1): B | A = F | T = T - оно истинно. Итак, Джек сказал правду, а Фред соврал. Машину угнал Боб. Пример Кто из людей A, B, C и D играет, а кто не играет в шахматы, если известно следующее: а) если А или В играет, то С не играет; б) если В не играет, то играют С и D; в) С играет. Решение Определим следующие простые высказывания: А - "А играет в шахматы"; В - "В играет в шахматы"; С - "С играет в шахматы"; D - "D играет в шахматы". Запишем сложные высказывания, выражающие известные факты: a) (A & B) -> !C; б) !B -> C & D; в) C Запишем произведение (конъюнкцию) указанных сложных высказываний. Так как все они истинны, то и произведение тоже истинно: ((A | B) -> !C) & ( !B -> C & D) & C = T. Упростив эту формулу, получим !A & !B & C & D = T. Отсюда по свойствам конъюнкции получаем, A = F, B = F, C = T, D = T. Значит, в шахматы играют C и D, а A и B - не играют. Во многих задачах, связанных с обработкой данных, приходится упрощать логические выражения. Приведем пример, демонстрирующий технику упрощения логических формул. Упростим логическую формулу !( (A || B) -> !( B || C)). Решение !( (A | B) -> !( B | C)) = !( !(A | B) | !( B | C)) = !( !(A | B)) & !( !( B | C)) = (A | B) & (B | C) = { дистрибутивность операции ИЛИ } (A | B) & B | ( A | B) & C = A&B|B|A&C|B&C= B & (A | T) | C & (A & B) = B|A&C|B&C= B & (T | C) | A & C = B | A & C. 6. Стрелка Пирса Стрелка Пирса (символ Лукашевича) — двуместная логическая операция, введена в рассмотрение Ч. Пирсом (Сh. Peirce). Стрелка Пирса, обычно обозначаемая ↓, задаётся следующей таблицей истинности: результат 0↓0 0↓1 1↓0 1↓1 = = = = 1 0 0 0 Таким образом, высказывание A ↓ B означает «ни A, ни B». Стрелка Пирса обладает тем свойством, что через неё одну выражаются все другие логические операции. Например, высказывание ¬A (отрицание A) эквивалентно высказыванию A↓A, конъюнкция A /\ B выражается так: (A ↓ A) ↓(B ↓ B) , дизъюнкция A \/ B эквивалентна (A ↓ B) ↓(A ↓ B) . Логические операторы в C 2. операции отношения == != < > <= >= Отношения имеют приоритет ниже арифметических. i < lim-1; Вычисляется как i < (lim-1); Пример: год будет високосным, если он делится на 4, но не делится на 100, однако годы делящиеся на 400 тоже високосные if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) год високосный; else год невисокосный ; Результатом всякой операции отношения является числовое значение типа int, равное единице, если сравнение истинно, и нулю в противном случае Таким образом, операции отношения во внутреннем машинном представлении приводят к арифметическому результату Замечание. Строго говоря, логическое значение "истина" должно отвечать любому числовому значению, отличному от нуля. В дальнейшем мы увидим, что именно такое соглашение принято в языке Си. Это дает возможность объединить понятия арифметического, условного и логического выражений в едином понятии "выражение", что очень важно с точки зрения гибкости и "симметричности" языка Выражения, сконструированные при помощи операций отношения, принято называть условными выражениями 3. логические связки ! || && Приоритет ниже, чем у операций отношения Выражения с && и || вычисляются слева направо и вычисления заканчиваются, когда определяется истинность или ложность результата for (i=0; i<lim-1; &&(c=getch())!= ’\n’ && c != EOF; ++i) s[i]=c; Скобки (c=getch()) нужны, поскольку приоритет присваивания ниже Унарная операция ! преобразует ненулевой операнд в ноль, и наоборот if (!inword) то же, что и if(inword==0) 4. побитовые операции ~ Операции для работы с разрядами. Их нельзя применять к float и double & - поразрядное И. c = m & 0177; - Устанавливает в 0 все разряды, кроме младших семи | - поразрядное ИЛИ x =x | MASK; - Устанавливает в 1 те разряды x, которым соответствует 1 в MASK ^ - исключающее ИЛИ. Результат содержит 1 в тех разрядах в которых разные значения, 0 в остальных. << >> & | ^ << >> - сдвиг влево, сдвиг вправо. x=x<<2; // сдвигает x влево на два разряда. x=x>>2; // сдвигает x вправо на два разряда. На некоторых машинах приводит к размножению знакового разряда ~ - унарная операция дополнение до 1. 1 где 0 и 0 где 1. x =x & ~077; // - Устанавливает в 0 6 разрядов x.