# Logical Expressions/Логические выражения

1. [Магия транзисторов: как мы научили компьютеры думать с помощью кусочков кремния?](https://www.youtube.com/watch?v=_5W_GZOPa8E)

Логические выражения — это комбинации **логических операторов** и **операндов**, которые оцениваются как истинные или ложные. 
Логические выражения часто используются для создания условий в программах, таких как условные операторы (if, while).

В выражении A + B:

* `A` и `B`     — это **операнды**.
* `+` или `==`  — это **оператор**, который выполняет операцию сложения.

При записи логических формул вместо слов “истина” и “ложь” обычно используют стандартные международные обозначения:
* вместо “истина” пишут: true, T, t, 1;
* вместо “ложь” пишут: false, F, f, 0;

## Logical Operators (логические операторы)

В программировании обозначение логических операций зависит от синтаксиса конкретного языка программирования. Но в общем смысле операторы выглядят так:

<table>
  <tr>
    <th>Группа</th>
    <th>Название (рус.)</th>
    <th>Название (англ.)</th>
    <th>Логическое название (рус.)</th>
    <th>Операторы в коде</th>
    <th>Математический символ</th>
    <th>Ассоциативность</th>
  </tr>
  <tr>
    <th rowspan="2">Унарные функции (с 1й переменной)</th>
    <td>1. Отрицание (инверсия)</td>
    <td>Negation</td>
    <td>НЕ (логическая инверсия)</td>
    <td>NOT, !</td>
    <td>¬a</td>
    <td>Справа налево (правоассоциативный)</td>
  </tr>
  <tr>
    <td>2. Идентичность</td>
    <td>Identity</td>
    <td>Логическая тождественность</td>
    <td>IS, ===</td>
    <td>a ≡ b</td>
    <td>Слева направо (левоассоциативный)</td>
  </tr>
  <tr>
    <th rowspan="6">Функции с 2мя переменными</th>
    <td>3. Эквиваленция</td>
    <td>Equivalence</td>
    <td>Равно (логическая равнозначность)</td>
    <td>EQ, XNOR, =, ==</td>
    <td>a ⇔ b</td>
    <td>Слева направо (левоассоциативный)</td>
  </tr>
  <tr>
    <td>4. Конъюнкция</td>
    <td>Conjunction</td>
    <td>И (логическое умножение)</td>
    <td>AND, &, &&</td>
    <td>a ∧ b</td>
    <td>Слева направо (левоассоциативный)</td>
  </tr>
  <tr>
    <td>5. Дизъюнкция</td>
    <td>Disjunction</td>
    <td>ИЛИ (логическое сложение)</td>
    <td>OR, |, ||</td>
    <td>a ∨ b</td>
    <td>Слева направо (левоассоциативный)</td>
  </tr>
  <tr>
    <td>6. Исключающее «или»</td>
    <td>Exclusive OR</td>
    <td>Исключающее ИЛИ (логическая неравнозначность)</td>
    <td>XOR, ^, ~</td>
    <td>a ⊕ b</td>
    <td>Слева направо (левоассоциативный)</td>
  </tr>
  <tr>
    <td>7. Импликация</td>
    <td>Implication</td>
    <td>Следование (не более)</td>
    <td>-></td>
    <td>a → b</td>
    <td>Справа налево (правоассоциативный)</td>
  </tr>
  <tr>
    <td>8. Обратная импликация</td>
    <td>Reverse Implication</td>
    <td>Следование (не менее)</td>
    <td><-</td>
    <td>b ← a</td>
    <td>Справа налево (правоассоциативный)</td>
  </tr>
</table>

## Truth Tables (таблицы истинности)

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

> Таблица истинности - это результат логических выражений

![LogicalExpressionsWithAssociative](/pictures/ComputerScience/LogicalExpressionsWithAssociative.jpg?raw=true)

### OR/XOR

Обратите внимание на разницу между операциями “ИЛИ” и “XOR”. Она заключается только в последнем правиле:

* true ИЛИ true = true
* true XOR true = false

В **русском языке** обе операции изображаются одним и тем же союзом “или”. Это – пример неоднозначности естественного языка. Омонимы и многозначные слова могут иметь больше одного значения. Союз “или” именно такой: он имеет два возможных значения. Первое выражается логической операцией “ИЛИ”, второе – логической операцией “XOR”.

В **английском языке** существуют те же проблемы: союз “or” имеет те же два значения. А вот **древним римлянам** было проще, так как в латыни есть два разных слова: “vel” (операция “ИЛИ”) и “aut” (операция “XOR”).

Поскольку разница между операциями “ИЛИ” и “XOR” невелика (всего одно последнее правило), то иногда эта разница не имеет значения. Иногда о том, что имеется в виду, можно догадаться по интонации, или по контексту. Иногда определить точный смысл так и не удается.

### Шифрование используя XOR

Нагладные действия операции XOR: ( на языке Python):

```python
x = 5
y = 7

x = x^y     # x == 2
y = x^y     # y == 5
x = x^y     # x == 7
```

Шифрование XOR, которое используют `(a XOR key) XOR key = a`. Часто [юзают в CTF соревнованиях](https://kmb.cybber.ru/crypto/xor/main.html).

Шифр Вернама использует побитовую [XOR(исключающее ИЛИ)](./2.1.3.1%20Logical%20Expressions.md) версию шифра Виженера.

![OTPEncryption](/pictures/ComputerScience/OTPEncryption.png?raw=true)

## Operator Precedence (приоритет операторов)

**Приоритетность (precedence)**: какой оператор выполняется 1м среди разных операторов при отсутствии группирующих скобок. Н/р, 3 + 5 * 2

**Ассоциативность**: порядок выполнения операторов одного приоритета.
Н/р, a ?? b ?? c ?? 10 - ?? выполняется справо налево

Как определяются порядок выполнения логических операций в выражениях (например, NOT имеет более высокий приоритет, чем AND, а AND — выше, чем OR).

---

[2.1.3 Operators Theme Folder](../2.1.3%20Operators/) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [Unary Operators Theme](./2.1.3.2%20Unary.md)