День святого Валентина в Нью-Йорке: булевы значения, штрихи Шеффера, 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) {

Дата=НЕТ;

}

На самом деле это ошибочное рассуждение. Поскольку исходное условное условие гласит, что я не должен быть ботаником И не быть занятым, чтобы мне не удалось назначить свидание. Тот факт, что я каким-то вымышленным образом выманил дату, оставляет три различных возможности.

  1. Я не был занят и не зануда и, таким образом, смог найти дату.
  2. Я был занят, но не был занудой, поэтому смог найти свидание (может быть, я был занят кормлением бездомных, и кто-то ошибочно предположил, что я хороший человек, и пригласил меня на свидание, и не задержался достаточно долго, чтобы послушать я уйду от совершенно абстрактного тангенса).
  3. Я был занудой, но не был занят, поэтому смог назначить свидание (возможно, я сидел дома и играл в видеоигры, и кто-то случайно постучал в мою дверь и спросил, не хочу ли я пойти на свидание).

Очевидно, что из этих трех возможностей первая с наибольшей вероятностью привела меня к свиданию. Тем не менее, две другие возможности технически являются дополнительными способами, которыми я мог бы получить дату в соответствии с оператором if, который мы написали.

Наше выражение if на самом деле не отражало того, что мы на самом деле хотели сказать, а именно, что единственный возможный способ для меня когда-либо назначить свидание — это не быть ботаником и не быть занятым, что мы могли бы написать так:

if (!EoinIsANerd&&!EoinIsBusy) {

Дата=ДА;

}

Ха. Отличный шанс.

Это способ зафиксировать наше намерение, учитывая область логических значений, предоставленную нам в задаче C. Было бы неплохо, если бы мы могли зафиксировать то же самое намерение, не используя эти глупые «!» ? Почему не может быть простого символа, означающего, если ни то, ни это, или в нашем случае, если Эоин не ботаник и не занят. Введите инсульт Шеффера.

Инсульт Шеффера был создан математиком Генри М. Шеффером в 1913 году (спасибо Википедии), и это все, что вы знаете.

Обычно пишется «|» . Так же, как и в объективе c, мы имеем && для обозначения и, || означать или, и! чтобы означать «нет», мы могли бы легко иметь | (или какой-либо другой односимвольный символ) означать «ни-ни». Например

если (EoinIsANerd|EoinIsBusy) {

Дата=Да;

}

означало бы, что если Эоин не ботаник и Эоин не занят, то он найдет свидание. Я думаю, что это добавило бы логической ясности языку и уменьшило бы количество нажатий клавиш (что особенно важно для меня, так как я использую технику тыка двумя пальцами, что делает точку ! особенно сложной для меня).

Штрих Шеффера — самая крутая операция в символической логике. Фактически вы можете заменить любую другую логическую операцию штрихом Шеффера и получить ту же логическую точность.

Допустим, у нас есть классическое условное предложение: если P, то Q.

если идет дождь то я промокну

Три способа подтвердить это:

  1. P&Q (идет дождь, и я промокну)
  2. !P & !Q (нет дождя и я не промокну)
  3. !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.

Это мой первый пост в блоге. В следующем будет намного больше кода и намного меньше логики. Дайте мне знать, если у вас есть какие-либо советы по программированию, свиданиям или писательству. Опять эта оксфордская запятая, я знал, что доберусь до нее!