День святого Валентина в Нью-Йорке: булевы значения, штрихи Шеффера, Objective C и оксфордские запятые
Привет всем (инструктор, который это читает),
Меня зовут Эоин Уитни, и в настоящее время я учусь в классе iOS в школе Flatiron в Нью-Йорке. Я в восторге от изучения кода и создания приложений. Это начало моей третьей недели занятий, и поэтому я должен закончить блог к концу недели. Очевидно, цель этого блога — научить нас писать о программировании и технических темах в целом, но, как мы скоро увидим, я думаю, что настоящая цель этого блога — заставить нас чувствовать себя комфортно, ставя себя в неловкое положение перед потенциально несколько читателей в той серии трубок, которые они называют Интернетом.
В своем первом блоге я собираюсь рассказать о некоторых вещах, о которых я думал в дни, предшествующие Дню святого Валентина. Как я уже говорил, я хожу в школу в Нью-Йорке, и поэтому, вероятно, можно с уверенностью предположить, что я тоже живу в Нью-Йорке. По данным Google, распределение населения Нью-Йорка по полу составляет 53% женщин и 47% мужчин. Будучи гетеросексуальным мужчиной и предполагая, что есть хотя бы пара гетеросексуальных женщин, вы могли бы подумать, что я легко смогу назначить свидание на День святого Валентина. Проще сказать, чем сделать. Хотя существует множество возможных причин, по которым у меня не было свидания на День святого Валентина, главная из которых — растяжение трутового пальца, сегодня мы сосредоточимся только на двух из изобилия причин. Одна из них — вполне законная причина, а другая — наглая ложь. Я позволю вам, читатель, решить, кто из них кто. Я ботаник, и я занят.
Для не программистов там
есть тип данных, называемый логическим. Логическое значение может быть только истинным или ложным. Существует ряд операций, которые можно использовать между булевыми значениями и между ними для получения логических выводов и эквивалентностей.
= (означает, что ему присвоено значение)
== (означает, что это логически эквивалентно)
&& (означает и)
! (значит дело не в этом)
если (посылка) {
Ву = Да;
}
- (означает, что если посылка верна, то происходит то, что внутри {}. В этом случае Ву получает значение Да.(
Итак, вот о чем я думал за день до дня святого Валентина.
(BOOL)EoinIsANerd=YES;
Предполагая ради аргумента, что я ботаник…
(BOOL)EoinIsBusy=YES;
Предположим ради аргумента, что у меня обычно есть чем заняться в тот или иной День святого Валентина…
Мое логическое уравнение для определения того, следует ли мне назначать свидание в День святого Валентина, выглядит примерно так:
если ((EoinIsANerd==YES)&&(EoinIsBusy==YES)) {
Дата=НЕТ;
}
или, проще говоря, поскольку предполагается, что EoinIsANerd и EoinIsBusy имеют логическое значение 1 или YES:
if(EoinIsANerd&&EoinIsBusy) {
Дата=НЕТ;
}
Если я ботаник и занят, у меня не будет свидания в День святого Валентина.
Так что у меня не было свидания в День святого Валентина, но если каким-то чудом я попал на свидание, учитывая, что:
if(EoinIsANerd&&EoinIsBusy) {
Дата=НЕТ;
}
можно было бы рассуждать:
Поскольку Date=YES и в условном выражении указано, что если EoinIsANerd и EoinIsBusy, то у него не будет свидания, тогда должно быть правдой, что Eoin не ботаник и не был занят, потому что иначе он никак не мог получить эту дату !
Или в основном Утверждая, что:
если (дата=ДА) {
EoinIsANerd=NO;
EoinIsBusy=НЕТ;
}
логически эквивалентно:
if(EoinIsANerd&&EoinIsBusy) {
Дата=НЕТ;
}
На самом деле это ошибочное рассуждение. Поскольку исходное условное условие гласит, что я не должен быть ботаником И не быть занятым, чтобы мне не удалось назначить свидание. Тот факт, что я каким-то вымышленным образом выманил дату, оставляет три различных возможности.
- Я не был занят и не зануда и, таким образом, смог найти дату.
- Я был занят, но не был занудой, поэтому смог найти свидание (может быть, я был занят кормлением бездомных, и кто-то ошибочно предположил, что я хороший человек, и пригласил меня на свидание, и не задержался достаточно долго, чтобы послушать я уйду от совершенно абстрактного тангенса).
- Я был занудой, но не был занят, поэтому смог назначить свидание (возможно, я сидел дома и играл в видеоигры, и кто-то случайно постучал в мою дверь и спросил, не хочу ли я пойти на свидание).
Очевидно, что из этих трех возможностей первая с наибольшей вероятностью привела меня к свиданию. Тем не менее, две другие возможности технически являются дополнительными способами, которыми я мог бы получить дату в соответствии с оператором if, который мы написали.
Наше выражение if на самом деле не отражало того, что мы на самом деле хотели сказать, а именно, что единственный возможный способ для меня когда-либо назначить свидание — это не быть ботаником и не быть занятым, что мы могли бы написать так:
if (!EoinIsANerd&&!EoinIsBusy) {
Дата=ДА;
}
Ха. Отличный шанс.
Это способ зафиксировать наше намерение, учитывая область логических значений, предоставленную нам в задаче C. Было бы неплохо, если бы мы могли зафиксировать то же самое намерение, не используя эти глупые «!» ? Почему не может быть простого символа, означающего, если ни то, ни это, или в нашем случае, если Эоин не ботаник и не занят. Введите инсульт Шеффера.
Инсульт Шеффера был создан математиком Генри М. Шеффером в 1913 году (спасибо Википедии), и это все, что вы знаете.
Обычно пишется «|» . Так же, как и в объективе c, мы имеем && для обозначения и, || означать или, и! чтобы означать «нет», мы могли бы легко иметь | (или какой-либо другой односимвольный символ) означать «ни-ни». Например
если (EoinIsANerd|EoinIsBusy) {
Дата=Да;
}
означало бы, что если Эоин не ботаник и Эоин не занят, то он найдет свидание. Я думаю, что это добавило бы логической ясности языку и уменьшило бы количество нажатий клавиш (что особенно важно для меня, так как я использую технику тыка двумя пальцами, что делает точку ! особенно сложной для меня).
Штрих Шеффера — самая крутая операция в символической логике. Фактически вы можете заменить любую другую логическую операцию штрихом Шеффера и получить ту же логическую точность.
Допустим, у нас есть классическое условное предложение: если P, то Q.
если идет дождь то я промокну
Три способа подтвердить это:
- P&Q (идет дождь, и я промокну)
- !P & !Q (нет дождя и я не промокну)
- !P & Q (дождя нет, и я промокну) помните, что если дождя нет, это не значит, что я не могу промокнуть каким-либо другим способом, например, в душе.
поэтому, если P, то Q логически эквивалентен ((P&Q)&(!P & !Q))& (!P &Q)
но помните, штрих Шеффера заключается в том, чтобы сказать то, что не включено или не является результатом данного утверждения. Так что, возможно, будет легче придумать интерпретацию условного P>Q (если P, то Q) в стиле Шеффера, думая о том, что именно делает P>Q неистинным.
4. P&!Q (идет дождь, а я не промокаю)
если в моем условном выражении явно указано, что если идет дождь, а я промокну, то если идет дождь, а я не промокаю, условное выражение должно быть ложным. Итак, используя это
P›Q должен быть эквивалентен ((P|(Q|Q))
P›Q не эквивалентен ни P, ни (ни Q, ни Q, или вообще !Q). Если подумать, то слова P (идет дождь) и !Q (я не промокну) не одинаковы для любой другой комбинации, отличной от P и !Q.
Это мой первый пост в блоге. В следующем будет намного больше кода и намного меньше логики. Дайте мне знать, если у вас есть какие-либо советы по программированию, свиданиям или писательству. Опять эта оксфордская запятая, я знал, что доберусь до нее!