С языками есть такая проблема, что они почти всегда достаются нам по наследству. Даже если кто-то создаёт новый язык сознательно, а не, как это обычно бывает, этот язык складывается из множества мелких локальных изменений, автор языка всё равно создаёт его не с нуля. Некие вещи, уже существующие в других языках, всё равно с неизбежностью оказываются какими-то «опорными точками» его построений. Пусть улучшенные и упорядоченные, но всё же.
Этот процесс похож на то, что описывается теорией эволюции, и имеет соответствующие проявления.
С одной стороны, эволюционный алгоритм приводит ситуацию к некому локальному оптимуму в том или ином смысле (с языками это, видимо, некое сочетание гибкости в выражении мыслей, лёгкости использования и лёгкости обучения языку).
С другой стороны, за счёт того, что эволюционный маршрут не содержит значительных изменений сразу большого количества параметров, этот оптимум всегда локальный. И по ряду критериев он может очень сильно отличаться от глобального оптимума.
Сознательная модификация позволяет «прыгнуть дальше», но этот «прыжок» всё равно ограничен тем, что фантазия человека не способна выдавать радикально новое по всем параметрам — она лишь модифицирует известное на примере. Что тоже порождает новое, однако также включает старое в качестве наследства.
Кроме того, когда людям ещё весьма немногое было понятно по некоторой теме, всё равно уже складывалась некоторая терминология и синтаксис языка, чтобы хоть как-то выражать уже понятное (пусть даже часть этого будто бы понятного потом оказывалось ошибочным). Потом что-то становилось понятно лучше. Потом что-то ещё. И что-то ещё. Но терминология и синтаксис на каждом этапе модифицировались с заметным отставанием от уровня понимания.
То есть на каждом этапе новые идеи выражались старым языком, затруднявшим их понимание и допускающим неверные трактовки сказанного, а иногда и побуждающие к оным.
На каждом этапе развития доставшийся в наследство и модифицирующийся с заметным запозданием по отношению к идеям язык тормозит и сам процесс рассуждений тоже. Поскольку в изрядной степени оттягивает на себя интеллектуальные ресурсы человека: вместо того, чтобы думать над идеей, человек часть времени думает над тем, как её составляющие вообще можно записать на этом устаревшем языке так, чтобы они не исказились до неузнаваемости. Ну или хотя бы вообще оказались записанными хоть в каком-то виде.
Вдобавок, другие люди, которые могли бы ему помогать, тратят кучу времени на изучение неудачного на фоне возможных альтернатив языка.
Сколько-то времени на обучение языку пришлось бы потратить в любом случае, но есть разница. Если при той же или даже меньшей выразительной силе старый язык гораздо сложнее, чем новый, и гораздо менее интуитивный, время, требующееся на овладение им, может отличаться на два порядка, равно как и интеллектуальное напряжение в процессе обучения. А ведь эти силы и время можно было бы направить на что-то иное — например, на познание пока ещё никому не известного.
Можно, скажем, сравнить английский язык, произошедший в основном стихийно, а не в результате неких волевых усилий, и сконструированный сознательно язык эсперанто.
В английском мы имеем кучу правил чтения, которые, к тому же, в половине случаев не работают, поскольку в языке очень много слов-исключений. Аналогично очень много исключений и в синтаксисе. Одновременно с тем синтаксис таков, что очень разные по смыслу конструкции образуются одними и теми же синтаксическими или морфологическими единицами.
А «have» может означать «имеет», но одновременно с тем — «нужно», «придётся» или одно из времён группы perfect.
На этом список сложностей не кончается — есть ещё разные для разных слов способы образования «производных понятий», разные для разных глаголов предлоги для вроде бы одинаковых ситуаций и так далее.
И вот эсперанто. Исключений нет вообще. Все времена для всех глаголов образуются единообразно. По самому слову всегда однозначно понятно, существительное это, глагол или прилагательное. Все производные слова образуются одними и теми же суффиксами и приставками для каждого смысла.
Domo — дом, dometo — домик.
Kubo — куб, kubeto — кубик.
Lupo — волк, lupeto — маленький волк.
Не «волчонок», нет, просто волк маленького размера. «Маленький по возрасту» обозначается суффиксом «-id-», то есть «волчонок» будет «lupido».
До эсперанто предпринималось довольно много попыток сознательного построения разговорного языка, базировавшихся на знаниях о языках разговорных, и, самое главное, в дальнейшем такие попытки тоже будут предприниматься, поэтому эсперанто нельзя считать «идеалом на все времена», однако совершенно понятно, что усилий и времени на его изучение нужно заметно меньше, чем на английский. Равно как и количество залезаний в словарь при его использовании будет радикально меньше, чем в случае с английским: ведь, как минимум, поняв одну языковую конструкцию в эсперанто, вы можете быть уверены, что она работает во всех случаях без исключений.
Может показаться, будто бы эсперанто в результате своей «сконструированности» менее выразителен, чем «естественные» английский, русский или китайский. Но нет, как ни странно, он более выразителен — как раз за счёт вот этой вот «сознательной регулярности». В частности, для ряда вещей в русском или английском просто нет сложившихся понятий, выражаемых одним словом. Мы можем их произвести как словотворчество, и оно даже наверно будет до какой-то степени понятно хорошо знающим язык, но такие слова каждый раз окажутся «не в сложившейся традиции», а потому будут требовать времени на своё внедрение и принятие, равно как и допускать альтернативные трактовки своего смысла слушателем. В эсперанто же такой способ образования понятий с самого начала «в традиции» — не в меньшей степени, чем в русском языке образование уменьшительных форм при помощи суффикса «-ик», а, напротив, в гораздо большей.
В русском слово «волчонок» означает детёныша волка. Но как на русском сказать «маленький волк» одним словом?
По логике и аналогиям должно быть «волчик». Однако в отличие от «зайчика» такое слово кажется каким-то «кривым». То есть суффикс «-ик» хоть и позволяет образовать целый ряд уменьшительных названий, срабатывает такое не всегда. Часть слов воспринимается гармонично, хотя мы их вроде бы никогда не слышали, а другая часть, образованная тем же способом для схожих исходных слов, гармоничной не кажется.
Теперь представьте себе, как удобно с этим делом в эсперанто: вообще любое исходное существительное можно превратить в уменьшительную форму одним и тем же способом. И это всегда будет восприниматься гармоничным, ввиду регулярности языка.
И при этом вам никогда не придётся думать о чередовании согласных и гласных, как в «заяц» — «зайчик» или «моряк» — «морячок». Если есть корень, то автоматически есть и регулярная уменьшительная форма, которую вы гарантированно знаете, если знаете этот корень и уменьшительный суффикс, даже если уменьшительной формы в явном виде нет в вашем словаре: «leporo» — «leporeto», «maristo» — «maristeto».
При этом слово «моряк» вы автоматически знаете, если знаете слово «море» — «maro» — и суффикс, образующий сопряжённую со словом профессию — «-ist-».
Иными словами, единственный минус эсперанто на фоне языков почти и совсем естественного происхождения — эти языки их носители уже знают. Мысли лучше и проще было бы выражать на эсперанто, художественные метафоры — за исключением игры слов, которая возможна как раз из-за исторических шероховатостей каждого языка — лучше было бы генерировать на эсперанто, формулировки законов естественных наук на эсперанто звучали бы более однозначно, и его при этом проще изучить как иностранный, однако вместо него в подавляющем большинстве случаев используются естественные языки, поскольку они уже известны их носителям и уже «внедрены».
Это — наследие прошлого, приложившееся ко всему остальному опыту.
Другой пример — музыка.
«Традиционная» нотная запись, на мой взгляд, это то, что на данный момент времени является самым ярким примером чудовищно неудобного, крайне плохо читаемого даже при наличии опыта и одновременно с тем очень неполного способа записи.
Реально, всю содержательную часть теории музыки в том виде, в котором она существует сегодня, можно изложить с нуля за пару—тройку часов. После этого останется только стопицот частных примеров, которые, конечно, как и в любой развитой области, можно по отдельности разбирать десятилетиями.
Но ведь чтобы изложить теорию, понадобится какая-то запись. А «традиционный» язык нотной записи столь неудачен, что очень часто им не владеют даже те, кто отлично исполняет музыку и/или сочиняет музыкальные произведения — в том числе, весьма нетривиальные.
Одновременно с тем, весьма часто тот, кто этот язык записи понимает, всё равно не может им пользоваться на «интуитивном уровне». Ну, чтобы как с хорошо известным разговорным языком — глянул на текст и сразу же всё понял.
Тех же, кто этот способ записи ещё не знает, он своим видом пугает до дрожи в коленях. При взгляде на «традиционные» ноты интуитивно кажется, что ну её эту музыку — займусь лучше квантовой механикой, там всё-таки как-то попроще, а тут я точно никогда ничего не пойму.
И в данном случае эти чувства вполне обоснованы: ведь, как говорилось выше, многие из тех, кто всё это честно выучил, тоже всё ещё не могут свободно читать с листа. Не говоря уже о том, что специальных правил записи там чуть ли не больше, чем исключений в английском, и отслеживать их как при записи, так и при чтении, весьма тяжело, поскольку запись ещё и не совсем линейная.
В результате теория, по содержанию полностью укладывающаяся в несколько часов, если не считать разбора частных случаев, на практике зачастую не укладывается в месяцы и годы обучения. Причём основная масса времени уходит на героическое преодоление терминологии и «традиционных» способов изложения. Но самое главное — на упорную борьбу со способом записи, то есть с «традиционным» письменным языком музыки. Именно вот это оттягивает на себя все силы.
Альтернативный «традиционному» способ записи — «пианоролл» — при этом столь прост и интуитивен, что его с нуля можно объяснить за десять минут, а если человек уже имел дело с чем-то вроде монтажа видео — вообще за две—три.
И при этом, снова, его выразительность не меньше, а больше, чем у «традиционного» способа. Вообще говоря, им возможно единообразно и точно записать абсолютно всё, что вообще возможно воспроизвести. Даже импровизационное булькание джазового саксофониста в его саксофон можно будет записать, если хоть кто-то сумеет определить необходимый набор параметров такого способа исполнения.
Иными словами, в этом способе ограничением является только текущий уровень знаний о том, что реально происходит во время исполнения чего-то очень нетривиального по способу звукоизвлечения, но не способ записи этого.
Тогда как в традиционной записи весьма странно и не интуитивно выглядят даже довольно тривиальные элементы.
Например, даже если вы никогда не имели дело с пианороллом, но всё-таки пользовались компьютером, вы скорее всего даже сумеете вычислить сами, что вот тут обозначено.
Ну, видимо, слева клавиатура фортепьяно, а справа временна́я шкала. В начале прямоугольника мы нажали клавишу, а в конце — отжали. Ну, как при монтаже видео с клипами: в начале прямоугольника он начал воспроизводиться, а в конце — закончил.
На другом инструменте надо будет узнать, где у него та же нота, и тоже начать её исполнять в начале прямоугольника, закончив в его конце. То есть клавиши фортепьяно тут исключительно для упрощения визуального распознавания, но можно было бы и просто рядом со строками написать имена соответствующих им нот, не рисуя клавиши.
Наверно в этом примере нам сообщается, что мы по очереди нажали три клавиши, продолжая удерживать ранее нажатые, а потом одновременно их отпустили. Ну или, если угодно, зажали три струны гитары на нужных ладах и по очереди дёрнули эти струны, не заглушая дёрнутые ранее.
Очевидно, весьма стандартный приём — чего тут может быть сложного?
Но если записать это «традиционным» способом…
Ну да, с пианороллом тоже придётся ещё разобраться, в каких единицах там измеряется время на временно́й шкале, но вот эта куча значков, она вообще про что?
Почему, например, нарисовано шесть кружочков, хотя мы извлекаем всего три звука?
Ну я, предположим, знаю, что куча похожих на букву «b» значков слева — это перманентные знаки изменения ноты, которые приводят к тому, что все ноты справа надо читать так, будто эти знаки прямо к ним приписаны, а «дуга» между кружочками означает, что нота длится всё это время, а не играется два или три раза подряд, и даже знаю «традиционные» наименования этих обозначений: «ключевые знаки альтерации», «бемоль», «лига». То есть мне наверняка будет несколько проще, чем начинающим.
Однако всё равно я буду вынужден это дешифровывать, если только у меня нет большого опыта исполнения произведений в ре-бемоль мажоре с листа, благодаря которому я просто помню, какие ноты входят в эту тональность, и опознаю их сразу по примерному расположению на линейках.
Ведь заметьте, например, что похожие на «b» «бемоли» написаны на линейках сверху, но действуют при этом и для нот снизу. Причём очевидной регулярности в расположении на линейках не прослеживается. Вместо этого надо помнить, что нота под нижней линейкой — это та же, что на второй линейке сверху, хоть и на октаву ниже, а потому написанный сверху знак действует и для неё тоже.
Простейший пример, который любой человек после пяти минут с нуля мог бы прочесть и даже правильно исполнить, не имея никакого опыта игры на фортепьяно, обрастает совершенно неоправданной сложностью. Которая абсолютно ничего не добавляет к смыслу записанного, несмотря на часто предпринимаемые попытки задним числом увязать это с глубочайшей теорией, чем и обосновать такую запись.
Нет, более вероятное объяснение это не «потому что так ближе к теории». Такой способ записи сложился исторически, поскольку раньше в теории музыки были менее очевидны регулярности, а традиция наделяла то, что сейчас считается структурно идентичным, религиозными и метафизическими смыслами, и это тоже побуждало считать всё это совсем разным и, таким образом, по-разному записывать.
Но люди всё-таки со временем всё сильнее склонялись к регулярности описания, модифицируя теорию и адаптируя способ записи к новым для тех времён способам построения композиций. Да и сама настройка инструментов под воздействием наблюдений и стремлений тоже менялась. Однако способ записи всё время отставал от появляющихся идей и желаний, что ему и позволило продержаться до сего дня, в котором кто-то всё ещё продолжает его воспроизводить и даже использовать его при обучении, продлевая ему жизнь и дальше.
Те же мысли и идеи и даже большее можно было бы выразить с гораздо меньшими усилиями и временем подготовки, но полученное в наследство тянет назад: ведь оно, как и в случае с разговорными языками, многим уже известно. В данном случае — учителям музыки и части музыкантов/композиторов, которые как раз и являются основным источником сведений по данной теме.
Понятно, что ещё даже полвека назад пианоролл существовал только в виде ленты для механических пианино и, хоть и рассматривался горсткой музыкантов и теоретиков как более удачная альтернатива, без компьютеров его преимущества были несколько менее очевидны. Но в современности-то компьютеры давно уже есть.
Надо было глубоко вздохнуть и сказать: «ну, мы, конечно, мучались, но, слава богу, сейчас есть способ лучше, поэтому хотя бы следующее поколение не будет мучиться», — после чего овладеть более удачным способом и преподавать уже его. Оставив старый в качестве исторического курьёза или, быть может, опциональных знаний для трансляции ранее записанного прежним способом в записанное новым. Но вместо этого многие продолжают использовать для обучения язык, преимущество которого только в том, что лично они его давно уже знают. Игнорируя то, что следующие поколения из-за этого тратят существенно больше времени на тот же результат, чем могли бы. И при этом ещё и имеют худшее понимание закономерностей.
И да, если это делается с целями изучения истории — всё нормально: человек разобрался в запутанных методах прошлого, чтобы его описать и изучить, честь ему и хвала.
Но если этим собираются пользоваться для практики, то оно уже очень странно.
Понятно, например, что для беседы с японцами на их родном языке полезно знать этот язык, однако вряд ли по этому поводу стоило бы настаивать, что именно этот язык должен быть международным — «ведь он хорош тем, что в нём так много исключений и нерегулярностей, и так много разных символов, которые все придётся запоминать».
В случае с распространённостью разговорных языков исторический фактор вряд ли удалось бы отбросить. Английский, например, занял своё место не потому, что он очень удобный и понятный, а потому, что сначала Англия, а потом США доминировали на мировой арене, склоняя тем самым остальных знать родной язык «главных» на данный момент стран. Но для специализированных языков — записи математики, музыки, логики и т.п. — фактор национального доминирования уже не особо важен. И мешает внедрению их более удобных альтернатив в основном инерционность мышления, желание сохранить свой статус, не прилагая дополнительных усилий, и банальный страх новизны.
Приведу ещё один пример, который, кстати, и сподвиг меня на вышеизложенные размышления.
Он приводился с целью «подумать» и «осознать сложность логики», однако я вижу в нём в первую очередь всё ту же проблему: исторически сложившийся язык сам по себе сильно сложнее смыслов, которые им передают.
В общем, задача такова.
Надо пересказать «нормальным языком», как можно более ясно, смысл следующего утверждения:
∃ y (x ≠ y and y ≠ z) → ∀ x ∃ y (x ≠ y and y ≠ z)
Скажу сразу, я не хочу здесь оспаривать рассуждения по ссылке — допускаю, их можно было бы сделать проще, но дело не в этом.
Дело в том, что для прочтения этого примера вам надо специально овладеть узкоспециальной системой обозначений. Которая, фактически, «своя собственная» и существует только в двух областях: в формальной логике и отчасти в математике.
Программирование заметно связано с этими областями, но там система обозначений уже совсем иная. И даже в физике, которая берёт из математики и логики очень многое, вы вряд ли встретите «∃» в формулировке физических законов. Нет, там будет написано на разговорном языке…
Существуют инерциальные системы отсчёта.
Как и в программировании было бы вместо «∃» написано что-то вроде…
mySet.exists(_ > 0)
Почему? Да потому что это проще прочитать, записать и понять без подготовки. Свои «исторические» заморочки и в физике, и в программировании тоже есть, но тут ведь уже заморочки из математики — добровольно тащить их в свою область не особо-то хочется, поскольку оно ведь усложняет процесс. Усложняет, не возвышая при этом носителя «сложных знаний» на ровном месте: и физики, и программисты обычно до какой-то степени знают математику, но это всё-таки не основная их область, а потому у них нет столь хорошего ранее полученного знания «традиционной» системы обозначений.
То есть легко видеть, что не удобство или глубокий смысл склоняют к такой версии языка, а именно что ранее озвученные факторы: ведь там, где они слабы, эта система обозначений не внедряется, тогда как удобные, понятные и простые в освоении системы обозначений как раз добровольно и с энтузиазмом заимствуют куда попало.
Однако, быть может, всё-таки пример не столь-то и сложен? Ведь не так тяжело запомнить, что «∃» — это «существует», а «∀» — «выполняется для всех».
Или, быть может, тяжело не столько запомнить, что стрелочка означает «операцию следования», сколько понять смысл этой операции? Логики с математиками, вот, с ней разобрались, а студенты или вообще непричастные не осиливают?
Ну да, в операции «следование» есть некоторая сложность. Однако это всё-таки сложность очень относительная — на её постижение требуются некоторые усилия, но речь о годах и даже о месяцах на понимание тут не идёт, а смысл операции, вообще говоря, укладывается в одно предложение.
Если из первого «следует» второе, то это означает, что второе гарантированно верно, если верно первое, и, соответственно, первое гарантированно ложно, если ложно второе.
Почему именно так, а не «…соответственно, если первое ложно, то и второе ложно», конечно, придётся отдельно пояснять, но на это тоже уйдёт десять минут, а не десять лет, поэтому сложность явно не в этом.
Проблема, на мой взгляд, тут не в буковках и не в запредельно сложных идеях, а в самом «формате обозначений», который своей неудобочитаемостью и одновременно с тем неоднозначностью во многом подобен «традиционной» нотной записи.
Дело в том, что, несмотря на бытующее мнение, будто бы «язык математики/логики очень точен и однозначен», на самом деле, он очень сильно контекстозависим, а потому точным в лучшем случае может быть только весь текст рассуждения целиком, а каждый его фрагмент при этом мог бы иметь совершенно разный смысл в разных контекстах.
Что-то подобное происходит в разговорном языке, когда мы используем в речи слова «он», «тот», «этот», «там» и т.п. Вне контекста невозможно однозначно сказать, кто именно этот «он» и где именно находится «там». Мы так говорим для краткости и благозвучности, однако отдаём себе отчёт, что точной наша речь от этого не становится, а, напротив, из-за этого иногда фразы звучат неоднозначно даже в контексте.
На кого положил? На диван или на кота?
Но математика, такое впечатление, что не только не отдаёт себе в этом отчёта, но даже форсирует декларацию точности и однозначности своего нынешнего языка, что ощутимо мешает разработке и внедрению более однозначных и удобочитаемых способов записи. Которые, разумеется, будут ещё и сильно более понятными.
Взглянем ещё раз на сабжевое высказывание на «точном и однозначном» языке.
∃ y (x ≠ y and y ≠ z) → ∀ x ∃ y (x ≠ y and y ≠ z)
Ну, ок, про «игреки» тут слева от стрелки говорится, что «игреки существуют такие, что…», однако, что с «иксами» и «зэтами»?
Они тоже «существуют»? Заранее известны? Известны, но только внутри выражения? Откуда-то извне в него приходят? Постоянны? Переменны?
Если бы в языке программирования нам бы встретилась строка вида…
val z = y + 1
…то вне контекста мы бы могли знать только то, что «игрек» — это что-то такое, для чего определена операция «+» с аргументом «1».
Такая строка не является законченным высказыванием и в ряде языков даже не скомпилируется в отрыве от всего остального. В менее строгих языках это дело можно будет запустить и там либо сработают какие-то умолчания (чаще всего будет предположено, что «игрек» — это целочисленная переменная, и раз не сказано иного, сейчас в ней лежит ноль), либо же программа рухнет во время исполнения, поскольку с точки зрения среды мы полезли в неинициализированную память.
Однако внутри каждого языка программирования эта строка совершенно однозначна, независимо от контекста.
Её однозначный смысл может быть разным в разных языках, но в среднем, тут объявляется новая константа «зэт», в которую в качестве значения складывается результат вызова операции «+» для некого неизвестного объекта «игрек» с аргументом «1». Либо же, как вариант, вызывается операция «+» с аргументами «некий неизвестный игрек» и «1».
Казалось бы, математику изучают с младших классов школы, а программирование многие не изучали вообще никогда, однако эта запись, как показывает практика, оказывается гораздо более понятной по своему смыслу среднестатистическому человеку после самых минимальных объяснений.
Почему?
Потому что она интуитивна, однозначна и не требует запоминания чего-то особого, характерного только для этой области.
Это — линейный текст, с привычными буквами, но, самое главное, он регулярен относительно всего остального, что человек встречает вокруг себя. При подсчёте денег в магазине, пройденного пути и чего угодно, человек ровно так же записывает это через тот же знак «+».
Результаты промежуточных вычислений он мысленно или письменно «складывает» в «промежуточные константы», а зачастую даже их именует.
«На продукты» и «на напитки» — это как раз именованные промежуточные константы и есть. Как и «в сумме ушло».
Разве что только «val» он не пишет. Однако смысл «val» — «с этого момента у нас есть константа зэт» — соответствует тому, как построена наша разговорная речь. Мы пользуемся этим регулярно, причём не только в расчётах. Упомянув, например, «соседа Васю», мы подобным же способом сказали «с этого момента у нас есть такой вот персонаж повествования».
Сабжевая же логическая фраза на «точном языке» выглядит так, будто бы внезапно в середине абзаца появились некие «Вася» и «Петя», о которых раньше ни разу не упоминалось, однако рассказчик говорит о них так, будто бы все их отлично знают.
То есть написанное, вместо того чтобы концентрировать внимание и направлять интеллектуальные усилия на анализ смысла самой фразы, переключает часть внимания на «побочный сюжет»: надо вычислить, кто такие «Вася» и «Петя», или, в данном случае, «икс» и «зэт».
∃ y (x ≠ y and y ≠ z) → ∀ x ∃ y (x ≠ y and y ≠ z)
Судя по тому, что «игрек» упоминается со знаком «существует», он не «задан извне заранее». Поэтому, надо полагать, «икс» и «зэт» как раз заданы извне — ведь иначе не надо было бы оговаривать это для «игрека». Тем более, что в правой части у нас ещё и написано «для всех икс».
Поскольку же в данном высказывании фигурирует сравнение, наверно предполагается, что внутри частей фразы те штуки, которые не обёрнуты в «существует» и «все», остаются постоянными.
То есть, видимо, подразумевается, что слева от стрелки заранее заданы и постоянны «икс» и «зэт», а справа заранее задан и постоянен «зэт».
Чтобы прочитать это высказывание и понять его смысл, надо проводить анализ так, будто бы это вообще совсем неродной для читателя язык. И при этом всё равно остаются сомнения, что её смысл трактован правильно.
И это даже при большом опыте чтения на этом языке — что уж тут говорить про тех, кто ещё не очень опытен?
Чувствуете аналогию с нотной записью?
В одном случае смысл практически однозначно понятен даже почти ничего по теме не знающему, а во втором некоторые сомнения будут даже у опытного — придётся перепроверять, а то мало ли.
В одном случае прочтение практически мгновенно даже при малом опыте. Во втором требуется определённая дешифровка даже при большом.
При том, что записано-то абсолютно одно и то же по смыслу.
Однако снова вернёмся к фразе.
∃ y (x ≠ y and y ≠ z) → ∀ x ∃ y (x ≠ y and y ≠ z)
Итак, какими свойствами тут обладают буквы, мы, предположим, вычислили.
Но какой тип у тех сущностей, которые они обозначают?
Так вот, в таком языке программирования у нас два варианта: либо сравниваемые сущности имеют совместимый тип, либо у нас будет ошибка при компиляции, то есть это — как бы некорректное, ошибочное рассуждение (именно «некорректное», а не «ложное»).
Если мы предполагаем, что ошибка не возникла, это означает, что типы везде совместимы.
А тут как?
А по записи — неизвестно. Наверное совместимы, если уж значения сравнивают. Ну или хотя бы совместимы в рамках операции «≠». Но, быть может, она работает и для несовместимых типов тоже, давая в результате своего применения «ложь».
Кстати, тут сравнивают значения или ссылки на значения?
Кто-то скажет, «в математике всегда сравниваются значения», но здесь ведь нет никаких указаний на то, что это строго про математику. В логике в целом ссылки вполне себе используются. «То, что лежит в десятом ящике» — вполне нормальная логическая сущность. Как и «та девушка, которую любит Вася Пупкин».
Казалось бы, да какая вообще разница? Но разница есть.
Дело в том, что десятом ящике у нас может лежать вырезанная из бумаги цифра «1», и в третьем ящике тоже цифра «1». По численному значению это — одна и та же цифра. Но мы при этом понимаем, что это не один и тот же фигурно обрезанный лист бумаги, а два разных в двух разных ящиках. Если мы порвём бумажную цифру из десятого ящика, то цифра из третьего никак не поменяется.
Так вот, данная фраза утверждает, что данная закономерность выполняется для значений или для ссылок? Или для обоих сразу?
Опять же, первый попавшийся читатель, возможно, не знает термина «ссылка» и какого-то особого смысла термина «значение», однако в его постоянном опыте сама идея различения одного и другого постоянно встречается, а потому, прочитав «точное и однозначное» логическое высказывание, он всё равно испытывает сомнения — даже если не может их изложить при помощи использованной мной терминологии.
Автор, возможно, находится в среде, где трактовка почти всегда однозначна (например, он — математик, и машинально думает о любых множествах как о множествах чисел, причём таких, в которых элементы всегда сравниваются только по значению), однако читатель совершенно не обязательно находится в той же среде и имеет те же умолчания. Для программиста, например, совершенно естественно сравнение ссылок, а не только значений. Да и, положа руку на сердце, большинство непрограммистов тоже вполне способны представить себе ситуацию, в которой «его девушка» и «девушка Васи» — это одна и та же девушка.
То есть, мало того, что нам надо каким-то образом вычислять, константы или не константы всё то, что скрывается под теми или иными буквами в этом высказывании, но ещё и придётся узнать бэкграунд автора, из чего вывести его набор умолчаний.
Ну ладно, предположим, что автор — математик, и тут речь о сравнении по значению, хотя это никак не оговорено.
∃ y (x ≠ y and y ≠ z) → ∀ x ∃ y (x ≠ y and y ≠ z)
Слева от стрелки «икс» — константа, а справа он обёрнут в «для всех», и потому он — переменная. Как одно сочетается с другим?
Ну, в языках программирования обычно есть концепция «области видимости переменной», поэтому всё всегда понятно: если в каком-то «блоке» кода у нас объявлен некий «икс» и в его внутреннем «блоке» тоже объявлен некий «икс», то это — разные иксы. Если же икс объявлен во внешнем блоке, а во внутреннем не объявлен, но используется, то это — один и тот же икс.
Например,
val x = 10
{
// тут другой «икс»
val x = 20
val y = x + 1
}
…или…
val x = 10
{
// тут тот же «икс»
val y = x + 1
}
А в сабжевом «точном и однозначном» языке как?
∃ y (x ≠ y and y ≠ z) → ∀ x ∃ y (x ≠ y and y ≠ z)
Как узнать, что тут произошло? «Икс» сначала был задан извне, а потом мы его переопределили справа от стрелки?
Ведь в ином случае, если сказать «для всех икс», когда «икс» уже, например, имеет значение «3», то получится «для всех 3».
Видимо, «для всех икс» тоже как бы «открывает новый блок», внутри которого «икс» — уже новая одноимённая переменная, а не заранее заданная константа, как чуть раньше.
То есть в левой и в правой части, видимо, одной и той же буквой называются разные сущности.
Хотя могла бы иметься в виду и одна и та же. Синтаксис языка это в явном виде никак не определяет, а потому надо всё это отдельно вычислять — причём даже не из контекста по определённым единообразным правилам, а перебором в этом контексте возможных вариантов, с исключением большинства из них по принципу «а то в этой фразе не будет никакого смысла».
То есть, убери мы «для всех икс» из правой части…
∃ y (x ≠ y and y ≠ z) → ∃ y (x ≠ y and y ≠ z)
…этот контекст вообще сделал бы варианты «тот же икс» и «другой икс» равновероятными: данное высказывание не заведомо бессмысленно в обоих из них. Пришлось бы пытаться угадать, следует ли исключить вариант «тот же икс» по той причине, что с ним фраза оказывается чересчур тавтологичной, либо же следует исключить вариант «не тот же икс», поскольку в его рамках эта фраза в общем случае не будет истинной.
Ну ладно, в данном случае «для всех» всё-таки вносит какую-то ясность, поэтому, видимо, во фразе…
∃ y (x ≠ y and y ≠ z) → ∀ x ∃ y (x ≠ y and y ≠ z)
- Левая часть содержит заранее заданные, хотя и не указанные константы «икс» и «зэт».
- Правая часть содержит заранее заданную, хотя и не указанную константу «зэт».
- Константы и переменные имеют один и тот же тип и сравниваются по значению.
Далее.
В этом высказывании имеется в виду утверждение или проверка? Мы тут утверждаем, что «в данной системе аксиом постулируется верность того, что из левого следует правое», или проверяем, выполняется ли следование в выбранной системе аксиом?
Или, быть может, вообще говорим о том, что мы так определили фигурирующие тут операции, что они будут выполняться во всех системах аксиом, если не менять определений этих операций?
По форме и без сопроводительного текста мы никак не можем отличить одно от другого. Тут анализ фразы уже никак не поможет: все три варианта могли бы быть представлены ровно одной и той же записью, а выбор между ними делался бы исключительно по сопроводительному авторскому тексту на разговорном языке.
Причём даже если этот текст есть, такая форма записи всё равно сбивает с толку даже опытных. Поскольку надо возвращаться назад и перечитывать сопроводительный текст — а то мало ли что.
В языках программирования это гораздо понятнее, поскольку это оговорено самими правилами языка и за редкими исключениями даже записывается по-разному.
Например, вот здесь…
val z = if (x == 0) y == 0 else false
…мы можем однозначно сказать, что в скобках написана проверка того, что «икс» в данный момент равен нулю. Если это так, то проверяется равенство нулю «игрека» и результат этой проверки — true или false — записывается в только что определённую константу «зэт». Если же «икс» был не равен нулю, то в «зэт» записывается значение false.
Это можно было бы записать и короче:
val z = (x == 0 && y == 0)
Однако в более длинной записи всё равно всё однозначно и совершенно понятно, где проверка равенства, а где запись в константу, где что вычислилось и куда оно потом попало. И в чём вообще состоит результат исполнения этой строки. Даже если вне контекста мы не всё знаем про текущие значения и точные типы отдельных констант и/или переменных.
Фраза же…
∃ y (x ≠ y and y ≠ z) → ∀ x ∃ y (x ≠ y and y ≠ z)
…выглядит «подвешенной в воздухе». Как будто бы это — некий фрагмент выражения, а не законченное высказывание.
И это, надо отметить, бросается в глаза практически каждому, кто пытается понять формальную логику, пользуясь «традиционной» записью. Часть людей через какое-то время, возможно, смиряется, но другой части стоящие в отдельной строке выражения вида…
A and B
…продолжают резать глаз своей «незавершённостью». «А и Б» что? Мы таким способом утверждаем, что они верны одновременно? Или мы тут проверяем, что они верны одновременно? Если так, то куда девается результат этой проверки? Мы же никуда его не складываем в явном виде. В общем, без сопроводительного текста на разговорном языке вообще неясно, что тут происходит.
Мы записали фразу одной строкой на «точном и однозначном языке» и уже которую страницу пытаемся дешифровать, что же она означает. Это действительно эффективный способ траты сил? Ну если целью, конечно, было передать нам какое-то знание, а не потренировать нас в решении головоломок и не продемонстрировать нам все проблемы такого способа записи?
Ну ладно, предположим, что автор имел в виду, что он тут приводит свойство некой системы аксиом, а потому фраза означает «в этой системе аксиом верно, что из одного всегда следует другое».
Заметьте, про «всегда» в самой фразе ни слова, хотя «для всех икс» в это время фигурирует в явном виде.
∃ y (x ≠ y and y ≠ z) → ∀ x ∃ y (x ≠ y and y ≠ z)
- Левая часть содержит заранее заданные, хотя и не указанные константы «икс» и «зэт».
- Правая часть содержит заранее заданную, хотя и не указанную константу «зэт».
- Константы и переменные имеют один и тот же тип и сравниваются по значению.
- Это — утверждение о чём-то, что всегда выполняется в некоторой системе аксиом.
Мы предположили, что сравнение делается по значению, а не по ссылке, но тогда вопрос: «икс» и «зэт» — это в обязательном порядке разные значения, для коей цели автор и назвал их разными буквами, или же они просто независимые имена для констант, но по значению могут и совпадать?
Вроде как в явном виде об обязательном неравенстве значений ничего не сказано, однако сам по себе язык формальной логики не задаёт никаких правил однозначной трактовки сего, по коей причине часть авторов довольно часто подразумевают между строк, что разные буквы означают в обязательном порядке разные значения, хотя в каких-то других строках другого рассуждения даже они же сами, не говоря уже про других авторов, вполне могут допустить и возможность их равенства.
К подразумеванию неравенства разноимённых величин, вдобавок, склоняет и наличие в сложившейся традиции неких «совсем константных констант»: например, «π» практически во всех текстах будет означать одно и то же число, которое почти наверняка никогда не будет обозначено другой буквой. С другой стороны, ничто не мешает написать и «x = π», то есть допускается, что под разными буквами может скрываться одно и то же значение.
То есть этот язык записи вместо того чтобы сужать область возможных трактовок написанного и сокращать тем самым время на передачу информации, равно как вероятность ошибочного её понимания, наоборот, порождает необходимость обдумывания всех этих «побочных веток сюжета».
В языках программирования обычно однозначно определено: если мы меняем значение, лежащее по некоторой ссылке, то оно поменяется у всех переменных и констант, которые ссылаются на то же значение, поскольку, по сути, все они — один и тот же адрес в памяти, который в разных местах назвали разными именами. Чтобы их сделать независимыми, надо чтобы они указывали на разные адреса.
То есть при идентичности ссылок в двух переменных или константах гарантируется и равенство этих переменных или констант по значению.
Но это — единственная гарантия. В остальном же разноимённые или объявленные в разных блоках переменные или константы могут быть равны по ссылке, равны по значению, не равны по ссылке и не равны по значению (последнее, согласно единственной гарантии, может быть только при неравенстве ссылок).
То есть запись вида…
val z = (x == 0 && y == 0)
…говорит лишь о том, что «икс» и «игрек» можно сравнить с нулём, но ничего не говорит о том, что в них обязательно разные значения или ссылки на разные ячейки памяти: последнее надо всегда проверять отдельно в явном виде.
Да, во всём этом тоже могут быть подводные камни, возникшие из-за того, что в момент проектирования языка что-то недодумали, однако это всё-таки полагается багой, а не фичей, по коей причине в дальнейшем от этого стараются как-то избавиться.
Увы, в формальной логике такое не оговорено, поэтому, опять же, надо читать сопроводительный текст и/или пытаться вычислить ход мыслей автора по принципу «а иначе совсем ерунда получится».
Ну ладно, предположим, что тут автор всё-таки следовал более надёжному варианту и предполагал, что различность имён констант не гарантирует различности их значений.
∃ y (x ≠ y and y ≠ z) → ∀ x ∃ y (x ≠ y and y ≠ z)
А с «зэт» в левой и правой частях как? Это — одна и та же по значению константа или разные? Ну вот, икс, например, слева константа, а справа — переменная. Вдруг и с зэт так же?
Опять же, по самой фразе это узнать невозможно: «традиционный» язык записи формальной логики просто ничего об этом не говорит.
Наверно автор имеет в виду, что, хотя «игреки» и «иксы» разные, «зэт» — один и тот же. Я понимаю это, потому что так чаще всего бывает и потому что так фраза получается более осмысленной, но я не могу этого гарантировать — только предположить.
Заметьте, я не могу гарантировать не истинность фразы, а то, что моя трактовка оной совпадает с трактовкой оной тем, кто её написал. Видимо, на всякий случай, каждому читателю надо рассмотреть все комбинации предположений о трактовке — вдруг он не угадает, что именно предполагал автор.
Ну ладно, и по этому пункту тоже рассмотрим только один из вариантов, поскольку он выглядит для меня наиболее вероятным.
∃ y (x ≠ y and y ≠ z) → ∀ x ∃ y (x ≠ y and y ≠ z)
- Левая часть содержит заранее заданные, хотя и не указанные константы «икс» и «зэт».
- Правая часть содержит заранее заданную, хотя и не указанную константу «зэт».
- Константы и переменные имеют один и тот же тип и сравниваются по значению.
- Это — утверждение о чём-то, что всегда выполняется в некоторой системе аксиом.
- Значения «икс» и «зэт» могут совпадать, а могут не совпадать.
- «Зэт» в правой части — точно тот же заранее заданный «зэт», что и в левой.
Совместимость типов мы предположили ранее. Но ведь даже при совместимости типов у констант вполне может быть разный набор возможных значений. Тут про какие наборы возможных значений идёт речь? Они совпадают для «икс», «игрек» и «зэт»? Или только пересекаются? Наверно, как минимум, пересекаются — если уж делается проверка на неравенство, которая при полном несовпадении была бы бесполезной? Но язык этого снова никак не проясняет. Опять остаётся чисто по контексту и «иначе не было бы смысла».
Ладно, тут я уже не буду подробно про языки программирования, а то мы никогда не закончим. Скажу кратко: там и по этому пункту тоже правила однозначны. Но в формальной логике не так. И в математических её приложениях тоже рулит сопроводительный текст и попытки угадать.
Но можно ведь случайно и не угадать.
Например, мы предположили, что наборы возможных значений как минимум пересекаются. Но не исключено, что это — слишком сильное требование, и для непересекающихся наборов фраза всё равно верна. Однако заранее мне это просто неоткуда узнать: придётся закончить анализ трактовки и только после этого, возможно, станет ясно, верна ли вот эта гипотеза. Гипотеза, замечу, по поводу смысла уже написанного, а не по поводу какой-то закономерности, о которой в написанном идёт речь.
А пара «икс» и «зэт» имеется в виду какая угодно произвольная или это выполняется только для какой-то конкретной? Или тут вообще говорится о том, что «если для какой-то пары выполняется то, что слева, то из этого следует то, что справа»?
Опять же, тут снова можно было бы написать ещё одну страницу гаданий по традициям, осмысленности результатов и кофейной гуще.
Ну ладно, пусть будет, например, «если для какой-то пары выполняется».
∃ y (x ≠ y and y ≠ z) → ∀ x ∃ y (x ≠ y and y ≠ z)
- Левая часть содержит заранее заданные, хотя и не указанные константы «икс» и «зэт».
- Правая часть содержит заранее заданную, хотя и не указанную константу «зэт».
- Константы и переменные имеют один и тот же тип и сравниваются по значению.
- Это — утверждение о чём-то, что всегда выполняется в некоторой системе аксиом.
- Значения «икс» и «зэт» могут совпадать, а могут не совпадать.
- «Зэт» в правой части — точно тот же заранее заданный «зэт», что и в левой.
- Возможные значения «икс», «игрек» и «зэт» пересекаются.
- Имеется в виду, «если для какой-то пары выполняется то, что слева от стрелки, то выполняется и то, что справа».
Может показаться, будто бы я специально подобрал такой плохой пример, а «настоящий математик всё это записал бы точно и однозначно». Но нет, примерно такое же наблюдается и в лекциях, и в статьях, и в учебниках: вычислять истинный смысл написанного на формальном языке приходится по написанному в тексте на разговорном.
Да и в целом куча отдельных обязательных уточнений того, о чём тут говорится, смотрелась бы весьма странно. Ведь получалось бы, что, используя язык, который вроде бы нужен для сокращения записи и повышения её точности, мы вынуждены каждый раз отдельным текстом уточнять все использованные конструкции на этом языке.
Это как на естественном языке каждый раз говорить: «Я вчера съездил в город — тут я использовал прошедшее совершённое время, предлог, означающий направление, местоимение первого лица единственного числа и обстоятельство времени в форме наречия», — а то без этих разъяснений никто не поймёт сказанного.
Ну ладно, быть может, теперь, после стольких необходимых вычислений и предположений всего того, что наверно должно было бы быть записано прямым текстом на каком-то более удачном языке, нам всё-таки удастся выяснить, что же нам точно и однозначно пытались сказать?
Ну смотрите.
У нас заранее заданы какие-то две константы (возможно, равные между собой).
И мы смогли подобрать такое значение, которое не равно ни одной из констант.
После этого мы поменяли значение одной из констант на какое-то другое из возможных.
Так вот, по нашей системе аксиом мы всё равно всегда сможем подобрать ещё какое-то значение, которое не равно ни одной из этих констант.
Вот что написано в этом формально-логическом выражении.
Во сколько я уложился? В четыре строки?
Да. На длинном и неточном разговорном языке. И без специальных терминов.
Против одной короткой строки со странными символами и четырёх—пяти страниц очень неуверенных, но необходимых догадок о том, что предполагал автор на самом деле, когда писал это высказывание на «точном и однозначном» языке.
Причём догадки и предположения на четырёх страницах всё ещё не охватили всех возможных вариантов трактовки, не объяснили всей терминологии и не описали используемый язык.
Хм. А мы точно что-то там выгадали, когда пользовались этим «традиционным» формальным языком — разговорный-то, по ощущениям, оказался гораздо более подходящим? На нём вышло и в сумме короче, и с передачей смысла как-то надёжнее. И уж точно гораздо понятнее для любого жителя планеты. Возможно, есть способ записать ещё короче, надёжнее и понятнее, но явно не тот, который использован в исходном формальном выражении.
Подозреваю, начни я сразу с разговорного, объяснение мысли заняло бы минут пять максимум.
Да, выглядела бы эта мысль гораздо более тривиально и понять её смог бы наверно даже учащийся младших классов, а не только отдельные специалисты по матлогике, но нам шашечки или ехать?
Мы тут хотим потренировать людей разбираться в специально запутанных вещах и дешифровывать тексты на неудачных языках или донести до них какую-то полезную для чего-то там мысль, научить их анализу подобных мыслей, а ещё лучше их выведению? Для первого, конечно, подходит абсолютно любая головоломка, включая и вот такую, но для второго лучше было бы использовать язык попонятнее.
А в случае с музыкой у нас цель какая?
Нам надо научить людей дешифровке записанного триста лет назад?
Тогда, сто пудов, нам нужна «традиционная» запись.
Или мы хотим научить их известным на данный момент музыкальным закономерностям и наибыстрейшему способу записи и чтения музыки?
В этом случае, «традиционная» запись будет просто сжирать прорву времени безо всякой того компенсации.
Быть может, нам надо отсеять как можно больше желающих быть композиторами и музыкантами, а то их что-то и так слишком много?
Ну да, «традиционная» запись для этого отлично подходит — до первой своей мелодии дотянет только горстка самых упорных.
Или, наоборот, нам хотелось бы чтобы исполнять и сочинять музыку могли все желающие, если, в идеале, не вообще все?
В этом случае выбор определённо в пользу пианоролла: ведь с ним первая собственная мелодия у человека появится уже в первый вечер, что скорее всего стимулирует его продолжать, а не бросить сразу или отделаться от всего этого как можно быстрее, как в предыдущем случае.
Иными словами, если нам нужно и дальше поддерживать иллюзию того, что в математику, музыку и почти всё остальное могут только избранные, то сложные для изучения и использования языки давних времён при наличии гораздо более простых с даже большей выразительностью — правильный подход.
Если же нам нужны практические результаты от большинства людей, надо как-то уже собираться начать пытаться завязать с виртуальной отдачей виртуальной дани предкам путём использования исключительно тех языков, которыми пользовались они. Хотя бы в тех случаях, когда нам известны значительно более удачные способы записи.