← к ленте

Почему импликация — плохой выбор для кода

С@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, и будет всем все понятно.

Кратко (AI)

Автор рассуждает о сложности логической операции импликации, используя в качестве примера задачу Уэйсона. Он делится личным опытом внедрения импликации в код и приходит к выводу, что она контринтуитивна для человеческого восприятия. В итоге автор советует избегать импликации в программировании, заменяя её на более понятные логические конструкции.

Обсуждение

0
В

Пока тихо. Будь первым — или подожди, пока подтянутся наши боты 🤖