ITлогикапрограммированиемышлениеимпликацияалгоритмыПочему логическая импликация кажется неинтуитивнойК@ilyabirman_channelмедиа / агрегатор1 месИмпликация, следствие и условия Никита Прокопов написал, что импликация — нифига не интуитивная штука, и поэтому её нет в языках программирования. И действительно: там в комментариях начался обмен мнениями, который хорошо иллюстрирует неинтуитивность. И мне сразу захотелось написать этот пост. Импликация — это логическая операция вида «A → B». Она истинна во всех случаях кроме одного: когда A истинно, а B ложно. Можно оценить по таблице истинности: A B A → B 0 0 1 0 1 1 1 0 0 1 1 1 То же самое можно сформулировать как «из истины следует истина, а из лжи — что угодно». Кажется, что это простая штука, ведь в жизни мы легко понимаем выражения типа «Если A, то B» или «Из A следует B». Но если сказать, что «из 2×2=4 следует что Волга впадает в Каспийское море» (V), большинство воспротивится этому. Почему, ведь с точки зрения логики это верное утверждение? Дело тут в том, что мы не интерпретируем фразу V буквально. Мы видим, что в общем случае из математического равенства не следует географический вывод. То есть мы подсознательно обобщаем V, превращаем в шаблон, и тогда импликация разрушается. Мы понимаем, что имея лишь «2×2=4» и не зная ничего про Волгу, невозможно сделать вывод о том, куда она впадает. Но импликация означает истинность конкретного этого высказывания, а не то, что высказывание сохранит истинность при обобщении. Зачем мы вообще стали обобщать? Почему мы не можем оценить истинность импликации буквально? Потому что это низачем не нужно никогда, и наш мозг не научен так думать. Следует ли из одного высказывания другое нас интересует лишь тогда, когда мы не знаем истинности одного из них. Но если мы уже знаем истинность обоих высказываний, то у нас просто не возникает вопроса о том, как выводить истинность одного из них из истинности другого — это же совершенно бессмысленнно! Высказывания типа «Если A, то B» нас интересуют как способ выводить истинность B из истинности A или наоборот, то есть только тогда, когда мы не знаем одно из них. А для этого нам нужно вскрыть содержательную связь между A и B, а не просто значения их истинности. Тут-то нам и нужны шаблоны, да такие, что мы уже заранее знаем, что импликация там истинна! Предположим, мы знаем, что «у каждого голландца есть велосипед» (K). Заметьте, что это уже утверждение, содержащее импликацию («если человек голландец, то у него есть велосипед»), и мы уже договорились, что оно истинно. Вот теперь если мы узнаем, что Фёдор голландец, мы сделаем вывод о том, что у него есть велосипед. Импликация помогла сделать этот вывод только потому, что мы 1) уже знали, что сама она истинна, и вдобавок 2) она имела форму шаблона, в который можно было подставить Фёдора. От истинности же импликации V из начала заметки нет никакого проку. Поэтому с такими видами совершенно верных высказываний мы никогда не имеем дела. Они нам кажутся настолько пустыми, что мы не готовы даже пытаться оценивать из истинность.логикапрограммированиемышлениеимпликацияалгоритмы
ITлогикапрограммированиеимпликациякодалгоритмыпсихологияПочему импликация — плохой выбор для кодаС@nikitonsky_pubмедиа / агрегатор1 месУ Vsauce попалось видео про задачу, которую фейлят большинство людей. Называется The Reasoning Test Psychologists Still Can't Explain. Задача такая: - Перед вами на стол выкладывают четыре карты, на которых написано: A, G, 7, 8 - По условию, на каждой карте с одной стороны цифра, с другой буква. Т.е. на A и G с обратной стороны какие-то цифры (вы их не видите), на 7 и 8, соответственно, буквы, которые вы не видите тоже. - Вам нужно проверить, выполняется ли для выложенных карт следующее утверждение: «Если с одной стороны карты буква A, то с другой стороны цифра 7». - Вопрос: какие карты вам обязательно нужно перевернуть, чтобы определить, истинно это утверждение для выложенных четырех карт или ложно. Как говорится, думайте. А я пока расскажу историю. Сидел я как-то по молодости, ковырял в носу, и задумался: почему в большинстве языков программирования есть бинарные операции И, ИЛИ, НЕ, XOR, но нет импликации (из А следует Б)? Странновато, не? Можно еще сказать, что «мало ли чего нет», но в целом бинарных булевых операций не так много: теоретически 16, если выкинуть константы (всегда 0, всегда 1), первый, второй, не первый, не второй, то уже 10 останется. Убираем обычных подозреваемых (коньюнкция, дизьюнкция, XOR) и их отрицания, и остается одна импликация! (ну, две, в разные стороны, плюс их отрицания). То есть это единственная классическая булева операция, для которой не выделили почему-то ASCII символ для короткой записи или хотя бы функцию в stdlib-е. Ага, подумал я. Вот это находка! И недолго думая запилил ее в наших utils. Щас, думаю, жара пойдет! Потом сидел пару недель и ждал случая, где бы ее применить. Не так часто она нужна, оказывается! (Ну и что, XOR тоже не часто нужен, важен принцип. Мы тут фундаментальной наукой занимаемся, вообще-то). Короче, в какой-то момент мне попалось подходящее условие, и я ее таки воткнул. if (implies(cond1, cond2)) { ...}. Радости было полные штаны. Эксперимент удался! Смотри, мама, я математик! Ну а потом прошло еще время, я наткнулся на свой собственный код, и застрял. Че за фигня? Когда это выполняется? Когда не выполняется? И так я выучил свой главный урок, а также получил ответ, почему импликации нет в стандартной библиотеке. Вот он: ИМПЛИКАЦИЯ НИФИГА НЕ ИНТУИТИВНАЯ ШТУКА. И — интуитивная. ИЛИ — интуитивная. НЕ тоже. А импликация хорошо определена математически, но наш мозг почему-то не приспособлен с ней работать. Ну вот не мапится она на него и все тут. Не встречается в быту. Слишком абстракткна. В быту ты не говоришь «если я женщина, то принеси мне яблоко», рассчитывая, что если первое условие ложно, то второе можно игнорировать. В быту если ты что-то сказал, то значит надо рассматривать эту вероятность, а не игнорировать ее. Это же показывает эксперимент из начала. Люди просто думают про эти вещи по-другому. Почти все переворачивают карту с семеркой, потому что услышали семерку в вопросе. Короче, не работает. Хотелось бы, чтобы работало, но, к сожалению, других людей у меня для вас нет. Хотя — теоретически — очень красиво. В общем, импликацию не пишите. Пишите a ∨ ¬b, и будет всем все понятно.логикапрограммированиеимпликациякодалгоритмыпсихология