Нет, сегодня речь пойдет не о философии. Мы поговорим о том, что такое истина с точки зрения цифровых технологий.
Истина в программировании важна не менее чем в жизни, от нее постоянно зависит выбор, делать то или иное. В математике существует целая “область” изучающая, по сути, истинность высказываний.
Алгебра логики (булева алгебра) — это раздел математики, изучающий высказывания, рассматриваемые со стороны их логических значений (истинности или ложности) и логических операций над ними. Алгебра логики позволяет закодировать любые утверждения, истинность или ложность которых нужно доказать, а затем манипулировать ими подобно обычным числам в математике.
Математики всегда стремятся свести все к формулам, почему же так? Все дело в том, что тогда мир упрощается, если какое-то событие подчиняется закону, конкретной формуле, то его итог можно предопределить, с высокой точностью. Истинна не осталась в стороне, математики смогли разработать специфичные операции над истинными или ложными утверждениями.
Для чего же она нужна нам с вами? Как я уже сказал, она связана с выбором. Мы уже рассматривали ветвления, в которых зависимо от того, выполняется ли условие или нет происходило то либо иное действие. На самом деле, если немного углубиться в суть процесса, то выяснится, что определенное действие происходит в том случае, если условие (высказывание) истинно (или ложно). То есть сами того не зная, мы уже сталкивались с булевой алгеброй, в каком-то смысле. Забегая немного в перед, стоит отметить, что работа любого ПК невозможна без логических операций, и даже уже знакомые нам арифметические операции можно реализовать с помощью логических. Так что же это за такие магические операции?
Для начала вам стоит знать кое-что об истине.
“Противолежащие друг другу высказывания об одном и том же не могут быть истинны в одно и то же время.” © Аристотель
И это действительно так, высказывание либо ложно, либо истинно. Тут проглядывается прелесть дискретности, нету ни каких “серых” высказываний, ни у кого нет “своей правды”, есть лишь ложь и истина, как черное и белое.
Существует множество обозначений истинны и лжи, типичные из них, которые нам встретятся, это
Ложь:
- «0»
- False
- Ложь
Истина:
- «1»
- True
- Истина
А теперь сами операции.
Конъюнкция (внимание Ъ знак) - операция “И”, иногда называется логическим умножением из-за некой схожести, но не взаимозаменяемо с арифметическим умножением.
Она почти буквально является “И”. Ее типичные обозначения, встречающиеся в разных источниках и областях применения,
& - амперсанд
Для того, чтобы производить какие-то “вычисления”, нужно знать как работает конкретная операция, для упрощения понимания обычно приводят так называемые таблицы истинности, которые однозначно описывают принцип работы операции.
Таблица истинности для логического “И” выглядит следующим образом. Так как операция побитовая, то есть она работает на уровне битов. Есть значение слева и с права, учитывая что в двоичной системе всего 2 возможных числа, вариантов их комбинаций не так много.
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
Вроде не сложно. Прям проговорите, заменив & на “и”, а 0 на “Ложь”, 1 на “истина”.
Стоит запомнить, что при операции “И” результат является истинным лишь в том случае, когда оба значения были истины, в остальных случаях значение будет ложь. Это понимание очень упрощает работу, допустим у нас ест некая функция f
F = 1 & A & 1 & 0 & B
Каково ее значение? Ложно или истинно? У нас еще есть неизвестные, как узнать их значения? Они нам не важны, среди всех значений есть 0, а значит f = 0. Тут прослеживается связь логической операции с алгебраической.
F = 1 * A * 1 * 0 * B — это ведь не вызвало бы вопросов, верно?
Дизъю́нкция - операция “ИЛИ”, ассоциируется с арифметическим сложением, и иногда называется булевым(логическим) сложением.
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
Стоить отметить, что при множественных “или”, результат будет истинным если хотя бы одно значение истинно.
F = 1 | A | 1 | 0 | B = 1
F = 1 + A + 1 + 0 + B = 1
единицы не складываются, это лишь обозначение, еще одно, кстати.
И, пожалуй, самая интересная
Отрицание, нет, это не один из этапов принятия действительности. Это такая же логическая операция, которой вроде нет аналога в алгебре, разве только знак минуса перед числом.
Отрицание - оно же логическое “НЕ”, унарный, в отличии от предыдущих, то есть у него всего одно значение с которым она работает, и самое главное, она меняет его значения на противоположное.
not A (независимо от букв, естественно)
Таблица истинности очень простая
not 0 = 1
not 1 = 0
Не ложь, значит истина, не истина, значит ложь. Как и говорил Аристотель.
Существует так же логическая операция, с которой может возникнут загвоздка, из-за ее фактически схожего назначения.
Эквивалентность - эквивалентно, значит такой же, значит равно.
Бинарная операция, суть которая следующая. Результат истинный, если оба значения одинаковы.
Обозначения:
A~B, A=B, A==B, A EQU B, и некоторые другие (там возникают тонкости, и границы между равенством и эквивалентностью, в которые нам лучше пока не лезть)
Таблица истинности выглядит вот так
0 ~ 0 = 1
0 ~ 1 = 0
1 ~ 0 = 0
1 ~ 1 = 1
И, пожалуй, последняя на сегодня.
Исключающее ИЛИ. Опять же, если не вдаваться в тонкости, и не искать разницы между “и\или” и просто “и”, то суть ее заключается в том, что ее значение истинно, когда значения разные.
A XOR B
Таблица истинности выглядит вот так.
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
Если мы взглянем на эквивалентность, то заметим вот что EQU = not(xor). То есть, результат операции эквивалентности, эквивалентен отрицанию результата искл.или. Магия. На самом деле такие преобразования парой очень упрощают жизнь электронщику, и людям, работающим с булевыми функциями.
Так же, как и в алгебре у логических операций есть приоритеты, многие источники утверждают, что
Но есть мнение, с доказательством, что “И” и “ИЛИ” имеют одинаковый приоритет. (пруфов не будет)
Как вы заметили, я показал не все функции, а лишь некоторые базовые, дело в том, что их много, и не все они нам нужны, а те что понадобятся, думаю будет не сложно изучить самостоятельно (ну или я как обычно упомяну о том, что они из себя представляют, там где надо).
А теперь немного о ветвлениях.
Допустим перед нами опять стоит задача принести колбасу, определенного типа, в таком случае условие по ее выбору мы теперь можем записать следующим образом.
название колбасы = kolbasa
Что будет читаться как название колбасы эквивалентно kolbasa. Все логические операции можно собирать в логические функции, так же как и с арифметическими, и находить их значение, согласно приоритету, с учетом скобок. Допустим наша колбаса, помимо всего прочего, должна быть еще и не открытой, давайте добавим значение notOpen - которое будет булевым, то есть способным принимать лишь значение истина и ложь, тогда условие в ветвлении можно будет записать примерно так.
(тип колбасы = kolbasa) & (notOpen = true)
Дело в том, что в программировании эквивалентность или логическое равенство, допустимо применять не только к логическим значениям, но ее результат будет таким же, если они эквивалентны, то результат истина, иначе - ложь.
Последняя функция (согласно скобкам) у нас “И”, значит, что обе скобки должны быть истинны, иначе мы получим ложь. Первая истинная, если это нужная колбаса, а вторая, если она не открыта. Поэтому записанное выше, можно трактовать как, если тип колбасы эквивалентен kolbasa и она не открыта, то результат будет истинным.
Многабукаф, я понимаю, но все это проще чем кажется и со временем вы в этом убедитесь.